/////////////////////////////////////////////////////////////////////////// // // Copyright(C) 1998-1999 Microsoft Corporation all rights reserved. // // Module: regpropertybag.h // // Project: Chameleon // // Description: Registry property bag class definition // // Author: TLP // // When Who What // ---- --- ---- // 12/3/98 TLP Original version // /////////////////////////////////////////////////////////////////////////// #ifndef __INC_REG_PROPERTY_BAG_H_ #define __INC_REG_PROPERTY_BAG_H_ #include "basedefs.h" #include "propertybag.h" #include "propertybagfactory.h" #include #include #pragma warning( disable : 4786 ) // template produced long name warning #include #include using namespace std; /////////////////////////////////////////////////////////////////////////// class CRegError { public: CRegError() { } ~CRegError() { } }; /////////////////////////////////////////////////////////////////////////// class CRegInfo { public: /////////////////////////////////////////////////////////////////////////// CRegInfo(bool& bOK, HKEY hKey) : m_dwSubKeys(0), m_dwValues(0), m_dwMaxSubKeyName(0), m_pSubKeyName(NULL), m_dwMaxValueName(0), m_pValueName(NULL), m_dwMaxValueData(0), m_pValueData(NULL) { bOK = false; LONG lResult = RegQueryInfoKey( hKey, // handle to key to query NULL, // address of buffer for class string NULL, // address of size of class string buffer NULL, // reserved &m_dwSubKeys, // address of buffer for number of subkeys &m_dwMaxSubKeyName, // address of buffer for longest subkey name length NULL, // address of buffer for longest class string length &m_dwValues, // address of buffer for number of value entries &m_dwMaxValueName, // address of buffer for longest value name length &m_dwMaxValueData, // address of buffer for longest value data length NULL, // address of buffer for security descriptor length NULL // address of buffer for last write time ); if ( ERROR_SUCCESS == lResult ) { m_dwMaxSubKeyName++; m_dwMaxValueName++; auto_ptr pSubKey (new TCHAR[m_dwMaxSubKeyName]); auto_ptr pValueName (new TCHAR[m_dwMaxValueName]); m_pValueData = new BYTE[m_dwMaxValueData + 2]; m_pSubKeyName = pSubKey.release(); m_pValueName = pValueName.release(); bOK = true; } } /////////////////////////////////////////////////////////////////////////// ~CRegInfo() { if ( m_pSubKeyName ) delete [] m_pSubKeyName; if ( m_pValueName ) delete [] m_pValueName; if ( m_pValueData ) delete [] m_pValueData; } /////////////////////////////////////////////////////////////////////////// DWORD m_dwSubKeys; DWORD m_dwValues; DWORD m_dwMaxSubKeyName; TCHAR* m_pSubKeyName; DWORD m_dwMaxValueName; TCHAR* m_pValueName; DWORD m_dwMaxValueData; BYTE* m_pValueData; private: CRegInfo(); CRegInfo(const CRegInfo& rhs); CRegInfo& operator = (CRegInfo& rhs); }; typedef map PropertyMap; typedef PropertyMap::iterator PropertyMapIterator; /////////////////////////////////////////////////////////////////////////// class CRegPropertyBag : public CPropertyBag { public: ~CRegPropertyBag(); // CPropertyBag interface functions (see propertybag.h) bool open(void); void close(void); void getLocation(CLocationInfo& location); LPCWSTR getName(void); bool load(void); bool save(void); bool IsContainer(void); PPROPERTYBAGCONTAINER getContainer(void); bool IsProperty(LPCWSTR pszPropertyName); bool get(LPCWSTR pszPropertyName, VARIANT* pValue); bool put(LPCWSTR pszPropertyName, VARIANT* pValue); bool reset(void); DWORD getMaxPropertyName(void); bool current(LPWSTR pszPropertyName, VARIANT* pValue); bool next(void); private: // Only the property bag factory can create a reg property bag friend PPROPERTYBAG MakePropertyBag( /*[in]*/ PROPERTY_BAG_TYPE eType, /*[in]*/ CLocationInfo& location ); CRegPropertyBag(CLocationInfo& location); // No copy or assignment CRegPropertyBag(const CRegPropertyBag& rhs); CRegPropertyBag& operator = (CRegPropertyBag& rhs); ////////////////////////////////////////////////////////////////////////// PropertyMapIterator MyFind(LPCWSTR pszPropertyName); ////////////////////////////////////////////////////////////////////////// bool IsSupportedType(VARTYPE vt); ////////////////////////////////////////////////////////////////////////// VARTYPE getTypeFromBuffer( /*[in]*/ DWORD dwBuffSize, /*[in]*/ PBYTE pBuff ); ////////////////////////////////////////////////////////////////////////// HKEY getKey(void) const { return m_key.m_hKey; } ////////////////////////////////////////////////////////////////////////// void releaseProperties(void); ////////////////////////////////////////////////////////////////////////// bool m_isContainer; DWORD m_maxPropertyName; CLocationInfo m_locationInfo; CRegKey m_key; wstring m_name; PropertyMapIterator m_current; PropertyMap m_properties; }; typedef CMasterPtr MPREGPROPERTYBAG; /////////////////////////////////////////////////////////////////////////// class CRegPropertyBagContainer : public CPropertyBagContainer { public: ~CRegPropertyBagContainer(); // CPropertyBagContainer interface functions (see propertybag.h) // bool open(void); void close(void); void getLocation(CLocationInfo& locationInfo); LPCWSTR getName(void); DWORD count(void); PPROPERTYBAG add(LPCWSTR pszName); bool remove(LPCWSTR pszName); PPROPERTYBAG find(LPCWSTR pszName); PPROPERTYBAG current(void); bool reset(void); bool next(void); private: // Only the property bag factory can create a reg property bag container friend PPROPERTYBAGCONTAINER MakePropertyBagContainer( /*[in]*/ PROPERTY_BAG_TYPE eType, /*[in]*/ CLocationInfo& locationInfo ); CRegPropertyBagContainer(CLocationInfo& locationInfo); // No copy or assignment CRegPropertyBagContainer(const CRegPropertyBagContainer& rhs); CRegPropertyBagContainer& operator = (CRegPropertyBagContainer& rhs); ////////////////////////////////////////////////////////////////////////// HKEY getKey(void) const { return m_key.m_hKey; } ////////////////////////////////////////////////////////////////////////// PPROPERTYBAG addBag(LPCWSTR pszName); ////////////////////////////////////////////////////////////////////////// void releaseBags(void); typedef map< wstring, PPROPERTYBAG > BagMap; typedef BagMap::iterator BagMapIterator; CLocationInfo m_locationInfo; CRegKey m_key; wstring m_name; BagMapIterator m_current; BagMap m_bags; }; typedef CMasterPtr MPREGPROPERTYBAGCONTAINER; #endif // __INC_REG_PROPERTY_BAG_H_