/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: MCP_config.h Abstract: This file contains the declaration of the .... Revision History: Davide Massarenti (Dmassare) 01/09/2000 created ******************************************************************************/ #if !defined(__INCLUDED___MPC___CONFIG_H___) #define __INCLUDED___MPC___CONFIG_H___ #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// #define DECLARE_CONFIG_MAP(x) \ typedef x _ConfigMapClass; \ static const MPC::Config::DefinitionOfTag _cfg_tag;\ static const MPC::Config::DefinitionOfTag* _cfg_table_tags[];\ static const MPC::Config::DefinitionOfAttribute _cfg_table_attributes[]; #define DEFINE_CONFIG_DEFAULTTAG() static const MPC::Config::DefinitionOfTag* GetDefTag() { return &_cfg_tag; } #define DECLARE_CONFIG_METHODS() \ LPCWSTR GetTag() const;\ void* GetOffset( size_t offset ) const;\ HRESULT CreateInstance( const MPC::Config::DefinitionOfTag* tag, MPC::Config::TypeConstructor*& defSubType );\ HRESULT LoadNode( IXMLDOMNode* xdn );\ HRESULT SaveNode( IXMLDOMNode* xdn ) const; //////////////////// #define CFG_OFFSET(x) offsetof(_ConfigMapClass, x) #define CFG_BEGIN_FIELDS_MAP(x) const MPC::Config::DefinitionOfAttribute x::_cfg_table_attributes[] = { #define CFG_VALUE(type,y) { MPC::Config::XT_value , NULL, MPC::Config::MT_##type , CFG_OFFSET(y), false, 0 , NULL } #define CFG_ATTRIBUTE(name,type,y) { MPC::Config::XT_attribute, name, MPC::Config::MT_##type , CFG_OFFSET(y), false, 0 , NULL } #define CFG_ELEMENT(name,type,y) { MPC::Config::XT_element , name, MPC::Config::MT_##type , CFG_OFFSET(y), false, 0 , NULL } #define CFG_VALUE__TRISTATE(type,y,flag) { MPC::Config::XT_value , NULL, MPC::Config::MT_##type , CFG_OFFSET(y), true , CFG_OFFSET(flag), NULL } #define CFG_ATTRIBUTE__TRISTATE(name,type,y,flag) { MPC::Config::XT_attribute, name, MPC::Config::MT_##type , CFG_OFFSET(y), true , CFG_OFFSET(flag), NULL } #define CFG_ELEMENT__TRISTATE(name,type,y,flag) { MPC::Config::XT_element , name, MPC::Config::MT_##type , CFG_OFFSET(y), true , CFG_OFFSET(flag), NULL } #define CFG_VALUE__BITFIELD(y,lookup) { MPC::Config::XT_value , NULL, MPC::Config::MT_bitfield, CFG_OFFSET(y), false, 0 , lookup } #define CFG_ATTRIBUTE__BITFIELD(name,y,lookup) { MPC::Config::XT_attribute, name, MPC::Config::MT_bitfield, CFG_OFFSET(y), false, 0 , lookup } #define CFG_ELEMENT__BITFIELD(name,y,lookup) { MPC::Config::XT_element , name, MPC::Config::MT_bitfield, CFG_OFFSET(y), false, 0 , lookup } #define CFG_END_FIELDS_MAP() { MPC::Config::XT_invalid } }; //////////////////// #define CFG_BEGIN_CHILD_MAP(x) const MPC::Config::DefinitionOfTag* x::_cfg_table_tags[] = { #define CFG_CHILD(y) y::GetDefTag(), #define CFG_END_CHILD_MAP() NULL }; //////////////////// #define DEFINE_CFG_OBJECT(x,tag) const MPC::Config::DefinitionOfTag x::_cfg_tag = { tag, _cfg_table_tags, _cfg_table_attributes }; //////////////////////////////////////////////////////////////////////////////// #define DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(x,tag,defSubType) \ \ LPCWSTR x::GetTag() const { return _cfg_tag.m_szTag; } \ \ void* x::GetOffset( size_t offset ) const { return (void*)((BYTE*)this + offset); } \ \ HRESULT x::CreateInstance( const MPC::Config::DefinitionOfTag* tag, MPC::Config::TypeConstructor*& defSubType ) \ { \ HRESULT hr; #define DEFINE_CONFIG_METHODS_SAVENODE_SECTION(x, xdn) \ \ return E_FAIL; \ } \ \ HRESULT x::LoadNode( IXMLDOMNode* xdn ) \ { \ return MPC::Config::LoadNode( this, &_cfg_tag, xdn ); \ } \ \ HRESULT x::SaveNode( IXMLDOMNode* xdn ) const \ { \ HRESULT hr; \ \ if(SUCCEEDED(hr = MPC::Config::SaveNode( this, &_cfg_tag, xdn ))) \ { #define DEFINE_CONFIG_METHODS_END(x) \ } \ \ return hr; \ } //////////////////////////////////////////////////////////////////////////////// #define DEFINE_CONFIG_METHODS__NOCHILD(x) \ \ DEFINE_CONFIG_METHODS_CREATEINSTANCE_SECTION(x,tag,defSubType) \ DEFINE_CONFIG_METHODS_SAVENODE_SECTION(x,xdn) \ DEFINE_CONFIG_METHODS_END(x) //////////////////////////////////////////////////////////////////////////////// namespace MPC { namespace Config { typedef enum { XT_invalid , XT_attribute, // Means attribute of the current element. XT_value , // Means value of the current element XT_element , // Means sub-element. } XMLTypes; typedef enum { MT_bool , MT_BOOL , MT_VARIANT_BOOL, MT_int , MT_long , MT_DWORD , MT_float , MT_double , MT_DATE , MT_DATE_US , MT_DATE_CIM , MT_CHAR , MT_WCHAR , MT_BSTR , MT_string , MT_wstring , MT_bitfield } MemberTypes; //////////////////////////////////////// struct TypeConstructor; // The class you have to inherit from in order to load/save your state. struct DefinitionOfTag; // Definition of objects. struct DefinitionOfAttribute; // Definition of member variables. //////////////////////////////////////// struct TypeConstructor { virtual LPCWSTR GetTag() const = 0; virtual void* GetOffset( size_t offset ) const = 0; virtual HRESULT CreateInstance( const DefinitionOfTag* tag, TypeConstructor*& defSubType ) = 0; virtual HRESULT LoadNode ( IXMLDOMNode* xdn ) = 0; virtual HRESULT SaveNode ( IXMLDOMNode* xdn ) const = 0; }; struct DefinitionOfAttribute { XMLTypes m_xt; LPCWSTR m_szName; MemberTypes m_mtType; size_t m_offset; bool m_fPresenceFlag; size_t m_offsetPresence; const StringToBitField* m_Lookup; }; struct DefinitionOfTag { LPCWSTR m_szTag; const DefinitionOfTag** m_tblSubTags; const DefinitionOfAttribute* m_tblAttributes; const DefinitionOfTag* FindSubTag ( /*[in]*/ LPCWSTR szTag ) const; const DefinitionOfAttribute* FindAttribute( /*[in]*/ XMLTypes xt, /*[in]*/ LPCWSTR szName ) const; }; //////////////////////////////////////// void ClearValue( /*[in]*/ TypeConstructor* defType, /*[in]*/ const DefinitionOfAttribute* defField ); HRESULT LoadValue ( /*[in]*/ TypeConstructor* defType, /*[in]*/ const DefinitionOfAttribute* defField, /*[in/out]*/ CComVariant& value, /*[in] */ bool fFound ); HRESULT SaveValue ( /*[in]*/ const TypeConstructor* defType, /*[in]*/ const DefinitionOfAttribute* defField, /*[out ]*/ CComVariant& value, /*[out]*/ bool& fFound ); HRESULT LoadNode ( /*[in]*/ TypeConstructor* defType, /*[in]*/ const DefinitionOfTag* defTag, /*[in]*/ IXMLDOMNode* xdn ); HRESULT SaveNode ( /*[in]*/ const TypeConstructor* defType, /*[in]*/ const DefinitionOfTag* defTag, /*[in]*/ IXMLDOMNode* xdn ); HRESULT SaveSubNode( /*[in]*/ const TypeConstructor* defType, /*[in]*/ IXMLDOMNode* xdn ); HRESULT LoadXmlUtil( /*[in]*/ TypeConstructor* defType, /*[in ]*/ MPC::XmlUtil& xml ); HRESULT SaveXmlUtil( /*[in]*/ const TypeConstructor* defType, /*[out]*/ MPC::XmlUtil& xml ); HRESULT LoadStream( /*[in]*/ TypeConstructor* defType, /*[in ]*/ IStream* pStream ); HRESULT SaveStream( /*[in]*/ const TypeConstructor* defType, /*[out]*/ IStream* *ppStream ); HRESULT LoadFile( /*[in]*/ TypeConstructor* defType, /*[in]*/ LPCWSTR szFile ); HRESULT SaveFile( /*[in]*/ const TypeConstructor* defType, /*[in]*/ LPCWSTR szFile ); //////////////////////////////////////// template HRESULT SaveList( /*[in]*/ Container& cnt, /*[in]*/ IXMLDOMNode* xdn ) { HRESULT hr = S_OK; for(Container::const_iterator it=cnt.begin(); it != cnt.end(); it++) { if(FAILED(hr = MPC::Config::SaveSubNode( &(*it), xdn ))) break; } return hr; } }; // namespace Config }; // namespace MPC ///////////////////////////////////////////////////////////////////////// #endif // !defined(__INCLUDED___MPC___CONFIG_H___)