Port CConfig API from the upstream (0.7.5)

The old (g_Config) API is kept to not break the stuff.

See commits:
    de5859b371
    78076761eb
This commit is contained in:
Alexander Akulich 2021-01-10 15:47:07 +03:00
parent 09c05ab99f
commit c2f276cee1
34 changed files with 192 additions and 138 deletions

View file

@ -272,6 +272,8 @@ CClient::CClient() :
m_pSound = 0; m_pSound = 0;
m_pGameClient = 0; m_pGameClient = 0;
m_pMap = 0; m_pMap = 0;
m_pConfigManager = 0;
m_pConfig = 0;
m_pConsole = 0; m_pConsole = 0;
m_RenderFrameTime = 0.0001f; m_RenderFrameTime = 0.0001f;
@ -2961,6 +2963,8 @@ void CClient::InitInterfaces()
m_pInput = Kernel()->RequestInterface<IEngineInput>(); m_pInput = Kernel()->RequestInterface<IEngineInput>();
m_pMap = Kernel()->RequestInterface<IEngineMap>(); m_pMap = Kernel()->RequestInterface<IEngineMap>();
m_pMasterServer = Kernel()->RequestInterface<IEngineMasterServer>(); m_pMasterServer = Kernel()->RequestInterface<IEngineMasterServer>();
m_pConfigManager = Kernel()->RequestInterface<IConfigManager>();
m_pConfig = m_pConfigManager->Values();
#if defined(CONF_AUTOUPDATE) #if defined(CONF_AUTOUPDATE)
m_pUpdater = Kernel()->RequestInterface<IUpdater>(); m_pUpdater = Kernel()->RequestInterface<IUpdater>();
#endif #endif
@ -3338,8 +3342,7 @@ void CClient::Run()
if(!s_SavedConfig) if(!s_SavedConfig)
{ {
// write down the config and quit // write down the config and quit
IConfig *pConfig = Kernel()->RequestInterface<IConfig>(); if(!m_pConfigManager->Save())
if(!pConfig->Save())
m_Warnings.emplace_back(SWarning(Localize("Saving ddnet-settings.cfg failed"))); m_Warnings.emplace_back(SWarning(Localize("Saving ddnet-settings.cfg failed")));
s_SavedConfig = true; s_SavedConfig = true;
} }
@ -4265,7 +4268,7 @@ int main(int argc, const char **argv) // ignore_convention
IEngine *pEngine = CreateEngine("DDNet", Silent, 1); IEngine *pEngine = CreateEngine("DDNet", Silent, 1);
IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT); IConsole *pConsole = CreateConsole(CFGFLAG_CLIENT);
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, argv); // ignore_convention IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_CLIENT, argc, argv); // ignore_convention
IConfig *pConfig = CreateConfig(); IConfigManager *pConfigManager = CreateConfigManager();
IEngineSound *pEngineSound = CreateEngineSound(); IEngineSound *pEngineSound = CreateEngineSound();
IEngineInput *pEngineInput = CreateEngineInput(); IEngineInput *pEngineInput = CreateEngineInput();
IEngineTextRender *pEngineTextRender = CreateEngineTextRender(); IEngineTextRender *pEngineTextRender = CreateEngineTextRender();
@ -4284,7 +4287,7 @@ int main(int argc, const char **argv) // ignore_convention
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngine); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngine);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfigManager);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineSound); // IEngineSound RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineSound); // IEngineSound
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<ISound *>(pEngineSound), false); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<ISound *>(pEngineSound), false);
@ -4316,7 +4319,7 @@ int main(int argc, const char **argv) // ignore_convention
} }
pEngine->Init(); pEngine->Init();
pConfig->Init(); pConfigManager->Init();
pConsole->Init(); pConsole->Init();
pEngineMasterServer->Init(); pEngineMasterServer->Init();
pEngineMasterServer->Load(); pEngineMasterServer->Load();

View file

@ -90,6 +90,8 @@ class CClient : public IClient, public CDemoPlayer::IListener
IEngineSound *m_pSound; IEngineSound *m_pSound;
IGameClient *m_pGameClient; IGameClient *m_pGameClient;
IEngineMap *m_pMap; IEngineMap *m_pMap;
IConfigManager *m_pConfigManager;
CConfig *m_pConfig;
IConsole *m_pConsole; IConsole *m_pConsole;
IStorage *m_pStorage; IStorage *m_pStorage;
IUpdater *m_pUpdater; IUpdater *m_pUpdater;
@ -274,6 +276,8 @@ public:
IEngineSound *Sound() { return m_pSound; } IEngineSound *Sound() { return m_pSound; }
IGameClient *GameClient() { return m_pGameClient; } IGameClient *GameClient() { return m_pGameClient; }
IEngineMasterServer *MasterServer() { return m_pMasterServer; } IEngineMasterServer *MasterServer() { return m_pMasterServer; }
IConfigManager *ConfigManager() { return m_pConfigManager; }
CConfig *Config() { return m_pConfig; }
IStorage *Storage() { return m_pStorage; } IStorage *Storage() { return m_pStorage; }
IUpdater *Updater() { return m_pUpdater; } IUpdater *Updater() { return m_pUpdater; }
ISteam *Steam() { return m_pSteam; } ISteam *Steam() { return m_pSteam; }

View file

@ -38,9 +38,9 @@ void CFriends::Init(bool Foes)
{ {
m_Foes = Foes; m_Foes = Foes;
IConfig *pConfig = Kernel()->RequestInterface<IConfig>(); IConfigManager *pConfigManager = Kernel()->RequestInterface<IConfigManager>();
if(pConfig) if(pConfigManager)
pConfig->RegisterCallback(ConfigSaveCallback, this); pConfigManager->RegisterCallback(ConfigSaveCallback, this);
IConsole *pConsole = Kernel()->RequestInterface<IConsole>(); IConsole *pConsole = Kernel()->RequestInterface<IConsole>();
if(pConsole) if(pConsole)
@ -158,7 +158,7 @@ void CFriends::Friends()
} }
} }
void CFriends::ConfigSaveCallback(IConfig *pConfig, void *pUserData) void CFriends::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData)
{ {
CFriends *pSelf = (CFriends *)pUserData; CFriends *pSelf = (CFriends *)pUserData;
char aBuf[128]; char aBuf[128];
@ -175,6 +175,6 @@ void CFriends::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
str_escape(&pDst, pSelf->m_aFriends[i].m_aClan, pEnd); str_escape(&pDst, pSelf->m_aFriends[i].m_aClan, pEnd);
str_append(aBuf, "\"", sizeof(aBuf)); str_append(aBuf, "\"", sizeof(aBuf));
pConfig->WriteLine(aBuf); pConfigManager->WriteLine(aBuf);
} }
} }

View file

@ -17,7 +17,7 @@ class CFriends : public IFriends
static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData); static void ConRemoveFriend(IConsole::IResult *pResult, void *pUserData);
static void ConFriends(IConsole::IResult *pResult, void *pUserData); static void ConFriends(IConsole::IResult *pResult, void *pUserData);
static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData);
public: public:
CFriends(); CFriends();

View file

@ -89,9 +89,9 @@ void CServerBrowser::SetBaseInfo(class CNetClient *pClient, const char *pNetVers
m_pMasterServer = Kernel()->RequestInterface<IMasterServer>(); m_pMasterServer = Kernel()->RequestInterface<IMasterServer>();
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_pFriends = Kernel()->RequestInterface<IFriends>(); m_pFriends = Kernel()->RequestInterface<IFriends>();
IConfig *pConfig = Kernel()->RequestInterface<IConfig>(); IConfigManager *pConfigManager = Kernel()->RequestInterface<IConfigManager>();
if(pConfig) if(pConfigManager)
pConfig->RegisterCallback(ConfigSaveCallback, this); pConfigManager->RegisterCallback(ConfigSaveCallback, this);
} }
const CServerInfo *CServerBrowser::SortedGet(int Index) const const CServerInfo *CServerBrowser::SortedGet(int Index) const
@ -1264,7 +1264,7 @@ int CServerBrowser::LoadingProgression() const
return 100.0f * Loaded / Servers; return 100.0f * Loaded / Servers;
} }
void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData) void CServerBrowser::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData)
{ {
CServerBrowser *pSelf = (CServerBrowser *)pUserData; CServerBrowser *pSelf = (CServerBrowser *)pUserData;
@ -1274,7 +1274,7 @@ void CServerBrowser::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
{ {
net_addr_str(&pSelf->m_aFavoriteServers[i], aAddrStr, sizeof(aAddrStr), true); net_addr_str(&pSelf->m_aFavoriteServers[i], aAddrStr, sizeof(aAddrStr), true);
str_format(aBuffer, sizeof(aBuffer), "add_favorite %s", aAddrStr); str_format(aBuffer, sizeof(aBuffer), "add_favorite %s", aAddrStr);
pConfig->WriteLine(aBuffer); pConfigManager->WriteLine(aBuffer);
} }
} }

View file

@ -206,7 +206,7 @@ private:
void SetInfo(CServerEntry *pEntry, const CServerInfo &Info); void SetInfo(CServerEntry *pEntry, const CServerInfo &Info);
static void ConfigSaveCallback(IConfig *pConfig, void *pUserData); static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData);
}; };
#endif #endif

View file

@ -5,21 +5,22 @@
#include "kernel.h" #include "kernel.h"
class IConfig : public IInterface class IConfigManager : public IInterface
{ {
MACRO_INTERFACE("config", 0) MACRO_INTERFACE("config", 0)
public: public:
typedef void (*SAVECALLBACKFUNC)(IConfig *pConfig, void *pUserData); typedef void (*SAVECALLBACKFUNC)(IConfigManager *pConfig, void *pUserData);
virtual void Init() = 0; virtual void Init() = 0;
virtual void Reset() = 0; virtual void Reset() = 0;
virtual bool Save() = 0; virtual bool Save() = 0;
virtual class CConfig *Values() = 0;
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0; virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) = 0;
virtual void WriteLine(const char *pLine) = 0; virtual void WriteLine(const char *pLine) = 0;
}; };
extern IConfig *CreateConfig(); extern IConfigManager *CreateConfigManager();
#endif #endif

View file

@ -118,10 +118,11 @@ void CRegister::RegisterGotCount(CNetChunk *pChunk)
} }
} }
void CRegister::Init(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) void CRegister::Init(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole)
{ {
m_pNetServer = pNetServer; m_pNetServer = pNetServer;
m_pMasterServer = pMasterServer; m_pMasterServer = pMasterServer;
m_pConfig = pConfig;
m_pConsole = pConsole; m_pConsole = pConsole;
} }

View file

@ -29,6 +29,7 @@ class CRegister
class CNetServer *m_pNetServer; class CNetServer *m_pNetServer;
class IEngineMasterServer *m_pMasterServer; class IEngineMasterServer *m_pMasterServer;
class CConfig *m_pConfig;
class IConsole *m_pConsole; class IConsole *m_pConsole;
bool m_Sixup; bool m_Sixup;
@ -51,7 +52,7 @@ class CRegister
public: public:
CRegister(bool Sixup); CRegister(bool Sixup);
void Init(class CNetServer *pNetServer, class IEngineMasterServer *pMasterServer, class IConsole *pConsole); void Init(class CNetServer *pNetServer, class IEngineMasterServer *pMasterServer, class CConfig *pConfig, class IConsole *pConsole);
void RegisterUpdate(int Nettype); void RegisterUpdate(int Nettype);
int RegisterProcessPacket(struct CNetChunk *pPacket, SECURITY_TOKEN ResponseToken = 0); int RegisterProcessPacket(struct CNetChunk *pPacket, SECURITY_TOKEN ResponseToken = 0);
void FeedToken(NETADDR Addr, SECURITY_TOKEN ResponseToken); void FeedToken(NETADDR Addr, SECURITY_TOKEN ResponseToken);

View file

@ -2335,10 +2335,10 @@ int CServer::LoadMap(const char *pMapName)
return 1; return 1;
} }
void CServer::InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole) void CServer::InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole)
{ {
m_Register.Init(pNetServer, pMasterServer, pConsole); m_Register.Init(pNetServer, pMasterServer, pConfig, pConsole);
m_RegSixup.Init(pNetServer, pMasterServer, pConsole); m_RegSixup.Init(pNetServer, pMasterServer, pConfig, pConsole);
} }
int CServer::Run() int CServer::Run()
@ -2407,7 +2407,7 @@ int CServer::Run()
m_NetServer.SetCallbacks(NewClientCallback, NewClientNoAuthCallback, ClientRejoinCallback, DelClientCallback, this); m_NetServer.SetCallbacks(NewClientCallback, NewClientNoAuthCallback, ClientRejoinCallback, DelClientCallback, this);
m_Econ.Init(Console(), &m_ServerBan); m_Econ.Init(Config(), Console(), &m_ServerBan);
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)
m_Fifo.Init(Console(), g_Config.m_SvInputFifo, CFGFLAG_SERVER); m_Fifo.Init(Console(), g_Config.m_SvInputFifo, CFGFLAG_SERVER);
@ -3495,10 +3495,10 @@ int main(int argc, const char **argv) // ignore_convention
IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON); IConsole *pConsole = CreateConsole(CFGFLAG_SERVER | CFGFLAG_ECON);
IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer(); IEngineMasterServer *pEngineMasterServer = CreateEngineMasterServer();
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_SERVER, argc, argv); // ignore_convention
IConfig *pConfig = CreateConfig(); IConfigManager *pConfigManager = CreateConfigManager();
IEngineAntibot *pEngineAntibot = CreateEngineAntibot(); IEngineAntibot *pEngineAntibot = CreateEngineAntibot();
pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConsole); pServer->InitRegister(&pServer->m_NetServer, pEngineMasterServer, pConfigManager->Values(), pConsole);
{ {
bool RegisterFail = false; bool RegisterFail = false;
@ -3510,7 +3510,7 @@ int main(int argc, const char **argv) // ignore_convention
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pGameServer); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pGameServer);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConsole);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pStorage);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfig); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pConfigManager);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineMasterServer); // register as both RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineMasterServer); // register as both
RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IMasterServer *>(pEngineMasterServer), false); RegisterFail = RegisterFail || !pKernel->RegisterInterface(static_cast<IMasterServer *>(pEngineMasterServer), false);
RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineAntibot); RegisterFail = RegisterFail || !pKernel->RegisterInterface(pEngineAntibot);
@ -3524,7 +3524,7 @@ int main(int argc, const char **argv) // ignore_convention
} }
pEngine->Init(); pEngine->Init();
pConfig->Init(); pConfigManager->Init();
pConsole->Init(); pConsole->Init();
pEngineMasterServer->Init(); pEngineMasterServer->Init();
pEngineMasterServer->Load(); pEngineMasterServer->Load();

View file

@ -89,6 +89,7 @@ public:
class CServer : public IServer class CServer : public IServer
{ {
class IGameServer *m_pGameServer; class IGameServer *m_pGameServer;
class CConfig *m_pConfig;
class IConsole *m_pConsole; class IConsole *m_pConsole;
class IStorage *m_pStorage; class IStorage *m_pStorage;
class IEngineAntibot *m_pAntibot; class IEngineAntibot *m_pAntibot;
@ -107,6 +108,7 @@ class CServer : public IServer
public: public:
class IGameServer *GameServer() { return m_pGameServer; } class IGameServer *GameServer() { return m_pGameServer; }
class CConfig *Config() { return m_pConfig; }
class IConsole *Console() { return m_pConsole; } class IConsole *Console() { return m_pConsole; }
class IStorage *Storage() { return m_pStorage; } class IStorage *Storage() { return m_pStorage; }
class IEngineAntibot *Antibot() { return m_pAntibot; } class IEngineAntibot *Antibot() { return m_pAntibot; }
@ -366,7 +368,7 @@ public:
void StopRecord(int ClientID); void StopRecord(int ClientID);
bool IsRecording(int ClientID); bool IsRecording(int ClientID);
void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, IConsole *pConsole); void InitRegister(CNetServer *pNetServer, IEngineMasterServer *pMasterServer, CConfig *pConfig, IConsole *pConsole);
int Run(); int Run();
static void ConTestingCommands(IConsole::IResult *pResult, void *pUser); static void ConTestingCommands(IConsole::IResult *pResult, void *pUser);

View file

@ -5,48 +5,34 @@
#include <engine/shared/protocol.h> #include <engine/shared/protocol.h>
#include <engine/storage.h> #include <engine/storage.h>
CConfiguration g_Config; CConfig g_Config;
class CConfig : public IConfig void EscapeParam(char *pDst, const char *pSrc, int size)
{ {
IStorage *m_pStorage; for(int i = 0; *pSrc && i < size - 1; ++i)
IOHANDLE m_ConfigFile;
bool m_Failed;
struct CCallback
{ {
SAVECALLBACKFUNC m_pfnFunc; if(*pSrc == '"' || *pSrc == '\\') // escape \ and "
void *m_pUserData; *pDst++ = '\\';
}; *pDst++ = *pSrc++;
}
enum *pDst = 0;
{
MAX_CALLBACKS = 16
};
CCallback m_aCallbacks[MAX_CALLBACKS];
int m_NumCallbacks;
void EscapeParam(char *pDst, const char *pSrc, int Size)
{
str_escape(&pDst, pSrc, pDst + Size);
} }
public: CConfigManager::CConfigManager()
CConfig()
{ {
m_pStorage = 0;
m_ConfigFile = 0; m_ConfigFile = 0;
m_NumCallbacks = 0; m_NumCallbacks = 0;
m_Failed = false; m_Failed = false;
} }
virtual void Init() void CConfigManager::Init()
{ {
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
Reset(); Reset();
} }
virtual void Reset() void CConfigManager::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_COL(Name, ScriptName, def, flags, desc) MACRO_CONFIG_INT(Name, ScriptName, def, 0, 0, flags, desc) #define MACRO_CONFIG_COL(Name, ScriptName, def, flags, desc) MACRO_CONFIG_INT(Name, ScriptName, def, 0, 0, flags, desc)
@ -59,7 +45,7 @@ public:
#undef MACRO_CONFIG_STR #undef MACRO_CONFIG_STR
} }
virtual bool Save() bool CConfigManager::Save()
{ {
if(!m_pStorage || !g_Config.m_ClSaveSettings) if(!m_pStorage || !g_Config.m_ClSaveSettings)
return true; return true;
@ -129,7 +115,7 @@ public:
return true; return true;
} }
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData) void CConfigManager::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;
@ -137,7 +123,7 @@ public:
m_NumCallbacks++; m_NumCallbacks++;
} }
virtual void WriteLine(const char *pLine) void CConfigManager::WriteLine(const char *pLine)
{ {
if(!m_ConfigFile || if(!m_ConfigFile ||
io_write(m_ConfigFile, pLine, str_length(pLine)) != static_cast<unsigned>(str_length(pLine)) || io_write(m_ConfigFile, pLine, str_length(pLine)) != static_cast<unsigned>(str_length(pLine)) ||
@ -148,6 +134,5 @@ public:
#endif #endif
m_Failed = true; m_Failed = true;
} }
};
IConfig *CreateConfig() { return new CConfig; } IConfigManager *CreateConfigManager() { return new CConfigManager; }

View file

@ -4,14 +4,16 @@
#define ENGINE_SHARED_CONFIG_H #define ENGINE_SHARED_CONFIG_H
#include <base/detect.h> #include <base/detect.h>
#include <engine/config.h>
#define CONFIG_FILE "settings_ddnet.cfg" #define CONFIG_FILE "settings_ddnet.cfg"
#define AUTOEXEC_FILE "autoexec.cfg" #define AUTOEXEC_FILE "autoexec.cfg"
#define AUTOEXEC_CLIENT_FILE "autoexec_client.cfg" #define AUTOEXEC_CLIENT_FILE "autoexec_client.cfg"
#define AUTOEXEC_SERVER_FILE "autoexec_server.cfg" #define AUTOEXEC_SERVER_FILE "autoexec_server.cfg"
struct CConfiguration class CConfig
{ {
public:
#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;
#define MACRO_CONFIG_COL(Name, ScriptName, Def, Save, Desc) unsigned m_##Name; #define MACRO_CONFIG_COL(Name, ScriptName, Def, Save, Desc) unsigned m_##Name;
#define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Save, Desc) char m_##Name[Len]; // Flawfinder: ignore #define MACRO_CONFIG_STR(Name, ScriptName, Len, Def, Save, Desc) char m_##Name[Len]; // Flawfinder: ignore
@ -21,7 +23,7 @@ struct CConfiguration
#undef MACRO_CONFIG_STR #undef MACRO_CONFIG_STR
}; };
extern CConfiguration g_Config; extern CConfig g_Config;
enum enum
{ {
@ -41,4 +43,36 @@ enum
CFGFLAG_COLALPHA = 1 << 11, CFGFLAG_COLALPHA = 1 << 11,
}; };
class CConfigManager : public IConfigManager
{
enum
{
MAX_CALLBACKS = 16
};
struct CCallback
{
SAVECALLBACKFUNC m_pfnFunc;
void *m_pUserData;
};
class IStorage *m_pStorage;
IOHANDLE m_ConfigFile;
bool m_Failed;
CCallback m_aCallbacks[MAX_CALLBACKS];
int m_NumCallbacks;
public:
CConfigManager();
virtual void Init();
virtual void Reset();
virtual bool Save();
virtual CConfig *Values() { return &g_Config; }
virtual void RegisterCallback(SAVECALLBACKFUNC pfnFunc, void *pUserData);
virtual void WriteLine(const char *pLine);
};
#endif #endif

View file

@ -971,6 +971,7 @@ CConsole::~CConsole()
void CConsole::Init() void CConsole::Init()
{ {
m_pConfig = Kernel()->RequestInterface<IConfigManager>()->Values();
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
// TODO: this should disappear // TODO: this should disappear

View file

@ -46,6 +46,7 @@ class CConsole : public IConsole
}; };
CExecFile *m_pFirstExec; CExecFile *m_pFirstExec;
class CConfig *m_pConfig;
class IStorage *m_pStorage; class IStorage *m_pStorage;
int m_AccessLevel; int m_AccessLevel;

View file

@ -59,8 +59,9 @@ void CEcon::ConLogout(IConsole::IResult *pResult, void *pUserData)
pThis->m_NetConsole.Drop(pThis->m_UserClientID, "Logout"); pThis->m_NetConsole.Drop(pThis->m_UserClientID, "Logout");
} }
void CEcon::Init(IConsole *pConsole, CNetBan *pNetBan) void CEcon::Init(CConfig *pConfig, IConsole *pConsole, CNetBan *pNetBan)
{ {
m_pConfig = pConfig;
m_pConsole = pConsole; m_pConsole = pConsole;
for(auto &Client : m_aClients) for(auto &Client : m_aClients)

View file

@ -5,6 +5,8 @@
#include <engine/console.h> #include <engine/console.h>
class CConfig;
class CEcon class CEcon
{ {
enum enum
@ -28,6 +30,7 @@ class CEcon
}; };
CClient m_aClients[NET_MAX_CONSOLE_CLIENTS]; CClient m_aClients[NET_MAX_CONSOLE_CLIENTS];
CConfig *m_pConfig;
IConsole *m_pConsole; IConsole *m_pConsole;
CNetConsole m_NetConsole; CNetConsole m_NetConsole;
@ -45,7 +48,7 @@ class CEcon
public: public:
IConsole *Console() { return m_pConsole; } IConsole *Console() { return m_pConsole; }
void Init(IConsole *pConsole, class CNetBan *pNetBan); void Init(CConfig *pConfig, IConsole *pConsole, class CNetBan *pNetBan);
void Update(); void Update();
void Send(int ClientID, const char *pLine); void Send(int ClientID, const char *pLine);
void Shutdown(); void Shutdown();

View file

@ -26,6 +26,7 @@ protected:
class CUI *UI() const { return m_pClient->UI(); } class CUI *UI() const { return m_pClient->UI(); }
class ISound *Sound() const { return m_pClient->Sound(); } class ISound *Sound() const { return m_pClient->Sound(); }
class CRenderTools *RenderTools() const { return m_pClient->RenderTools(); } class CRenderTools *RenderTools() const { return m_pClient->RenderTools(); }
class CConfig *Config() const { return m_pClient->Config(); }
class IConsole *Console() const { return m_pClient->Console(); } class IConsole *Console() const { return m_pClient->Console(); }
class IDemoPlayer *DemoPlayer() const { return m_pClient->DemoPlayer(); } class IDemoPlayer *DemoPlayer() const { return m_pClient->DemoPlayer(); }
class IDemoRecorder *DemoRecorder(int Recorder) const { return m_pClient->DemoRecorder(Recorder); } class IDemoRecorder *DemoRecorder(int Recorder) const { return m_pClient->DemoRecorder(Recorder); }

View file

@ -250,9 +250,9 @@ void CBinds::SetDefaults()
void CBinds::OnConsoleInit() void CBinds::OnConsoleInit()
{ {
// bindings // bindings
IConfig *pConfig = Kernel()->RequestInterface<IConfig>(); IConfigManager *pConfigManager = Kernel()->RequestInterface<IConfigManager>();
if(pConfig) if(pConfigManager)
pConfig->RegisterCallback(ConfigSaveCallback, this); pConfigManager->RegisterCallback(ConfigSaveCallback, this);
Console()->Register("bind", "s[key] r[command]", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute the command"); Console()->Register("bind", "s[key] r[command]", CFGFLAG_CLIENT, ConBind, this, "Bind key to execute the command");
Console()->Register("dump_binds", "?s[key]", CFGFLAG_CLIENT, ConDumpBinds, this, "Print command executed by this keybindind or all binds"); Console()->Register("dump_binds", "?s[key]", CFGFLAG_CLIENT, ConDumpBinds, this, "Print command executed by this keybindind or all binds");
@ -423,13 +423,13 @@ const char *CBinds::GetKeyBindModifiersName(int Modifier)
return aModifier; return aModifier;
} }
void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData) void CBinds::ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData)
{ {
CBinds *pSelf = (CBinds *)pUserData; CBinds *pSelf = (CBinds *)pUserData;
char aBuffer[256]; char aBuffer[256];
char *pEnd = aBuffer + sizeof(aBuffer); char *pEnd = aBuffer + sizeof(aBuffer);
pConfig->WriteLine("unbindall"); pConfigManager->WriteLine("unbindall");
for(int i = 0; i < MODIFIER_COMBINATION_COUNT; i++) for(int i = 0; i < MODIFIER_COMBINATION_COUNT; i++)
{ {
for(int j = 0; j < KEY_LAST; j++) for(int j = 0; j < KEY_LAST; j++)
@ -443,7 +443,7 @@ void CBinds::ConfigSaveCallback(IConfig *pConfig, void *pUserData)
str_escape(&pDst, pSelf->m_aapKeyBindings[i][j], pEnd); str_escape(&pDst, pSelf->m_aapKeyBindings[i][j], pEnd);
str_append(aBuffer, "\"", sizeof(aBuffer)); str_append(aBuffer, "\"", sizeof(aBuffer));
pConfig->WriteLine(aBuffer); pConfigManager->WriteLine(aBuffer);
} }
} }
} }

View file

@ -15,7 +15,7 @@ class CBinds : public CComponent
static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData); static void ConUnbindAll(IConsole::IResult *pResult, void *pUserData);
class IConsole *GetConsole() const { return Console(); } class IConsole *GetConsole() const { return Console(); }
static void ConfigSaveCallback(class IConfig *pConfig, void *pUserData); static void ConfigSaveCallback(IConfigManager *pConfigManager, void *pUserData);
public: public:
CBinds(); CBinds();

View file

@ -744,8 +744,6 @@ void CMenus::RenderSettingsTee(CUIRect MainView)
TextRender()->SetCurFont(NULL); TextRender()->SetCurFont(NULL);
} }
typedef void (*pfnAssignFuncCallback)(CConfiguration *pConfig, int Value);
typedef struct typedef struct
{ {
CLocConstString m_Name; CLocConstString m_Name;

View file

@ -84,6 +84,7 @@ class CGameClient : public IGameClient
class ITextRender *m_pTextRender; class ITextRender *m_pTextRender;
class IClient *m_pClient; class IClient *m_pClient;
class ISound *m_pSound; class ISound *m_pSound;
class CConfig *m_pConfig;
class IConsole *m_pConsole; class IConsole *m_pConsole;
class IStorage *m_pStorage; class IStorage *m_pStorage;
class IDemoPlayer *m_pDemoPlayer; class IDemoPlayer *m_pDemoPlayer;
@ -135,6 +136,7 @@ public:
class ISound *Sound() const { return m_pSound; } class ISound *Sound() const { return m_pSound; }
class IInput *Input() const { return m_pInput; } class IInput *Input() const { return m_pInput; }
class IStorage *Storage() const { return m_pStorage; } class IStorage *Storage() const { return m_pStorage; }
class CConfig *Config() const { return m_pConfig; }
class IConsole *Console() { return m_pConsole; } class IConsole *Console() { return m_pConsole; }
class ITextRender *TextRender() const { return m_pTextRender; } class ITextRender *TextRender() const { return m_pTextRender; }
class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; } class IDemoPlayer *DemoPlayer() const { return m_pDemoPlayer; }

View file

@ -6346,6 +6346,7 @@ void CEditor::Init()
{ {
m_pInput = Kernel()->RequestInterface<IInput>(); m_pInput = Kernel()->RequestInterface<IInput>();
m_pClient = Kernel()->RequestInterface<IClient>(); m_pClient = Kernel()->RequestInterface<IClient>();
m_pConfig = Kernel()->RequestInterface<IConfigManager>()->Values();
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_pGraphics = Kernel()->RequestInterface<IGraphics>(); m_pGraphics = Kernel()->RequestInterface<IGraphics>();
m_pTextRender = Kernel()->RequestInterface<ITextRender>(); m_pTextRender = Kernel()->RequestInterface<ITextRender>();

View file

@ -631,6 +631,7 @@ class CEditor : public IEditor
{ {
class IInput *m_pInput; class IInput *m_pInput;
class IClient *m_pClient; class IClient *m_pClient;
class CConfig *m_pConfig;
class IConsole *m_pConsole; class IConsole *m_pConsole;
class IGraphics *m_pGraphics; class IGraphics *m_pGraphics;
class ITextRender *m_pTextRender; class ITextRender *m_pTextRender;
@ -642,6 +643,7 @@ class CEditor : public IEditor
public: public:
class IInput *Input() { return m_pInput; }; class IInput *Input() { return m_pInput; };
class IClient *Client() { return m_pClient; }; class IClient *Client() { return m_pClient; };
class CConfig *Config() { return m_pConfig; }
class IConsole *Console() { return m_pConsole; }; class IConsole *Console() { return m_pConsole; };
class IGraphics *Graphics() { return m_pGraphics; }; class IGraphics *Graphics() { return m_pGraphics; };
class ISound *Sound() { return m_pSound; } class ISound *Sound() { return m_pSound; }

View file

@ -57,6 +57,7 @@ public:
/* Objects */ /* Objects */
class CGameWorld *GameWorld() { return m_pGameWorld; } class CGameWorld *GameWorld() { return m_pGameWorld; }
class CConfig *Config() { return m_pGameWorld->Config(); }
class CGameContext *GameServer() { return m_pGameWorld->GameServer(); } class CGameContext *GameServer() { return m_pGameWorld->GameServer(); }
class IServer *Server() { return m_pGameWorld->Server(); } class IServer *Server() { return m_pGameWorld->Server(); }

View file

@ -3006,6 +3006,7 @@ void CGameContext::ConchainSpecialMotdupdate(IConsole::IResult *pResult, void *p
void CGameContext::OnConsoleInit() void CGameContext::OnConsoleInit()
{ {
m_pServer = Kernel()->RequestInterface<IServer>(); m_pServer = Kernel()->RequestInterface<IServer>();
m_pConfig = Kernel()->RequestInterface<IConfigManager>()->Values();
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_pEngine = Kernel()->RequestInterface<IEngine>(); m_pEngine = Kernel()->RequestInterface<IEngine>();
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();
@ -3052,6 +3053,7 @@ void CGameContext::OnConsoleInit()
void CGameContext::OnInit(/*class IKernel *pKernel*/) void CGameContext::OnInit(/*class IKernel *pKernel*/)
{ {
m_pServer = Kernel()->RequestInterface<IServer>(); m_pServer = Kernel()->RequestInterface<IServer>();
m_pConfig = Kernel()->RequestInterface<IConfigManager>()->Values();
m_pConsole = Kernel()->RequestInterface<IConsole>(); m_pConsole = Kernel()->RequestInterface<IConsole>();
m_pEngine = Kernel()->RequestInterface<IEngine>(); m_pEngine = Kernel()->RequestInterface<IEngine>();
m_pStorage = Kernel()->RequestInterface<IStorage>(); m_pStorage = Kernel()->RequestInterface<IStorage>();

View file

@ -56,6 +56,7 @@ enum
NUM_TUNEZONES = 256 NUM_TUNEZONES = 256
}; };
class CConfig;
class CHeap; class CHeap;
class CPlayer; class CPlayer;
class CScore; class CScore;
@ -69,6 +70,7 @@ struct CScoreRandomMapResult;
class CGameContext : public IGameServer class CGameContext : public IGameServer
{ {
IServer *m_pServer; IServer *m_pServer;
CConfig *m_pConfig;
IConsole *m_pConsole; IConsole *m_pConsole;
IEngine *m_pEngine; IEngine *m_pEngine;
IStorage *m_pStorage; IStorage *m_pStorage;
@ -131,6 +133,7 @@ class CGameContext : public IGameServer
public: public:
IServer *Server() const { return m_pServer; } IServer *Server() const { return m_pServer; }
CConfig *Config() { return m_pConfig; }
IConsole *Console() { return m_pConsole; } IConsole *Console() { return m_pConsole; }
IEngine *Engine() { return m_pEngine; } IEngine *Engine() { return m_pEngine; }
IStorage *Storage() { return m_pStorage; } IStorage *Storage() { return m_pStorage; }

View file

@ -22,6 +22,7 @@
IGameController::IGameController(class CGameContext *pGameServer) IGameController::IGameController(class CGameContext *pGameServer)
{ {
m_pGameServer = pGameServer; m_pGameServer = pGameServer;
m_pConfig = m_pGameServer->Config();
m_pServer = m_pGameServer->Server(); m_pServer = m_pGameServer->Server();
m_pGameType = "unknown"; m_pGameType = "unknown";

View file

@ -29,10 +29,12 @@ class IGameController
int m_aNumSpawnPoints[3]; int m_aNumSpawnPoints[3];
class CGameContext *m_pGameServer; class CGameContext *m_pGameServer;
class CConfig *m_pConfig;
class IServer *m_pServer; class IServer *m_pServer;
protected: protected:
CGameContext *GameServer() const { return m_pGameServer; } CGameContext *GameServer() const { return m_pGameServer; }
CConfig *Config() { return m_pConfig; }
IServer *Server() const { return m_pServer; } IServer *Server() const { return m_pServer; }
struct CSpawnEval struct CSpawnEval

View file

@ -16,6 +16,7 @@
CGameWorld::CGameWorld() CGameWorld::CGameWorld()
{ {
m_pGameServer = 0x0; m_pGameServer = 0x0;
m_pConfig = 0x0;
m_pServer = 0x0; m_pServer = 0x0;
m_Paused = false; m_Paused = false;
@ -35,6 +36,7 @@ CGameWorld::~CGameWorld()
void CGameWorld::SetGameServer(CGameContext *pGameServer) void CGameWorld::SetGameServer(CGameContext *pGameServer)
{ {
m_pGameServer = pGameServer; m_pGameServer = pGameServer;
m_pConfig = m_pGameServer->Config();
m_pServer = m_pGameServer->Server(); m_pServer = m_pGameServer->Server();
} }

View file

@ -36,12 +36,14 @@ private:
CEntity *m_apFirstEntityTypes[NUM_ENTTYPES]; CEntity *m_apFirstEntityTypes[NUM_ENTTYPES];
class CGameContext *m_pGameServer; class CGameContext *m_pGameServer;
class CConfig *m_pConfig;
class IServer *m_pServer; class IServer *m_pServer;
void UpdatePlayerMaps(); void UpdatePlayerMaps();
public: public:
class CGameContext *GameServer() { return m_pGameServer; } class CGameContext *GameServer() { return m_pGameServer; }
class CConfig *Config() { return m_pConfig; }
class IServer *Server() { return m_pServer; } class IServer *Server() { return m_pServer; }
bool m_ResetRequested; bool m_ResetRequested;

View file

@ -9,7 +9,7 @@
#include <time.h> #include <time.h>
struct CConfiguration; class CConfig;
class CTuningParams; class CTuningParams;
class CUuidManager; class CUuidManager;
@ -34,7 +34,7 @@ public:
SHA256_DIGEST m_MapSha256; SHA256_DIGEST m_MapSha256;
int m_MapCrc; int m_MapCrc;
CConfiguration *m_pConfig; CConfig *m_pConfig;
CTuningParams *m_pTuning; CTuningParams *m_pTuning;
CUuidManager *m_pUuids; CUuidManager *m_pUuids;
}; };

View file

@ -332,17 +332,17 @@ int main(int argc, const char **argv) // ignore_convention
IKernel *pKernel = IKernel::Create(); IKernel *pKernel = IKernel::Create();
IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv); IStorage *pStorage = CreateStorage("Teeworlds", IStorage::STORAGETYPE_BASIC, argc, argv);
IConfig *pConfig = CreateConfig(); IConfigManager *pConfigManager = CreateConfigManager();
m_pConsole = CreateConsole(CFGFLAG_MASTER); m_pConsole = CreateConsole(CFGFLAG_MASTER);
bool RegisterFail = !pKernel->RegisterInterface(pStorage); bool RegisterFail = !pKernel->RegisterInterface(pStorage);
RegisterFail |= !pKernel->RegisterInterface(m_pConsole); RegisterFail |= !pKernel->RegisterInterface(m_pConsole);
RegisterFail |= !pKernel->RegisterInterface(pConfig); RegisterFail |= !pKernel->RegisterInterface(pConfigManager);
if(RegisterFail) if(RegisterFail)
return -1; return -1;
pConfig->Init(); pConfigManager->Init();
m_pConsole->Init(); m_pConsole->Init();
m_NetBan.Init(m_pConsole, pStorage); m_NetBan.Init(m_pConsole, pStorage);
if(argc > 1) // ignore_convention if(argc > 1) // ignore_convention

View file

@ -12,7 +12,7 @@ class TeeHistorian : public ::testing::Test
{ {
protected: protected:
CTeeHistorian m_TH; CTeeHistorian m_TH;
CConfiguration m_Config; CConfig m_Config;
CTuningParams m_Tuning; CTuningParams m_Tuning;
CUuidManager m_UuidManager; CUuidManager m_UuidManager;
CTeeHistorian::CGameInfo m_GameInfo; CTeeHistorian::CGameInfo m_GameInfo;