mirror of
https://github.com/ddnet/ddnet.git
synced 2024-11-10 01:58:19 +00:00
restructured CConfig
This commit is contained in:
parent
54625ebfbc
commit
de5859b371
|
@ -9,149 +9,126 @@
|
|||
|
||||
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
|
||||
for(int i = 0; *pSrc && i < size - 1; ++i)
|
||||
{
|
||||
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)
|
||||
{
|
||||
if(*pSrc == '"' || *pSrc == '\\') // escape \ and "
|
||||
*pDst++ = '\\';
|
||||
*pDst++ = *pSrc++;
|
||||
}
|
||||
*pDst = 0;
|
||||
if(*pSrc == '"' || *pSrc == '\\') // escape \ and "
|
||||
*pDst++ = '\\';
|
||||
*pDst++ = *pSrc++;
|
||||
}
|
||||
*pDst = 0;
|
||||
}
|
||||
|
||||
static void Con_SaveConfig(IConsole::IResult *pResult, void *pUserData)
|
||||
static void Con_SaveConfig(IConsole::IResult *pResult, void *pUserData)
|
||||
{
|
||||
char aFilename[128];
|
||||
if(pResult->NumArguments())
|
||||
str_format(aFilename, sizeof(aFilename), "configs/%s.cfg", pResult->GetString(0));
|
||||
else
|
||||
{
|
||||
char aFilename[128];
|
||||
if(pResult->NumArguments())
|
||||
str_format(aFilename, sizeof(aFilename), "configs/%s.cfg", pResult->GetString(0));
|
||||
else
|
||||
{
|
||||
char aDate[20];
|
||||
str_timestamp(aDate, sizeof(aDate));
|
||||
str_format(aFilename, sizeof(aFilename), "configs/config_%s.cfg", aDate);
|
||||
}
|
||||
((CConfig*)pUserData)->Save(aFilename);
|
||||
char aDate[20];
|
||||
str_timestamp(aDate, sizeof(aDate));
|
||||
str_format(aFilename, sizeof(aFilename), "configs/config_%s.cfg", aDate);
|
||||
}
|
||||
((CConfig*)pUserData)->Save(aFilename);
|
||||
}
|
||||
|
||||
public:
|
||||
CConfig::CConfig()
|
||||
{
|
||||
m_pStorage = 0;
|
||||
m_pConsole = 0;
|
||||
m_ConfigFile = 0;
|
||||
m_FlagMask = 0;
|
||||
m_NumCallbacks = 0;
|
||||
}
|
||||
|
||||
CConfig()
|
||||
{
|
||||
m_pStorage = 0;
|
||||
m_pConsole = 0;
|
||||
m_ConfigFile = 0;
|
||||
m_FlagMask = 0;
|
||||
m_NumCallbacks = 0;
|
||||
}
|
||||
void CConfig::Init(int FlagMask)
|
||||
{
|
||||
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
m_FlagMask = FlagMask;
|
||||
Reset();
|
||||
|
||||
virtual void Init(int FlagMask)
|
||||
{
|
||||
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
||||
m_pConsole = Kernel()->RequestInterface<IConsole>();
|
||||
m_FlagMask = FlagMask;
|
||||
Reset();
|
||||
if(m_pConsole)
|
||||
m_pConsole->Register("save_config", "?s", CFGFLAG_SERVER|CFGFLAG_CLIENT|CFGFLAG_STORE, Con_SaveConfig, this, "Save config to file");
|
||||
}
|
||||
|
||||
if(m_pConsole)
|
||||
m_pConsole->Register("save_config", "?s", CFGFLAG_SERVER|CFGFLAG_CLIENT|CFGFLAG_STORE, Con_SaveConfig, this, "Save config to file");
|
||||
}
|
||||
void CConfig::Reset()
|
||||
{
|
||||
#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);
|
||||
|
||||
virtual void Reset()
|
||||
{
|
||||
#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);
|
||||
#include "config_variables.h"
|
||||
|
||||
#include "config_variables.h"
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
void CConfig::RestoreStrings()
|
||||
{
|
||||
#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);
|
||||
|
||||
virtual void RestoreStrings()
|
||||
{
|
||||
#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);
|
||||
#include "config_variables.h"
|
||||
|
||||
#include "config_variables.h"
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
}
|
||||
|
||||
virtual void Save(const char *pFilename)
|
||||
{
|
||||
if(!m_pStorage)
|
||||
return;
|
||||
void CConfig::Save(const char *pFilename)
|
||||
{
|
||||
if(!m_pStorage)
|
||||
return;
|
||||
|
||||
if(!pFilename)
|
||||
pFilename = SETTINGS_FILENAME ".cfg";
|
||||
m_ConfigFile = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
if(!pFilename)
|
||||
pFilename = SETTINGS_FILENAME ".cfg";
|
||||
m_ConfigFile = m_pStorage->OpenFile(pFilename, IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
||||
|
||||
if(!m_ConfigFile)
|
||||
return;
|
||||
if(!m_ConfigFile)
|
||||
return;
|
||||
|
||||
WriteLine("# Teeworlds " GAME_VERSION);
|
||||
WriteLine("# Teeworlds " GAME_VERSION);
|
||||
|
||||
char aLineBuf[1024*2];
|
||||
char aEscapeBuf[1024*2];
|
||||
char aLineBuf[1024*2];
|
||||
char aEscapeBuf[1024*2];
|
||||
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) if(((flags)&(CFGFLAG_SAVE))&&((flags)&(m_FlagMask))&&(g_Config.m_##Name!=int(def))){ str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); WriteLine(aLineBuf); }
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if(((flags)&(CFGFLAG_SAVE))&&((flags)&(m_FlagMask)&&(str_comp(g_Config.m_##Name,def)))){ EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); WriteLine(aLineBuf); }
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,def,min,max,flags,desc) if(((flags)&(CFGFLAG_SAVE))&&((flags)&(m_FlagMask))&&(g_Config.m_##Name!=int(def))){ str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); WriteLine(aLineBuf); }
|
||||
#define MACRO_CONFIG_STR(Name,ScriptName,len,def,flags,desc) if(((flags)&(CFGFLAG_SAVE))&&((flags)&(m_FlagMask)&&(str_comp(g_Config.m_##Name,def)))){ EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); WriteLine(aLineBuf); }
|
||||
|
||||
#include "config_variables.h"
|
||||
#include "config_variables.h"
|
||||
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
#undef MACRO_CONFIG_INT
|
||||
#undef MACRO_CONFIG_STR
|
||||
|
||||
for(int i = 0; i < m_NumCallbacks; i++)
|
||||
m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData);
|
||||
for(int i = 0; i < m_NumCallbacks; i++)
|
||||
m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData);
|
||||
|
||||
io_close(m_ConfigFile);
|
||||
io_close(m_ConfigFile);
|
||||
|
||||
if(m_pConsole)
|
||||
{
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "saved config to '%s'", pFilename);
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData)
|
||||
if(m_pConsole)
|
||||
{
|
||||
dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks");
|
||||
m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc;
|
||||
m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData;
|
||||
m_NumCallbacks++;
|
||||
char aBuf[256];
|
||||
str_format(aBuf, sizeof(aBuf), "saved config to '%s'", pFilename);
|
||||
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "config", aBuf);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void WriteLine(const char *pLine)
|
||||
{
|
||||
if(!m_ConfigFile)
|
||||
return;
|
||||
io_write(m_ConfigFile, pLine, str_length(pLine));
|
||||
io_write_newline(m_ConfigFile);
|
||||
}
|
||||
};
|
||||
void CConfig::RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData)
|
||||
{
|
||||
dbg_assert(m_NumCallbacks < MAX_CALLBACKS, "too many config callbacks");
|
||||
m_aCallbacks[m_NumCallbacks].m_pfnFunc = pfnFunc;
|
||||
m_aCallbacks[m_NumCallbacks].m_pUserData = pUserData;
|
||||
m_NumCallbacks++;
|
||||
}
|
||||
|
||||
void CConfig::WriteLine(const char *pLine)
|
||||
{
|
||||
if(!m_ConfigFile)
|
||||
return;
|
||||
|
||||
io_write(m_ConfigFile, pLine, str_length(pLine));
|
||||
io_write_newline(m_ConfigFile);
|
||||
}
|
||||
|
||||
IConfig *CreateConfig() { return new CConfig; }
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
#ifndef ENGINE_SHARED_CONFIG_H
|
||||
#define ENGINE_SHARED_CONFIG_H
|
||||
|
||||
#include <engine/config.h>
|
||||
|
||||
struct CConfiguration
|
||||
{
|
||||
#define MACRO_CONFIG_INT(Name,ScriptName,Def,Min,Max,Save,Desc) int m_##Name;
|
||||
|
@ -25,4 +27,37 @@ enum
|
|||
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
|
||||
|
|
Loading…
Reference in a new issue