180 lines
5.7 KiB
C++
180 lines
5.7 KiB
C++
// 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
|