restructured CConfig

This commit is contained in:
oy 2020-01-30 18:19:47 +01:00
parent 54625ebfbc
commit de5859b371
2 changed files with 127 additions and 115 deletions

View file

@ -9,29 +9,8 @@
CConfiguration g_Config; CConfiguration g_Config;
class CConfig : public IConfig void EscapeParam(char *pDst, const char *pSrc, int size)
{ {
IStorage *m_pStorage;
IConsole *m_pConsole;
IOHANDLE m_ConfigFile;
int m_FlagMask;
struct CCallback
{
SAVECALLBACKFUNC m_pfnFunc;
void *m_pUserData;
};
enum
{
MAX_CALLBACKS = 16
};
CCallback m_aCallbacks[MAX_CALLBACKS];
int m_NumCallbacks;
void EscapeParam(char *pDst, const char *pSrc, int size)
{
for(int i = 0; *pSrc && i < size - 1; ++i) for(int i = 0; *pSrc && i < size - 1; ++i)
{ {
if(*pSrc == '"' || *pSrc == '\\') // escape \ and " if(*pSrc == '"' || *pSrc == '\\') // escape \ and "
@ -39,10 +18,10 @@ class CConfig : public IConfig
*pDst++ = *pSrc++; *pDst++ = *pSrc++;
} }
*pDst = 0; *pDst = 0;
} }
static void Con_SaveConfig(IConsole::IResult *pResult, void *pUserData) static void Con_SaveConfig(IConsole::IResult *pResult, void *pUserData)
{ {
char aFilename[128]; char aFilename[128];
if(pResult->NumArguments()) if(pResult->NumArguments())
str_format(aFilename, sizeof(aFilename), "configs/%s.cfg", pResult->GetString(0)); str_format(aFilename, sizeof(aFilename), "configs/%s.cfg", pResult->GetString(0));
@ -53,21 +32,19 @@ class CConfig : public IConfig
str_format(aFilename, sizeof(aFilename), "configs/config_%s.cfg", aDate); str_format(aFilename, sizeof(aFilename), "configs/config_%s.cfg", aDate);
} }
((CConfig*)pUserData)->Save(aFilename); ((CConfig*)pUserData)->Save(aFilename);
} }
public: CConfig::CConfig()
{
CConfig()
{
m_pStorage = 0; m_pStorage = 0;
m_pConsole = 0; m_pConsole = 0;
m_ConfigFile = 0; m_ConfigFile = 0;
m_FlagMask = 0; m_FlagMask = 0;
m_NumCallbacks = 0; m_NumCallbacks = 0;
} }
virtual void Init(int FlagMask) void CConfig::Init(int FlagMask)
{ {
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_FlagMask = FlagMask; m_FlagMask = FlagMask;
@ -75,10 +52,10 @@ public:
if(m_pConsole) if(m_pConsole)
m_pConsole->Register("save_config", "?s", CFGFLAG_SERVER|CFGFLAG_CLIENT|CFGFLAG_STORE, Con_SaveConfig, this, "Save config to file"); m_pConsole->Register("save_config", "?s", CFGFLAG_SERVER|CFGFLAG_CLIENT|CFGFLAG_STORE, Con_SaveConfig, this, "Save config to file");
} }
virtual void Reset() void CConfig::Reset()
{ {
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) g_Config.m_##Name = def; #define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) g_Config.m_##Name = def;
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) str_copy(g_Config.m_##Name, def, len); #define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) str_copy(g_Config.m_##Name, def, len);
@ -86,10 +63,10 @@ public:
#undef MACRO_CONFIG_INT #undef MACRO_CONFIG_INT
#undef MACRO_CONFIG_STR #undef MACRO_CONFIG_STR
} }
virtual void RestoreStrings() void CConfig::RestoreStrings()
{ {
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) // nop #define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) // nop
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if(!g_Config.m_##Name[0] && def[0]) str_copy(g_Config.m_##Name, def, len); #define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if(!g_Config.m_##Name[0] && def[0]) str_copy(g_Config.m_##Name, def, len);
@ -97,10 +74,10 @@ public:
#undef MACRO_CONFIG_INT #undef MACRO_CONFIG_INT
#undef MACRO_CONFIG_STR #undef MACRO_CONFIG_STR
} }
virtual void Save(const char *pFilename) void CConfig::Save(const char *pFilename)
{ {
if(!m_pStorage) if(!m_pStorage)
return; return;
@ -135,23 +112,23 @@ public:
str_format(aBuf, sizeof(aBuf), "saved config to '%s'", pFilename); str_format(aBuf, sizeof(aBuf), "saved config to '%s'", pFilename);
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf); m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf);
} }
} }
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) void CConfig::RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData)
{ {
dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks"); dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks");
m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc; m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc;
m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData; m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData;
m_NumCallbacks++; m_NumCallbacks++;
} }
virtual void WriteLine(const char *pLine) void CConfig::WriteLine(const char *pLine)
{ {
if(!m_ConfigFile) if(!m_ConfigFile)
return; return;
io_write(m_ConfigFile, pLine, str_length(pLine)); io_write(m_ConfigFile, pLine, str_length(pLine));
io_write_newline(m_ConfigFile); io_write_newline(m_ConfigFile);
} }
};
IConfig *CreateConfig() { return new CConfig; } IConfig *CreateConfig() { return new CConfig; }

View file

@ -3,6 +3,8 @@
#ifndef ENGINE_SHARED_CONFIG_H #ifndef ENGINE_SHARED_CONFIG_H
#define ENGINE_SHARED_CONFIG_H #define ENGINE_SHARED_CONFIG_H
#include <engine/config.h>
struct CConfiguration struct CConfiguration
{ {
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name; #define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name;
@ -25,4 +27,37 @@ enum
CFGFLAG_BASICACCESS=64, CFGFLAG_BASICACCESS=64,
}; };
class CConfig : public IConfig
{
enum
{
MAX_CALLBACKS = 16
};
struct CCallback
{
SAVECALLBACKFUNC m_pfnFunc;
void *m_pUserData;
};
class IStorage *m_pStorage;
class IConsole *m_pConsole;
IOHANDLE m_ConfigFile;
int m_FlagMask;
CCallback m_aCallbacks[MAX_CALLBACKS];
int m_NumCallbacks;
public:
CConfig();
virtual void Init(int FlagMask);
virtual void Reset();
virtual void RestoreStrings();
virtual void Save(const char *pFilename);
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData);
virtual void WriteLine(const char *pLine);
};
#endif #endif