Core/Config: Refactored ConfigMgr

* Loading initial configuration files is now separate from loading any additional custom configs
This commit is contained in:
Shauren
2013-07-15 17:31:44 +02:00
parent baeecba6c9
commit 779a59e7e2
16 changed files with 470 additions and 424 deletions

View File

@@ -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;
std::string _filename;
ACE_Auto_Ptr<ACE_Configuration_Heap> _config;
LockType m_configLock;
// Defined here as it must not be exposed to end-users.
bool GetValueHelper(const char* name, ACE_TString &result)
{
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;
}
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;
}
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

View File

@@ -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

View File

@@ -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('/');