aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared')
-rw-r--r--src/server/shared/Configuration/Config.cpp103
-rw-r--r--src/server/shared/Configuration/Config.h49
-rw-r--r--src/server/shared/Logging/Log.cpp16
3 files changed, 107 insertions, 61 deletions
diff --git a/src/server/shared/Configuration/Config.cpp b/src/server/shared/Configuration/Config.cpp
index 5d5cc02616b..47d59a57100 100644
--- a/src/server/shared/Configuration/Config.cpp
+++ b/src/server/shared/Configuration/Config.cpp
@@ -17,72 +17,79 @@
*/
#include "Config.h"
-#include <ace/Auto_Ptr.h>
-#include <ace/Configuration_Import_Export.h>
-#include <ace/Thread_Mutex.h>
+#include "Errors.h"
-namespace ConfigMgr
+// Defined here as it must not be exposed to end-users.
+bool ConfigMgr::GetValueHelper(const char* name, ACE_TString &result)
{
+ GuardType guard(_configLock);
-namespace
-{
- typedef ACE_Thread_Mutex LockType;
- typedef ACE_Guard<LockType> GuardType;
+ if (_config.get() == 0)
+ return false;
- std::string _filename;
- ACE_Auto_Ptr<ACE_Configuration_Heap> _config;
- LockType m_configLock;
+ ACE_TString section_name;
+ ACE_Configuration_Section_Key section_key;
+ const ACE_Configuration_Section_Key &root_key = _config->root_section();
- // Defined here as it must not be exposed to end-users.
- bool GetValueHelper(const char* name, ACE_TString &result)
+ int i = 0;
+ while (_config->enumerate_sections(root_key, i, section_name) == 0)
{
- GuardType guard(m_configLock);
-
- if (_config.get() == 0)
- return false;
-
- ACE_TString section_name;
- ACE_Configuration_Section_Key section_key;
- const ACE_Configuration_Section_Key &root_key = _config->root_section();
-
- int i = 0;
- while (_config->enumerate_sections(root_key, i, section_name) == 0)
- {
- _config->open_section(root_key, section_name.c_str(), 0, section_key);
- if (_config->get_string_value(section_key, name, result) == 0)
- return true;
- ++i;
- }
-
- return false;
+ _config->open_section(root_key, section_name.c_str(), 0, section_key);
+ if (_config->get_string_value(section_key, name, result) == 0)
+ return true;
+ ++i;
}
+
+ return false;
}
-bool Load(const char* file)
+bool ConfigMgr::LoadInitial(char const* file)
{
- GuardType guard(m_configLock);
+ ASSERT(file);
- if (file)
- _filename = file;
+ GuardType guard(_configLock);
- _config.reset(new ACE_Configuration_Heap);
+ _filename = file;
+ _config.reset(new ACE_Configuration_Heap());
if (_config->open() == 0)
- {
- ACE_Ini_ImpExp config_importer(*_config.get());
- if (config_importer.import_config(_filename.c_str()) == 0)
+ if (LoadData(_filename.c_str()))
return true;
- }
+
_config.reset();
return false;
}
-std::string GetStringDefault(const char* name, const std::string &def)
+bool ConfigMgr::LoadMore(char const* file)
+{
+ ASSERT(file);
+ ASSERT(_config);
+
+ GuardType guard(_configLock);
+
+ return LoadData(file);
+}
+
+bool ConfigMgr::Reload()
+{
+ return LoadInitial(_filename.c_str());
+}
+
+bool ConfigMgr::LoadData(char const* file)
+{
+ ACE_Ini_ImpExp config_importer(*_config.get());
+ if (config_importer.import_config(file) == 0)
+ return true;
+
+ return false;
+}
+
+std::string ConfigMgr::GetStringDefault(const char* name, const std::string &def)
{
ACE_TString val;
return GetValueHelper(name, val) ? val.c_str() : def;
}
-bool GetBoolDefault(const char* name, bool def)
+bool ConfigMgr::GetBoolDefault(const char* name, bool def)
{
ACE_TString val;
@@ -93,22 +100,20 @@ bool GetBoolDefault(const char* name, bool def)
val == "1");
}
-int GetIntDefault(const char* name, int def)
+int ConfigMgr::GetIntDefault(const char* name, int def)
{
ACE_TString val;
return GetValueHelper(name, val) ? atoi(val.c_str()) : def;
}
-float GetFloatDefault(const char* name, float def)
+float ConfigMgr::GetFloatDefault(const char* name, float def)
{
ACE_TString val;
return GetValueHelper(name, val) ? (float)atof(val.c_str()) : def;
}
-const std::string & GetFilename()
+std::string const& ConfigMgr::GetFilename()
{
- GuardType guard(m_configLock);
+ GuardType guard(_configLock);
return _filename;
}
-
-} // namespace
diff --git a/src/server/shared/Configuration/Config.h b/src/server/shared/Configuration/Config.h
index 778c25f2033..d633e37f0c4 100644
--- a/src/server/shared/Configuration/Config.h
+++ b/src/server/shared/Configuration/Config.h
@@ -20,17 +20,58 @@
#define CONFIG_H
#include <string>
+#include <map>
+#include <ace/Singleton.h>
+#include <ace/Configuration_Import_Export.h>
+#include <ace/Thread_Mutex.h>
+#include <AutoPtr.h>
-namespace ConfigMgr
+typedef Trinity::AutoPtr<ACE_Configuration_Heap, ACE_Null_Mutex> Config;
+
+class ConfigMgr
{
- bool Load(const char *file = NULL);
+ friend class ACE_Singleton<ConfigMgr, ACE_Null_Mutex>;
+ friend class ConfigLoader;
+
+ ConfigMgr() { }
+ ~ConfigMgr() { }
+
+public:
+ /// Method used only for loading main configuration files (authserver.conf and worldserver.conf)
+ bool LoadInitial(char const* file);
+
+ /**
+ * This method loads additional configuration files
+ * It is recommended to use this method in WorldScript::OnConfigLoad hooks
+ *
+ * @return true if loading was successful
+ */
+ bool LoadMore(char const* file);
+
+ bool Reload();
std::string GetStringDefault(const char* name, const std::string& def);
bool GetBoolDefault(const char* name, bool def);
int GetIntDefault(const char* name, int def);
float GetFloatDefault(const char* name, float def);
- const std::string & GetFilename();
-}
+ std::string const& GetFilename();
+
+private:
+ bool GetValueHelper(const char* name, ACE_TString &result);
+ bool LoadData(char const* file);
+
+ typedef ACE_Thread_Mutex LockType;
+ typedef ACE_Guard<LockType> GuardType;
+
+ std::string _filename;
+ Config _config;
+ LockType _configLock;
+
+ ConfigMgr(ConfigMgr const&);
+ ConfigMgr& operator=(ConfigMgr const&);
+};
+
+#define sConfigMgr ACE_Singleton<ConfigMgr, ACE_Null_Mutex>::instance()
#endif
diff --git a/src/server/shared/Logging/Log.cpp b/src/server/shared/Logging/Log.cpp
index 312a3463aef..be7aab9cf5e 100644
--- a/src/server/shared/Logging/Log.cpp
+++ b/src/server/shared/Logging/Log.cpp
@@ -48,13 +48,13 @@ uint8 Log::NextAppenderId()
int32 GetConfigIntDefault(std::string base, const char* name, int32 value)
{
base.append(name);
- return ConfigMgr::GetIntDefault(base.c_str(), value);
+ return sConfigMgr->GetIntDefault(base.c_str(), value);
}
std::string GetConfigStringDefault(std::string base, const char* name, const char* value)
{
base.append(name);
- return ConfigMgr::GetStringDefault(base.c_str(), value);
+ return sConfigMgr->GetStringDefault(base.c_str(), value);
}
// Returns default logger if the requested logger is not found
@@ -83,7 +83,7 @@ void Log::CreateAppenderFromConfig(const char* name)
// if type = Console. optional1 = Color
std::string options = "Appender.";
options.append(name);
- options = ConfigMgr::GetStringDefault(options.c_str(), "");
+ options = sConfigMgr->GetStringDefault(options.c_str(), "");
Tokenizer tokens(options, ',');
Tokenizer::const_iterator iter = tokens.begin();
uint8 size = tokens.size();
@@ -173,7 +173,7 @@ void Log::CreateLoggerFromConfig(const char* name)
std::string options = "Logger.";
options.append(name);
- options = ConfigMgr::GetStringDefault(options.c_str(), "");
+ options = sConfigMgr->GetStringDefault(options.c_str(), "");
if (options.empty())
{
@@ -235,7 +235,7 @@ void Log::CreateLoggerFromConfig(const char* name)
void Log::ReadAppendersFromConfig()
{
- std::istringstream ss(ConfigMgr::GetStringDefault("Appenders", ""));
+ std::istringstream ss(sConfigMgr->GetStringDefault("Appenders", ""));
std::string name;
do
@@ -249,7 +249,7 @@ void Log::ReadAppendersFromConfig()
void Log::ReadLoggersFromConfig()
{
- std::istringstream ss(ConfigMgr::GetStringDefault("Loggers", ""));
+ std::istringstream ss(sConfigMgr->GetStringDefault("Loggers", ""));
std::string name;
do
@@ -457,11 +457,11 @@ void Log::LoadFromConfig()
{
Close();
- if (ConfigMgr::GetBoolDefault("Log.Async.Enable", false))
+ if (sConfigMgr->GetBoolDefault("Log.Async.Enable", false))
worker = new LogWorker();
AppenderId = 0;
- m_logsDir = ConfigMgr::GetStringDefault("LogsDir", "");
+ m_logsDir = sConfigMgr->GetStringDefault("LogsDir", "");
if (!m_logsDir.empty())
if ((m_logsDir.at(m_logsDir.length() - 1) != '/') && (m_logsDir.at(m_logsDir.length() - 1) != '\\'))
m_logsDir.push_back('/');