diff options
Diffstat (limited to 'src/server/shared')
| -rw-r--r-- | src/server/shared/Configuration/Config.cpp | 103 | ||||
| -rw-r--r-- | src/server/shared/Configuration/Config.h | 49 | ||||
| -rw-r--r-- | src/server/shared/Logging/Log.cpp | 16 |
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('/'); |
