/* Copyright (c) Microsoft Corporation All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. */ #pragma once /* these are all the tag types used in the old Dryad: almost all of them will turn up as DrMTagUnknown, but individual types can be added as desired */ DRENUM(DrMTagType) { DrMTT_Unknown, DrMTT_Boolean, DrMTT_Int16, DrMTT_Int32, DrMTT_Int64, DrMTT_UInt16, DrMTT_UInt32, DrMTT_UInt64, DrMTT_HexUInt16, DrMTT_HexUInt32, DrMTT_HexUInt64, DrMTT_String, DrMTT_Guid, DrMTT_TimeStamp, DrMTT_TimeInterval, DrMTT_BeginTag, DrMTT_EndTag, DrMTT_HRESULT, DrMTT_ExitCode, DrMTT_Blob, DrMTT_EnvironmentBlock, DrMTT_PropertyList, DrMTT_TagIdValue, DrMTT_AppendExtentOptions, DrMTT_SyncOptions, DrMTT_SyncDirectiveOptions, DrMTT_ReadExtentOptions, DrMTT_AppendStreamOptions, DrMTT_EnumDirectoryOptions, DrMTT_EnInfoBits, DrMTT_UpdateExtentMetadataOptions, DrMTT_StreamInfoBits, DrMTT_ExtentInfoBits, DrMTT_ExtentInstanceInfoBits, DrMTT_MetaData = 0x1000, DrMTT_InputChannelDescription, DrMTT_OutputChannelDescription, DrMTT_VertexProcessStatus, DrMTT_VertexStatus, DrMTT_VertexCommandBlock, DrMTT_Void, DrMTT_VertexCommand }; DRDECLARECLASS(DrMTag); DRREF(DrMTag); DRBASECLASS(DrMTag abstract), public DrPropertyParser { public: /* this returns a typed DrMTag. Almost all types just give DrMTagUnknown */ static DrMTagRef MakeTyped(UINT16 tag, UINT16 type); UINT16 GetMTag(); UINT16 GetMType(); virtual void Serialize(DrPropertyWriterPtr writer) = 0; virtual HRESULT ParseProperty(DrPropertyReaderPtr reader, UINT16 tag, UINT32 dataLen) = 0; protected: DrMTag(UINT16 tag, UINT16 type); virtual ~DrMTag(); private: UINT16 m_tag; UINT16 m_type; }; DRCLASS(DrMTagUnknown) : public DrMTag { public: DrMTagUnknown(UINT16 tag, UINT16 originalType); void SetData(DrByteArrayPtr data); DrByteArrayPtr GetData(); UINT16 GetOriginalType(); virtual HRESULT ParseProperty(DrPropertyReaderPtr reader, UINT16 tag, UINT32 dataLen) DROVERRIDE; virtual void Serialize(DrPropertyWriterPtr writer) DROVERRIDE; private: DrByteArrayRef m_data; UINT16 m_originalType; }; DRREF(DrMTagUnknown); DRCLASS(DrMTagVoid) : public DrMTag { public: DrMTagVoid(UINT16 tag); virtual HRESULT ParseProperty(DrPropertyReaderPtr reader, UINT16 tag, UINT32 dataLen) DROVERRIDE; virtual void Serialize(DrPropertyWriterPtr writer) DROVERRIDE; }; DRREF(DrMTagVoid); template DRCLASS(DrMTagBase) : public DrMTag { public: DrMTagBase(UINT16 tag) : DrMTag(tag, _type) { } DrMTagBase(UINT16 tag, T value) : DrMTag(tag, _type) { m_value = value; } void SetValue(T value) { m_value = value; } T GetValue() { return m_value; } virtual HRESULT ParseProperty(DrPropertyReaderPtr reader, UINT16 tag, UINT32 /* unused dataLen*/) DROVERRIDE { DrAssert(tag == GetMTag()); return reader->ReadNextProperty(tag, m_value); } virtual void Serialize(DrPropertyWriterPtr writer) DROVERRIDE { writer->WriteProperty(GetMTag(), m_value); } private: T m_value; }; typedef DrMTagBase DrMTagInt16; DRTEMPLATE DrMTagBase; DRREF(DrMTagInt16); typedef DrMTagBase DrMTagInt32; DRTEMPLATE DrMTagBase; DRREF(DrMTagInt32); typedef DrMTagBase DrMTagInt64; DRTEMPLATE DrMTagBase; DRREF(DrMTagInt64); typedef DrMTagBase DrMTagUInt16; DRTEMPLATE DrMTagBase; DRREF(DrMTagUInt16); typedef DrMTagBase DrMTagUInt32; DRTEMPLATE DrMTagBase; DRREF(DrMTagUInt32); typedef DrMTagBase DrMTagUInt64; DRTEMPLATE DrMTagBase; DRREF(DrMTagUInt64); typedef DrMTagBase DrMTagHRESULT; DRTEMPLATE DrMTagBase; DRREF(DrMTagHRESULT); typedef DrMTagBase DrMTagString; DRTEMPLATE DrMTagBase; DRREF(DrMTagString); typedef DrArrayList DrMTagList; DRAREF(DrMTagList,DrMTagRef);