Files
TrinityCore/src/common/Configuration/Config.cpp
roc13x a54adfd894 Core/Build: Fixed dynamic mode build
Core can now be built in dynamic mode, enabling the hotswap system to be
used.

Hotswap works fine on Windows. Didnt work for me on Debian, the rebuild
and reload process happens but the old version of the module remains for
some reason. Cant figure it out right now
2016-08-13 17:26:30 +01:00

157 lines
4.6 KiB
C++

/*
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <algorithm>
#include <mutex>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>
#include "Config.h"
#include "Log.h"
using namespace boost::property_tree;
bool ConfigMgr::LoadInitial(std::string const& file, std::vector<std::string> args,
std::string& error)
{
std::lock_guard<std::mutex> lock(_configLock);
_filename = file;
_args = args;
try
{
ptree fullTree;
ini_parser::read_ini(file, fullTree);
if (fullTree.empty())
{
error = "empty file (" + file + ")";
return false;
}
// Since we're using only one section per config file, we skip the section and have direct property access
_config = fullTree.begin()->second;
}
catch (ini_parser::ini_parser_error const& e)
{
if (e.line() == 0)
error = e.message() + " (" + e.filename() + ")";
else
error = e.message() + " (" + e.filename() + ":" + std::to_string(e.line()) + ")";
return false;
}
return true;
}
ConfigMgr* ConfigMgr::instance()
{
static ConfigMgr instance;
return &instance;
}
bool ConfigMgr::Reload(std::string& error)
{
return LoadInitial(_filename, std::move(_args), error);
}
template<class T>
T ConfigMgr::GetValueDefault(std::string const& name, T def) const
{
try
{
return _config.get<T>(ptree::path_type(name, '/'));
}
catch (boost::property_tree::ptree_bad_path)
{
TC_LOG_WARN("server.loading", "Missing name %s in config file %s, add \"%s = %s\" to this file",
name.c_str(), _filename.c_str(), name.c_str(), std::to_string(def).c_str());
}
catch (boost::property_tree::ptree_bad_data)
{
TC_LOG_ERROR("server.loading", "Bad value defined for name %s in config file %s, going to use %s instead",
name.c_str(), _filename.c_str(), std::to_string(def).c_str());
}
return def;
}
template<>
std::string ConfigMgr::GetValueDefault<std::string>(std::string const& name, std::string def) const
{
try
{
return _config.get<std::string>(ptree::path_type(name, '/'));
}
catch (boost::property_tree::ptree_bad_path)
{
TC_LOG_WARN("server.loading", "Missing name %s in config file %s, add \"%s = %s\" to this file",
name.c_str(), _filename.c_str(), name.c_str(), def.c_str());
}
catch (boost::property_tree::ptree_bad_data)
{
TC_LOG_ERROR("server.loading", "Bad value defined for name %s in config file %s, going to use %s instead",
name.c_str(), _filename.c_str(), def.c_str());
}
return def;
}
std::string ConfigMgr::GetStringDefault(std::string const& name, const std::string& def) const
{
std::string val = GetValueDefault(name, def);
val.erase(std::remove(val.begin(), val.end(), '"'), val.end());
return val;
}
bool ConfigMgr::GetBoolDefault(std::string const& name, bool def) const
{
std::string val = GetValueDefault(name, std::string(def ? "1" : "0"));
val.erase(std::remove(val.begin(), val.end(), '"'), val.end());
return (val == "1" || val == "true" || val == "TRUE" || val == "yes" || val == "YES");
}
int ConfigMgr::GetIntDefault(std::string const& name, int def) const
{
return GetValueDefault(name, def);
}
float ConfigMgr::GetFloatDefault(std::string const& name, float def) const
{
return GetValueDefault(name, def);
}
std::string const& ConfigMgr::GetFilename()
{
std::lock_guard<std::mutex> lock(_configLock);
return _filename;
}
std::list<std::string> ConfigMgr::GetKeysByString(std::string const& name)
{
std::lock_guard<std::mutex> lock(_configLock);
std::list<std::string> keys;
for (const ptree::value_type& child : _config)
if (child.first.compare(0, name.length(), name) == 0)
keys.push_back(child.first);
return keys;
}