diff --git a/binaries/data/mods/public/gui/pregame/mainmenu.js b/binaries/data/mods/public/gui/pregame/mainmenu.js
index 43d1f4a01e..10993ff695 100644
--- a/binaries/data/mods/public/gui/pregame/mainmenu.js
+++ b/binaries/data/mods/public/gui/pregame/mainmenu.js
@@ -158,7 +158,7 @@ function onTick()
{
g_ShowSplashScreens = false;
- if (Engine.IsSplashScreenEnabled())
+ if (Engine.ConfigDB_GetValue("user", "splashscreenenable") !== "false")
Engine.PushGuiPage("page_splashscreen.xml", { "page": "splashscreen" } );
// Warn about removing fixed render path
diff --git a/binaries/data/mods/public/gui/splashscreen/splashscreen.xml b/binaries/data/mods/public/gui/splashscreen/splashscreen.xml
index e1675db2bd..3e42871f3e 100644
--- a/binaries/data/mods/public/gui/splashscreen/splashscreen.xml
+++ b/binaries/data/mods/public/gui/splashscreen/splashscreen.xml
@@ -22,7 +22,8 @@
diff --git a/source/gui/scripting/ScriptFunctions.cpp b/source/gui/scripting/ScriptFunctions.cpp
index 52444f35d9..08b26a6f24 100644
--- a/source/gui/scripting/ScriptFunctions.cpp
+++ b/source/gui/scripting/ScriptFunctions.cpp
@@ -504,21 +504,6 @@ bool IsUserReportEnabled(void* UNUSED(cbdata))
return g_UserReporter.IsReportingEnabled();
}
-bool IsSplashScreenEnabled(void* UNUSED(cbdata))
-{
- bool splashScreenEnable = true;
- CFG_GET_VAL("splashscreenenable", Bool, splashScreenEnable);
- return splashScreenEnable;
-}
-
-void SetSplashScreenEnabled(void* UNUSED(cbdata), bool enabled)
-{
- CStr val = (enabled ? "true" : "false");
- g_ConfigDB.CreateValue(CFG_USER, "splashscreenenable")->m_String = val;
- g_ConfigDB.WriteFile(CFG_USER);
-}
-
-
void SetUserReportEnabled(void* UNUSED(cbdata), bool enabled)
{
g_UserReporter.SetReportingEnabled(enabled);
@@ -701,10 +686,6 @@ void GuiScriptingInit(ScriptInterface& scriptInterface)
scriptInterface.RegisterFunction("GetUserReportStatus");
scriptInterface.RegisterFunction("SubmitUserReport");
- // Splash screen functions
- scriptInterface.RegisterFunction("IsSplashScreenEnabled");
- scriptInterface.RegisterFunction("SetSplashScreenEnabled");
-
// Development/debugging functions
scriptInterface.RegisterFunction("SetSimRate");
scriptInterface.RegisterFunction("GetSimRate");
diff --git a/source/network/NetServer.cpp b/source/network/NetServer.cpp
index e8dba1e15d..693f985b8f 100644
--- a/source/network/NetServer.cpp
+++ b/source/network/NetServer.cpp
@@ -221,16 +221,16 @@ void* CNetServerWorker::SetupUPnP(void*)
struct UPNPDev* devlist = 0;
// Cached root descriptor URL.
- std::string rootDescURL = "";
+ std::string rootDescURL;
CFG_GET_VAL("network.upnprootdescurl", String, rootDescURL);
- if (rootDescURL != "")
+ if (!rootDescURL.empty())
LOGMESSAGE(L"Net server: attempting to use cached root descriptor URL: %hs", rootDescURL.c_str());
// Init the return variable for UPNP_GetValidIGD to 1 so things behave when using cached URLs.
int ret = 1;
// If we have a cached URL, try that first, otherwise try getting a valid UPnP device for 10 seconds. We also get our LAN address here.
- if (!((rootDescURL != "" && UPNP_GetIGDFromUrl(rootDescURL.c_str(), &urls, &data, internalIPAddress, sizeof(internalIPAddress)))
+ if (!((!rootDescURL.empty() && UPNP_GetIGDFromUrl(rootDescURL.c_str(), &urls, &data, internalIPAddress, sizeof(internalIPAddress)))
|| ((devlist = upnpDiscover(10000, 0, 0, 0, 0, 0)) && (ret = UPNP_GetValidIGD(devlist, &urls, &data, internalIPAddress, sizeof(internalIPAddress))))))
{
LOGMESSAGE(L"Net server: upnpDiscover failed and no working cached URL.");
@@ -288,7 +288,7 @@ void* CNetServerWorker::SetupUPnP(void*)
externalIPAddress, psPort, protocall, intClient, intPort, duration);
// Cache root descriptor URL to try to avoid discovery next time.
- g_ConfigDB.CreateValue(CFG_USER, "network.upnprootdescurl")->m_String = urls.controlURL;
+ g_ConfigDB.SetValueString(CFG_USER, "network.upnprootdescurl", urls.controlURL);
g_ConfigDB.WriteFile(CFG_USER);
LOGMESSAGE(L"Net server: cached UPnP root descriptor URL as %hs", urls.controlURL);
diff --git a/source/ps/ConfigDB.cpp b/source/ps/ConfigDB.cpp
index 7004facb3f..581f7180b6 100644
--- a/source/ps/ConfigDB.cpp
+++ b/source/ps/ConfigDB.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012 Wildfire Games.
+/* Copyright (C) 2013 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -39,6 +39,7 @@ struct ScopedLock
CConfigDB::CConfigDB()
{
+ // Recursive mutex needed for WriteFile
pthread_mutexattr_t attr;
int err;
err = pthread_mutexattr_init(&attr);
@@ -51,36 +52,66 @@ CConfigDB::CConfigDB()
ENSURE(err == 0);
}
-CConfigValue *CConfigDB::GetValue(EConfigNamespace ns, const CStr& name)
-{
- ScopedLock s;
- CConfigValueSet* values = GetValues(ns, name);
- if (!values)
- return NULL;
- return &((*values)[0]);
-}
+#define GETVAL(T, type) \
+ void CConfigDB::GetValue##T(EConfigNamespace ns, const CStr& name, type& value) \
+ { \
+ if (ns < 0 || ns >= CFG_LAST) \
+ { \
+ debug_warn(L"CConfigDB: Invalid ns value"); \
+ return; \
+ } \
+ ScopedLock s; \
+ TConfigMap::iterator it = m_Map[CFG_COMMAND].find(name); \
+ if (it != m_Map[CFG_COMMAND].end()) \
+ { \
+ it->second[0].Get##T(value); \
+ return; \
+ } \
+ \
+ for (int search_ns = ns; search_ns >= 0; search_ns--) \
+ { \
+ it = m_Map[search_ns].find(name); \
+ if (it != m_Map[search_ns].end()) \
+ { \
+ it->second[0].Get##T(value); \
+ return; \
+ } \
+ } \
+ }
-CConfigValueSet *CConfigDB::GetValues(EConfigNamespace ns, const CStr& name)
+GETVAL(Bool, bool)
+GETVAL(Int, int)
+GETVAL(Float, float)
+GETVAL(Double, double)
+GETVAL(String, std::string)
+
+#undef GETVAL
+
+void CConfigDB::GetValues(EConfigNamespace ns, const CStr& name, CConfigValueSet& values)
{
if (ns < 0 || ns >= CFG_LAST)
{
debug_warn(L"CConfigDB: Invalid ns value");
- return NULL;
+ return;
}
ScopedLock s;
TConfigMap::iterator it = m_Map[CFG_COMMAND].find(name);
if (it != m_Map[CFG_COMMAND].end())
- return &(it->second);
+ {
+ values = it->second;
+ return;
+ }
for (int search_ns = ns; search_ns >= 0; search_ns--)
{
- TConfigMap::iterator it = m_Map[search_ns].find(name);
+ it = m_Map[search_ns].find(name);
if (it != m_Map[search_ns].end())
- return &(it->second);
+ {
+ values = it->second;
+ return;
+ }
}
-
- return NULL;
}
EConfigNamespace CConfigDB::GetValueNamespace(EConfigNamespace ns, const CStr& name)
@@ -98,7 +129,7 @@ EConfigNamespace CConfigDB::GetValueNamespace(EConfigNamespace ns, const CStr& n
for (int search_ns = ns; search_ns >= 0; search_ns--)
{
- TConfigMap::iterator it = m_Map[search_ns].find(name);
+ it = m_Map[search_ns].find(name);
if (it != m_Map[search_ns].end())
return (EConfigNamespace)search_ns;
}
@@ -128,24 +159,29 @@ std::map CConfigDB::GetValuesWithPrefix(EConfigNamespace
}
}
+ for (TConfigMap::iterator it = m_Map[CFG_COMMAND].begin(); it != m_Map[CFG_COMMAND].end(); ++it)
+ {
+ if (boost::algorithm::starts_with(it->first, prefix))
+ ret[it->first] = it->second;
+ }
+
return ret;
}
-CConfigValue *CConfigDB::CreateValue(EConfigNamespace ns, const CStr& name)
+void CConfigDB::SetValueString(EConfigNamespace ns, const CStr& name, const CStr& value)
{
if (ns < 0 || ns >= CFG_LAST)
{
debug_warn(L"CConfigDB: Invalid ns value");
- return NULL;
+ return;
}
ScopedLock s;
TConfigMap::iterator it = m_Map[ns].find(name);
- if (it != m_Map[ns].end())
- return &(it->second[0]);
+ if (it == m_Map[ns].end())
+ it = m_Map[ns].insert(m_Map[ns].begin(), make_pair(name, CConfigValueSet(1)));
- it=m_Map[ns].insert(m_Map[ns].begin(), make_pair(name, CConfigValueSet(1)));
- return &(it->second[0]);
+ it->second[0].m_String = value;
}
void CConfigDB::SetConfigFile(EConfigNamespace ns, const VfsPath& path)
diff --git a/source/ps/ConfigDB.h b/source/ps/ConfigDB.h
index 498825f993..1725e71685 100644
--- a/source/ps/ConfigDB.h
+++ b/source/ps/ConfigDB.h
@@ -60,23 +60,26 @@ public:
CConfigDB();
/**
- * Attempt to find a config variable with the given name; will search
- * CFG_COMMAND first, and then all namespaces from the specified namespace
- * down to system.
- *
- * Returns a pointer to the config value structure for the variable, or
- * NULL if such a variable could not be found.
+ * Attempt to retrieve the value of a config variable with the given name;
+ * will search CFG_COMMAND first, and then all namespaces from the specified
+ * namespace down.
*/
- CConfigValue *GetValue(EConfigNamespace ns, const CStr& name);
+ void GetValueBool(EConfigNamespace ns, const CStr& name, bool& value);
+ ///@copydoc CConfigDB::GetValueBool
+ void GetValueInt(EConfigNamespace ns, const CStr& name, int& value);
+ ///@copydoc CConfigDB::GetValueBool
+ void GetValueFloat(EConfigNamespace ns, const CStr& name, float& value);
+ ///@copydoc CConfigDB::GetValueBool
+ void GetValueDouble(EConfigNamespace ns, const CStr& name, double& value);
+ ///@copydoc CConfigDB::GetValueBool
+ void GetValueString(EConfigNamespace ns, const CStr& name, std::string& value);
/**
* Attempt to retrieve a vector of values corresponding to the given setting;
* will search CFG_COMMAND first, and then all namespaces from the specified
- * namespace down to system.
- *
- * Returns a pointer to the vector, or NULL if the setting could not be found.
+ * namespace down.
*/
- CConfigValueSet *GetValues(EConfigNamespace ns, const CStr& name);
+ void GetValues(EConfigNamespace ns, const CStr& name, CConfigValueSet& values);
/**
* Returns the namespace that the value returned by GetValues was defined in,
@@ -87,18 +90,15 @@ public:
/**
* Retrieve a map of values corresponding to settings whose names begin
* with the given prefix;
- * will search all namespaces from system up to the specified namespace.
+ * will search all namespaces from default up to the specified namespace.
*/
std::map GetValuesWithPrefix(EConfigNamespace ns, const CStr& prefix);
/**
- * Create a new config value in the specified namespace. If such a
- * variable already exists in this namespace, the old value is returned.
- *
- * Returns a pointer to the value of the newly created config variable, or
- * that of the already existing config variable.
+ * Save a config value in the specified namespace. If the config variable
+ * existed the value is replaced.
*/
- CConfigValue *CreateValue(EConfigNamespace ns, const CStr& name);
+ void SetValueString(EConfigNamespace ns, const CStr& name, const CStr& value);
/**
* Set the path to the config file used to populate the specified namespace
@@ -145,11 +145,6 @@ public:
// convenience wrapper on top of CConfigValue::Get* simplifies user code and
// avoids "assignment within condition expression" warnings.
#define CFG_GET_VAL(name, type, destination)\
-STMT(\
- CConfigValue* val = g_ConfigDB.GetValue(CFG_USER, name);\
- if(val)\
- val->Get##type(destination);\
-)
-
+ g_ConfigDB.GetValue##type(CFG_USER, name, destination)
#endif
diff --git a/source/ps/GameSetup/Config.cpp b/source/ps/GameSetup/Config.cpp
index 50d66b4eb6..8812d92b91 100644
--- a/source/ps/GameSetup/Config.cpp
+++ b/source/ps/GameSetup/Config.cpp
@@ -152,7 +152,7 @@ static void ProcessCommandLineArgs(const CmdLineArgs& args)
{
CStr name = name_value.BeforeFirst(":");
CStr value = name_value.AfterFirst(":");
- g_ConfigDB.CreateValue(CFG_COMMAND, name)->m_String = value;
+ g_ConfigDB.SetValueString(CFG_COMMAND, name, value);
}
}
@@ -167,7 +167,7 @@ static void ProcessCommandLineArgs(const CmdLineArgs& args)
// trace_enable(true);
if (args.Has("profile"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "profile")->m_String = args.Get("profile");
+ g_ConfigDB.SetValueString(CFG_COMMAND, "profile", args.Get("profile"));
if (args.Has("quickstart"))
{
@@ -179,22 +179,22 @@ static void ProcessCommandLineArgs(const CmdLineArgs& args)
g_DisableAudio = true;
if (args.Has("shadows"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "shadows")->m_String = "true";
+ g_ConfigDB.SetValueString(CFG_COMMAND, "shadows", "true");
if (args.Has("xres"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "xres")->m_String = args.Get("xres");
+ g_ConfigDB.SetValueString(CFG_COMMAND, "xres", args.Get("xres"));
if (args.Has("yres"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "yres")->m_String = args.Get("yres");
+ g_ConfigDB.SetValueString(CFG_COMMAND, "yres", args.Get("yres"));
if (args.Has("vsync"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "vsync")->m_String = "true";
+ g_ConfigDB.SetValueString(CFG_COMMAND, "vsync", "true");
if (args.Has("ooslog"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "ooslog")->m_String = "true";
+ g_ConfigDB.SetValueString(CFG_COMMAND, "ooslog", "true");
if (args.Has("serializationtest"))
- g_ConfigDB.CreateValue(CFG_COMMAND, "serializationtest")->m_String = "true";
+ g_ConfigDB.SetValueString(CFG_COMMAND, "serializationtest", "true");
}
diff --git a/source/ps/UserReport.cpp b/source/ps/UserReport.cpp
index 960ad1134c..09197e2b2f 100644
--- a/source/ps/UserReport.cpp
+++ b/source/ps/UserReport.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2012 Wildfire Games.
+/* Copyright (C) 2013 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@@ -537,7 +537,7 @@ std::string CUserReporter::LoadUserID()
userID += hex;
}
- g_ConfigDB.CreateValue(CFG_USER, "userreport.id")->m_String = userID;
+ g_ConfigDB.SetValueString(CFG_USER, "userreport.id", userID);
g_ConfigDB.WriteFile(CFG_USER);
}
@@ -554,7 +554,7 @@ bool CUserReporter::IsReportingEnabled()
void CUserReporter::SetReportingEnabled(bool enabled)
{
CStr val = CStr::FromInt(enabled ? REPORTER_VERSION : 0);
- g_ConfigDB.CreateValue(CFG_USER, "userreport.enabledversion")->m_String = val;
+ g_ConfigDB.SetValueString(CFG_USER, "userreport.enabledversion", val);
g_ConfigDB.WriteFile(CFG_USER);
if (m_Worker)
diff --git a/source/ps/scripting/JSInterface_ConfigDB.cpp b/source/ps/scripting/JSInterface_ConfigDB.cpp
index bf2e37af8e..f100194b54 100644
--- a/source/ps/scripting/JSInterface_ConfigDB.cpp
+++ b/source/ps/scripting/JSInterface_ConfigDB.cpp
@@ -48,16 +48,9 @@ std::string JSI_ConfigDB::GetValue(void* UNUSED(cbdata), std::wstring cfgNsStrin
if (!GetConfigNamespace(cfgNsString, cfgNs))
return std::string();
- CConfigValue *val = g_ConfigDB.GetValue(cfgNs, name);
- if (val)
- {
- return val->m_String;
- }
- else
- {
- LOGMESSAGE(L"Config setting %hs does not exist!", name.c_str());
- return std::string();
- }
+ std::string value;
+ g_ConfigDB.GetValueString(cfgNs, name, value);
+ return value;
}
bool JSI_ConfigDB::CreateValue(void* UNUSED(cbdata), std::wstring cfgNsString, std::string name, std::string value)
@@ -66,8 +59,7 @@ bool JSI_ConfigDB::CreateValue(void* UNUSED(cbdata), std::wstring cfgNsString, s
if (!GetConfigNamespace(cfgNsString, cfgNs))
return false;
- CConfigValue *val = g_ConfigDB.CreateValue(cfgNs, name);
- val->m_String = value;
+ g_ConfigDB.SetValueString(cfgNs, name, value);
return true;
}