2010-11-20 10:37:14 +00:00
|
|
|
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
|
|
|
|
/* If you are missing that file, acquire a complete release at teeworlds.com. */
|
2010-05-29 07:25:38 +00:00
|
|
|
#include <engine/config.h>
|
|
|
|
#include <engine/shared/config.h>
|
2014-05-12 21:57:42 +00:00
|
|
|
#include <engine/shared/protocol.h>
|
2020-09-26 19:41:58 +00:00
|
|
|
#include <engine/storage.h>
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
CConfig g_Config;
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-01-10 15:01:15 +00:00
|
|
|
void EscapeParam(char *pDst, const char *pSrc, int Size)
|
2010-05-29 07:25:38 +00:00
|
|
|
{
|
2021-01-10 15:01:15 +00:00
|
|
|
str_escape(&pDst, pSrc, pDst + Size);
|
2021-01-10 12:47:07 +00:00
|
|
|
}
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
CConfigManager::CConfigManager()
|
|
|
|
{
|
|
|
|
m_pStorage = 0;
|
|
|
|
m_ConfigFile = 0;
|
|
|
|
m_NumCallbacks = 0;
|
|
|
|
m_Failed = false;
|
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
void CConfigManager::Init()
|
|
|
|
{
|
|
|
|
m_pStorage = Kernel()->RequestInterface<IStorage>();
|
|
|
|
Reset();
|
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
void CConfigManager::Reset()
|
|
|
|
{
|
2020-09-26 19:41:58 +00:00
|
|
|
#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_STR(Name, ScriptName, len, def, flags, desc) str_copy(g_Config.m_##Name, def, len);
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#include "config_variables.h"
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#undef MACRO_CONFIG_INT
|
|
|
|
#undef MACRO_CONFIG_COL
|
|
|
|
#undef MACRO_CONFIG_STR
|
2021-01-10 12:47:07 +00:00
|
|
|
}
|
2010-08-10 22:31:42 +00:00
|
|
|
|
2021-12-27 00:13:09 +00:00
|
|
|
void CConfigManager::Reset(const char *pScriptName)
|
|
|
|
{
|
|
|
|
#define MACRO_CONFIG_INT(Name, ScriptName, def, min, max, flags, desc) \
|
|
|
|
if(str_comp(pScriptName, #ScriptName) == 0) \
|
|
|
|
{ \
|
|
|
|
g_Config.m_##Name = def; \
|
|
|
|
return; \
|
|
|
|
};
|
|
|
|
#define MACRO_CONFIG_COL(Name, ScriptName, def, flags, desc) MACRO_CONFIG_INT(Name, ScriptName, def, 0, 0, flags, desc)
|
|
|
|
#define MACRO_CONFIG_STR(Name, ScriptName, len, def, flags, desc) \
|
|
|
|
if(str_comp(pScriptName, #ScriptName) == 0) \
|
|
|
|
{ \
|
|
|
|
str_copy(g_Config.m_##Name, def, len); \
|
|
|
|
return; \
|
|
|
|
};
|
|
|
|
|
|
|
|
#include "config_variables.h"
|
|
|
|
|
|
|
|
#undef MACRO_CONFIG_INT
|
|
|
|
#undef MACRO_CONFIG_COL
|
|
|
|
#undef MACRO_CONFIG_STR
|
|
|
|
}
|
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
bool CConfigManager::Save()
|
|
|
|
{
|
|
|
|
if(!m_pStorage || !g_Config.m_ClSaveSettings)
|
|
|
|
return true;
|
2018-04-05 15:24:49 +00:00
|
|
|
|
2021-12-20 14:00:21 +00:00
|
|
|
char aConfigFileTmp[IO_MAX_PATH_LENGTH];
|
|
|
|
m_ConfigFile = m_pStorage->OpenFile(IStorage::FormatTmpPath(aConfigFileTmp, sizeof(aConfigFileTmp), CONFIG_FILE), IOFLAG_WRITE, IStorage::TYPE_SAVE);
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
if(!m_ConfigFile)
|
|
|
|
{
|
|
|
|
dbg_msg("config", "ERROR: opening %s failed", aConfigFileTmp);
|
|
|
|
return false;
|
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
m_Failed = false;
|
2018-04-05 15:24:49 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
char aLineBuf[1024 * 2];
|
|
|
|
char aEscapeBuf[1024 * 2];
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#define MACRO_CONFIG_INT(Name, ScriptName, def, min, max, flags, desc) \
|
|
|
|
if((flags)&CFGFLAG_SAVE && g_Config.m_##Name != def) \
|
|
|
|
{ \
|
|
|
|
str_format(aLineBuf, sizeof(aLineBuf), "%s %i", #ScriptName, g_Config.m_##Name); \
|
|
|
|
WriteLine(aLineBuf); \
|
|
|
|
}
|
|
|
|
#define MACRO_CONFIG_COL(Name, ScriptName, def, flags, desc) \
|
|
|
|
if((flags)&CFGFLAG_SAVE && g_Config.m_##Name != def) \
|
|
|
|
{ \
|
|
|
|
str_format(aLineBuf, sizeof(aLineBuf), "%s %u", #ScriptName, g_Config.m_##Name); \
|
|
|
|
WriteLine(aLineBuf); \
|
|
|
|
}
|
|
|
|
#define MACRO_CONFIG_STR(Name, ScriptName, len, def, flags, desc) \
|
|
|
|
if((flags)&CFGFLAG_SAVE && str_comp(g_Config.m_##Name, def) != 0) \
|
|
|
|
{ \
|
|
|
|
EscapeParam(aEscapeBuf, g_Config.m_##Name, sizeof(aEscapeBuf)); \
|
|
|
|
str_format(aLineBuf, sizeof(aLineBuf), "%s \"%s\"", #ScriptName, aEscapeBuf); \
|
|
|
|
WriteLine(aLineBuf); \
|
|
|
|
}
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#include "config_variables.h"
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2020-09-26 19:41:58 +00:00
|
|
|
#undef MACRO_CONFIG_INT
|
|
|
|
#undef MACRO_CONFIG_COL
|
|
|
|
#undef MACRO_CONFIG_STR
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
for(int i = 0; i < m_NumCallbacks; i++)
|
|
|
|
m_aCallbacks[i].m_pfnFunc(this, m_aCallbacks[i].m_pUserData);
|
2018-04-05 15:24:49 +00:00
|
|
|
|
2022-01-31 21:08:56 +00:00
|
|
|
if(io_sync(m_ConfigFile) != 0)
|
|
|
|
{
|
|
|
|
m_Failed = true;
|
|
|
|
}
|
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
if(io_close(m_ConfigFile) != 0)
|
|
|
|
m_Failed = true;
|
2018-04-05 15:24:49 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
m_ConfigFile = 0;
|
2018-04-05 15:24:49 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
if(m_Failed)
|
|
|
|
{
|
|
|
|
dbg_msg("config", "ERROR: writing to %s failed", aConfigFileTmp);
|
|
|
|
return false;
|
2010-05-29 07:25:38 +00:00
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
if(!m_pStorage->RenameFile(aConfigFileTmp, CONFIG_FILE, IStorage::TYPE_SAVE))
|
2010-05-29 07:25:38 +00:00
|
|
|
{
|
2021-01-10 12:47:07 +00:00
|
|
|
dbg_msg("config", "ERROR: renaming %s to " CONFIG_FILE " failed", aConfigFileTmp);
|
|
|
|
return false;
|
2010-05-29 07:25:38 +00:00
|
|
|
}
|
2011-04-13 18:37:12 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CConfigManager::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 CConfigManager::WriteLine(const char *pLine)
|
|
|
|
{
|
|
|
|
if(!m_ConfigFile ||
|
|
|
|
io_write(m_ConfigFile, pLine, str_length(pLine)) != static_cast<unsigned>(str_length(pLine)) ||
|
2018-04-05 15:24:49 +00:00
|
|
|
#if defined(CONF_FAMILY_WINDOWS)
|
2021-01-10 12:47:07 +00:00
|
|
|
io_write_newline(m_ConfigFile) != 2)
|
2018-04-05 15:24:49 +00:00
|
|
|
#else
|
2021-01-10 12:47:07 +00:00
|
|
|
io_write_newline(m_ConfigFile) != 1)
|
2018-04-05 15:24:49 +00:00
|
|
|
#endif
|
2021-01-10 12:47:07 +00:00
|
|
|
m_Failed = true;
|
|
|
|
}
|
2010-05-29 07:25:38 +00:00
|
|
|
|
2021-01-10 12:47:07 +00:00
|
|
|
IConfigManager *CreateConfigManager() { return new CConfigManager; }
|