STATREG.H

// 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