#ifdef _CONFIG_H
#error config.h included twice
#endif
#define _CONFIG_H
#include "..\inc\regkey.h"
typedef enum
{
kCompId_FedSrv, kCompId_Last } ComponentId;
typedef enum
{
kConfigType_SZ,
kConfigType_DWORD,
} ConfigItemType;
class ConfigItem
{
public:
ConfigItemType m_type; ZString m_zsName; ZString m_zsValue; };
typedef struct
{
char * pszKeyName;
ConfigItemType type;
int cb;
int nRequired; union {
DWORD dwDefault;
char * pszDefault;
};
} ConfigInfo;
typedef struct
{
ConfigInfo info;
BYTE * pBuf;
} ConfigInfoBuffer;
class ConfigReader
{
public:
ConfigReader(ComponentId compId) :
m_compId(compId)
{
}
virtual ~ConfigReader() {}
virtual BOOL ReadRg (const ConfigInfoBuffer *prgItems, int cItems);
virtual BOOL ReadRgRg (int cRepeat, const ConfigInfoBuffer *prgItems, int cItems); virtual BOOL ReadInt (const char *pszItem, int *pnVal, BOOL fRequired, int nDefault);
virtual BOOL ReadSz (const char *pszItem, char *psz, int cchMax, BOOL fRequired, const char *pszDefault);
virtual BOOL WriteInt (const char *pszItem, int nVal);
virtual BOOL WriteSz (const char *pszItem, const char *psz, int cch);
virtual BOOL DeleteItem(const char *pszItem) = 0;
protected:
ComponentId m_compId;
virtual BOOL Open() = 0;
virtual BOOL Close() = 0;
virtual BOOL FastReadInt (const char *pszItem, int *pnVal, BOOL fRequired, int nDefault) = 0;
virtual BOOL FastReadSz (const char *pszItem, char *psz, int cchMax, BOOL fRequired, const char *pszDefault) = 0;
virtual BOOL FastWriteInt(const char *pszItem, int nVal) = 0;
virtual BOOL FastWriteSz (const char *pszItem, const char *psz, int cch) = 0;
};
class RegConfigReader : public ConfigReader
{
public:
RegConfigReader(ComponentId compId) :
ConfigReader(compId),
m_hk(NULL)
{
CompIdToKey();
}
virtual ~RegConfigReader()
{
}
virtual BOOL DeleteItem(const char *pszItem);
protected:
virtual BOOL Open();
virtual BOOL Close();
virtual BOOL FastReadInt (const char *pszItem, int *pnVal, BOOL fRequired, int nDefault);
virtual BOOL FastReadSz (const char *pszItem, char *psz, int cchMax, BOOL fRequired, const char *pszDefault);
virtual BOOL FastWriteInt(const char *pszItem, int nVal);
virtual BOOL FastWriteSz (const char *pszItem, const char *psz, int cch);
private:
BOOL CompIdToKey();
char m_szKey[255];
HKEY m_hk;
};
ConfigReader * CreateConfigReader (ComponentId compId);
RegConfigReader *CreateRegConfigReader(ComponentId compId);
class Config
{
public:
Config(ComponentId compId) : m_compId(compId), m_pArgs(NULL), m_nArgs(0), m_pConfigInfo(NULL) {}
virtual ~Config() { KillArgs(); }
BOOL Init(const ConfigInfo *pConfigInfo, int cItems, BOOL fRange, int cRange);
BOOL GetDWORDArg(DWORD nArg, DWORD *pdw, int nRange); BOOL GetStringArg(DWORD nArg, char *pszBuf, int cchBuf, int nRange); ConfigInfo *GetConfigInfo(int *pcConfig);
inline ComponentId GetComponentId() const { return m_compId; }
private:
ComponentId m_compId;
BOOL m_fRange; BOOL m_cRange;
typedef struct
{
ConfigItemType type;
DWORD cb;
union {
DWORD dwVal; char *pszVal; DWORD *pdwVal; };
} ARGS;
ARGS *m_pArgs;
DWORD m_nArgs;
ConfigInfoBuffer *m_pConfigInfo;
void KillArgs();
};
class ConfigCache
{
public:
ConfigCache()
{
m_pcsEditList = new CriticalSection;
ZeroMemory(&m_rgpConfigList, sizeof(m_rgpConfigList));
}
virtual ~ConfigCache()
{
DeleteConfigList();
delete m_pcsEditList;
}
Config * FindConfig(ComponentId compId);
void AddConfig(Config *pConfig);
Config * ReplaceConfig(ComponentId compId, Config *pConfig);
void AddConfigToTail(Config *pConfig);
Config * RemoveHead(ComponentId compId);
Config * RemoveHeadIfOld(ComponentId compId, DWORD dwDeltaOld);
private:
typedef struct tag_CONFIG_LIST
{
Config * pConfig;
DWORD dwTimeAdded;
struct tag_CONFIG_LIST *pNext;
} CONFIG_LIST;
CONFIG_LIST * m_rgpConfigList[kCompId_Last];
CriticalSection *m_pcsEditList; void DeleteConfigList();
};
class ConfigManager
{
public:
ConfigManager() : m_hevtDie(NULL), m_hthrGarbageCollect(NULL), m_pcsAdd(NULL) {}
virtual ~ConfigManager();
BOOL Init();
BOOL LoadConfig (ComponentId compId, const ConfigInfo *pInfo, int cInfo);
BOOL ReloadConfig (ComponentId compId);
BOOL IsConfigLoaded (ComponentId compId);
BOOL GetConfigDWORD (ComponentId compId, DWORD nArg, DWORD *pdw);
BOOL GetConfigString (ComponentId compId, DWORD nArg, char *pszBuf, int cchBuf);
virtual void GarbageCollectThread();
private:
ConfigCache m_cacheComponent; ConfigCache m_cacheGarbage; CriticalSection * m_pcsAdd; HANDLE m_hevtDie; HANDLE m_hthrGarbageCollect; static int CALLBACK GarbageCollectThreadThunk(ConfigManager *pMgr)
{
ZAssert(pMgr);
pMgr->GarbageCollectThread();
return 0;
}
};