// This is a part of the Active Template Library. // Copyright (C) 1996-1997 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Active Template Library Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Active Template Library product. #ifndef __STATREG_H #define __STATREG_H #define E_ATL_REGISTRAR_DESC 0x0201 #define E_ATL_NOT_IN_MAP 0x0202 #define E_ATL_UNEXPECTED_EOS 0x0203 #define E_ATL_VALUE_SET_FAILED 0x0204 #define E_ATL_RECURSE_DELETE_FAILED 0x0205 #define E_ATL_EXPECTING_EQUAL 0x0206 #define E_ATL_CREATE_KEY_FAILED 0x0207 #define E_ATL_DELETE_KEY_FAILED 0x0208 #define E_ATL_OPEN_KEY_FAILED 0x0209 #define E_ATL_CLOSE_KEY_FAILED 0x020A #define E_ATL_UNABLE_TO_COERCE 0x020B #define E_ATL_BAD_HKEY 0x020C #define E_ATL_MISSING_OPENKEY_TOKEN 0x020D #define E_ATL_CONVERT_FAILED 0x020E #define E_ATL_TYPE_NOT_SUPPORTED 0x020F #define E_ATL_COULD_NOT_CONCAT 0x0210 #define E_ATL_COMPOUND_KEY 0x0211 #define E_ATL_INVALID_MAPKEY 0x0212 #define E_ATL_UNSUPPORTED_VT 0x0213 #define E_ATL_VALUE_GET_FAILED 0x0214 #define E_ATL_VALUE_TOO_LARGE 0x0215 #define E_ATL_MISSING_VALUE_DELIMETER 0x0216 #define E_ATL_DATA_NOT_BYTE_ALIGNED 0x0217 #ifndef ATL_NO_NAMESPACE namespace ATL { #endif const TCHAR chSemiColon = _T(';'); const TCHAR chDirSep = _T('\\'); const TCHAR chEscape = _T('\\'); const TCHAR chComma = _T(','); const TCHAR chDelete = _T('~'); const TCHAR chEOS = _T('\0'); const TCHAR chTab = _T('\t'); const TCHAR chLF = _T('\n'); const TCHAR chCR = _T('\r'); const TCHAR chSpace = _T(' '); const TCHAR chRightBracket = _T('}'); const TCHAR chLeftBracket = _T('{'); const TCHAR chVarLead = _T('%'); const TCHAR chQuote = _T('\''); const TCHAR chEquals = _T('='); //const LPCTSTR szRightBracket = _T("}"); //const LPCTSTR szLeftBracket = _T("{"); //const LPCTSTR szEquals = _T("="); //const LPCTSTR szDirSep = _T("\\"); const LPCTSTR szStringVal = _T("S"); const LPCTSTR szDwordVal = _T("D"); const LPCTSTR szBinaryVal = _T("B"); const LPCTSTR szValToken = _T("Val"); const LPCTSTR szForceRemove = _T("ForceRemove"); const LPCTSTR szNoRemove = _T("NoRemove"); const LPCTSTR szDelete = _T("Delete"); struct EXPANDER { LPOLESTR szKey; LPOLESTR szValue; }; class CExpansionVector { public: CExpansionVector() { m_cEls = 0; m_nSize=10; m_p=(EXPANDER**)malloc(m_nSize*sizeof(EXPANDER*)); } HRESULT Add(LPCOLESTR lpszKey, LPCOLESTR lpszValue); LPCOLESTR Find(LPTSTR lpszKey); HRESULT ClearReplacements(); private: EXPANDER** m_p; int m_cEls; int m_nSize; }; #if defined(_ATL_DLL) | defined(_ATL_DLL_IMPL) class ATL_NO_VTABLE CRegObject : public IRegistrar #else class CRegObject #endif { public: ~CRegObject(){ClearReplacements();} HRESULT FinalConstruct() {return S_OK;} void FinalRelease() {} // Map based methods HRESULT STDMETHODCALLTYPE AddReplacement(LPCOLESTR lpszKey, LPCOLESTR lpszItem); HRESULT STDMETHODCALLTYPE ClearReplacements(); LPCOLESTR StrFromMap(LPTSTR lpszKey); // Register via a given mechanism HRESULT STDMETHODCALLTYPE ResourceRegister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType); HRESULT STDMETHODCALLTYPE ResourceRegisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType); HRESULT STDMETHODCALLTYPE ResourceUnregister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType); HRESULT STDMETHODCALLTYPE ResourceUnregisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType); HRESULT STDMETHODCALLTYPE FileRegister(LPCOLESTR pszFileName); HRESULT STDMETHODCALLTYPE FileUnregister(LPCOLESTR pszFileName); HRESULT STDMETHODCALLTYPE StringRegister(LPCOLESTR pszData); HRESULT STDMETHODCALLTYPE StringUnregister(LPCOLESTR pszData); protected: HRESULT MemMapAndRegister(LPCOLESTR pszFileName, BOOL bRegister); HRESULT RegisterFromResource(LPCOLESTR pszFileName, LPCTSTR pszID, LPCTSTR pszType, BOOL bRegister); HRESULT RegisterWithString(LPCOLESTR pszData, BOOL bRegister); static HRESULT GenerateError(UINT nID); CExpansionVector m_RepMap; CComObjectThreadModel::AutoCriticalSection m_csMap; }; class CRegParser { public: CRegParser(CRegObject* pRegObj); HRESULT PreProcessBuffer(LPTSTR lpszReg, LPTSTR* ppszReg); HRESULT RegisterBuffer(LPTSTR szReg, BOOL bRegister); protected: void SkipWhiteSpace(); HRESULT NextToken(LPTSTR szToken); HRESULT AddValue(CRegKey& rkParent,LPCTSTR szValueName, LPTSTR szToken); BOOL CanForceRemoveKey(LPCTSTR szKey); BOOL HasSubKeys(HKEY hkey); BOOL HasValues(HKEY hkey); HRESULT RegisterSubkeys(HKEY hkParent, BOOL bRegister, BOOL bInRecovery = FALSE); BOOL IsSpace(TCHAR ch); void IncrementLinePos(); void IncrementLineCount(){m_cLines++;} LPTSTR m_pchCur; int m_cLines; CRegObject* m_pRegObj; HRESULT GenerateError(UINT nID); HRESULT HandleReplacements(LPTSTR& szToken); HRESULT SkipAssignment(LPTSTR szToken); BOOL EndOfVar() { return chQuote == *m_pchCur && chQuote != *CharNext(m_pchCur); } }; #ifndef ATL_NO_NAMESPACE }; //namespace ATL #endif #endif //__STATREG_H