diff options
Diffstat (limited to 'src/configuration.cpp')
-rw-r--r-- | src/configuration.cpp | 969 |
1 files changed, 0 insertions, 969 deletions
diff --git a/src/configuration.cpp b/src/configuration.cpp deleted file mode 100644 index d3c514c67..000000000 --- a/src/configuration.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 - * 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 "configuration.h" - -#include "variabledata.h" - -#include "fs/files.h" -#include "fs/paths.h" - -#include "fs/virtfs/fs.h" - -#include "listeners/configlistener.h" - -#include "utils/cast.h" -#include "utils/checkutils.h" -#include "utils/foreach.h" -#ifdef DEBUG_CONFIG -#include "utils/stringmap.h" -#endif // DEBUG_CONFIG - -#include "debug.h" - -#ifdef DEBUG_CONFIG -StringIntMap optionsCount; -#define GETLOG() if (logger) {logger->log("config get: " + key); \ - if (mIsMain) optionsCount[key] = 1; } -#else // DEBUG_CONFIG -#define GETLOG() -#endif // DEBUG_CONFIG - -Configuration config; // XML file configuration reader -Configuration serverConfig; // XML file server configuration reader -Configuration features; // XML file features -Configuration branding; // XML branding information reader -Configuration paths; // XML default paths information reader - -const std::string unusedKeys[] = -{ - "BotCheckerWindowSticky", - "afkmessage", - "BotCheckerWindowVisible", - "BotCheckerWindowWinX", - "BotCheckerWindowWinY", - "hideShield", - "AttackRange", - "emoteshortcut0", - "screenshotDirectory2", - "AttackRangeBorder", - "AttackRangeBorderDelay", - "AttackRangeBorderGradient", - "AttackRangeDelay", - "AttackRangeGradient", - "Being", - "BeingDelay", - "BeingGradient", - "BeingPopupSkin", - "BotCheckerWindowSkin", - "BuySellSkin", - "BuySkin", - "ChatSkin", - "CollisionHighlight", - "CollisionHighlightDelay", - "CollisionHighlightGradient", - "ColorCross", - "ColorCrossDelay", - "ColorCrossGradient", - "ColorExperience", - "ColorExperienceGradient", - "ColorPickup", - "ColorPickupGradient", - "DebugSkin", - "DropShortcutSkin", - "EmoteShortcutSkin", - "EquipmentSkin", - "ExpInfo", - "ExpInfoDelay", - "ExpInfoGradient", - "Experience", - "ExperienceGradient", - "GM", - "GMDelay", - "GMGradient", - "Guild", - "GuildDelay", - "GuildGradient", - "GuildSkin", - "HelpSkin", - "Hit CriticalDelay", - "Hit CriticalGradient", - "Hit Monster Player", - "Hit Monster PlayerGradient", - "Hit Player Monster", - "Hit Player MonsterGradient", - "HitCriticalDelay", - "HitCriticalGradient", - "HitLocalPlayerCriticalDelay", - "HitLocalPlayerCriticalGradient", - "HitLocalPlayerMiss", - "HitLocalPlayerMissDelay", - "HitLocalPlayerMissGradient", - "HitLocalPlayerMonster", - "HitLocalPlayerMonsterDelay", - "HitLocalPlayerMonsterGradient", - "HitMonsterPlayer", - "HitMonsterPlayerDelay", - "HitMonsterPlayerGradient", - "HitPlayerMonster", - "HitPlayerMonsterDelay", - "HitPlayerMonsterGradient", - "HomePlace", - "HomePlaceBorder", - "HomePlaceBorderDelay", - "HomePlaceBorderGradient", - "HomePlaceDelay", - "HomePlaceGradient", - "InventorySkin", - "ItemPopupSkin", - "ItemShortcutSkin", - "Kill statsSkin", - "MiniStatusSkin", - "MinimapSkin", - "Miss", - "MissDelay", - "MissGradient", - "Monster", - "MonsterAttackRange", - "MonsterAttackRangeDelay", - "MonsterAttackRangeGradient", - "MonsterDelay", - "MonsterGradient", - "NPC", - "NPCDelay", - "NPCGradient", - "NpcTextSkin", - "OutfitsSkin", - "Particle", - "ParticleDelay", - "ParticleGradient", - "PartyDelay", - "PartyGradient", - "PartySkin", - "Personal ShopSkin", - "Pickup", - "PickupGradient", - "Player", - "PlayerDelay", - "PlayerGradient", - "PopupMenuSkin", - "PortalHighlight", - "PortalHighlightDelay", - "PortalHighlightGradient", - "RecorderSkin", - "RecorderWinX", - "RecorderWinY", - "RoadPoint", - "RoadPointDelay", - "RoadPointGradient", - "Self", - "SelfDelay", - "SelfGradient", - "SellSkin", - "ServerDialogSkin", - "ShopSkin", - "SkillsSkin", - "SocialCreatePopupSkin", - "SocialSkin", - "SpecialsSkin", - "SpeechSkin", - "SpellPopupSkin", - "SpellShortcutSkin", - "StatusPopupSkin", - "StatusSkin", - "StorageSkin", - "TextCommandEditorSkin", - "TextPopupSkin", - "TradeSkin", - "WhoIsOnlineSkin", - "emoteshortcut1", - "emoteshortcut2", - "emoteshortcut3", - "emoteshortcut4", - "emoteshortcut5", - "emoteshortcut6", - "emoteshortcut7", - "emoteshortcut8", - "emoteshortcut9", - "emoteshortcut10", - "emoteshortcut11", - "emoteshortcut12", - "emoteshortcut13", - "fastOpenGL", - "keyAutoCompleteChat", - "keyDeActivateChat", - "keyTargetClosest", - "keyWindowParty", - "mapalpha", - "port", - "shopBuyList", - "shopSellList", - "OutfitAwayIndex", - "playerHomes", - "remember", - "screenshotDirectory", - "" -}; - -void ConfigurationObject::setValue(const std::string &key, - const std::string &value) -{ - mOptions[key] = value; -} - -void ConfigurationObject::deleteKey(const std::string &key) -{ - mOptions.erase(key); -} - -void Configuration::setValue(const std::string &key, - const std::string &value) -{ - ConfigurationObject::setValue(key, value); - mUpdated = true; - - // Notify listeners - const ListenerMapIterator list = mListenerMap.find(key); - if (list != mListenerMap.end()) - { - Listeners listeners = list->second; - FOR_EACH (ListenerIterator, i, listeners) - (*i)->optionChanged(key); - } -} - -void Configuration::incValue(const std::string &key) -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - setValue(key, (iter != mOptions.end()) - ? atoi(iter->second.c_str()) + 1 : 1); -} - -void Configuration::setSilent(const std::string &key, - const std::string &value) -{ - ConfigurationObject::setValue(key, value); -} - -std::string ConfigurationObject::getValue(const std::string &key, - const std::string &deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - return ((iter != mOptions.end()) ? iter->second : deflt); -} - -int ConfigurationObject::getValue(const std::string &key, - const int deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - return (iter != mOptions.end()) ? atoi(iter->second.c_str()) : deflt; -} - -int ConfigurationObject::getValueInt(const std::string &key, - const int deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - return (iter != mOptions.end()) ? atoi(iter->second.c_str()) : deflt; -} - -bool ConfigurationObject::getValueBool(const std::string &key, - const bool deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - if (iter != mOptions.end()) - return atoi(iter->second.c_str()) != 0 ? true : false; - return deflt; -} - -unsigned ConfigurationObject::getValue(const std::string &key, - const unsigned deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - return (iter != mOptions.end()) ? CAST_U32( - atol(iter->second.c_str())) : deflt; -} - -double ConfigurationObject::getValue(const std::string &key, - const double deflt) const -{ - GETLOG(); - const Options::const_iterator iter = mOptions.find(key); - return (iter != mOptions.end()) ? atof(iter->second.c_str()) : deflt; -} - -void ConfigurationObject::deleteList(const std::string &name) -{ - for (ConfigurationList::const_iterator - it = mContainerOptions[name].begin(); - it != mContainerOptions[name].end(); ++it) - { - delete *it; - } - - mContainerOptions[name].clear(); -} - -void ConfigurationObject::clear() -{ - for (std::map<std::string, ConfigurationList>::const_iterator - it = mContainerOptions.begin(); - it != mContainerOptions.end(); ++it) - { - deleteList(it->first); - } - mOptions.clear(); - mContainerOptions.clear(); -} - -ConfigurationObject::ConfigurationObject() : - mOptions(), -#ifdef DEBUG_CONFIG - mContainerOptions(), - mLogKeys(false), - mIsMain(false) -#else // DEBUG_CONFIG - - mContainerOptions() -#endif // DEBUG_CONFIG -{ -} - -ConfigurationObject::~ConfigurationObject() -{ - clear(); -} - -Configuration::Configuration() : - ConfigurationObject(), - mListenerMap(), - mConfigPath(), - mDefaultsData(), - mDirectory(), - mFilename(), - mUseResManager(UseVirtFs_false), - mUpdated(false) -{ -#ifdef DEBUG_CONFIG - mLogKeys = false; - mIsMain = false; -#endif // DEBUG_CONFIG -} - -void Configuration::cleanDefaults() -{ - for (DefaultsData::const_iterator iter = mDefaultsData.begin(); - iter != mDefaultsData.end(); - ++iter) - { - delete iter->second; - } - mDefaultsData.clear(); -} - -Configuration::~Configuration() -{ - cleanDefaults(); -} - -void Configuration::unload() -{ - cleanDefaults(); - mConfigPath.clear(); - mDirectory.clear(); - mFilename.clear(); - mUseResManager = UseVirtFs_false; - ConfigurationObject::clear(); -} - -int Configuration::getIntValue(const std::string &key) const -{ - GETLOG(); - int defaultValue = 0; - const Options::const_iterator iter = mOptions.find(key); - if (iter == mOptions.end()) - { - const DefaultsData::const_iterator itdef - = mDefaultsData.find(key); - - if (itdef != mDefaultsData.end() && (itdef->second != nullptr)) - { - const VariableData *const data = itdef->second; - const VariableData::DataType type = static_cast< - VariableData::DataType>(data->getType()); - if (type == VariableData::DATA_INT) - { - defaultValue = (static_cast<const IntData*>( - data))->getData(); - } - else if (type == VariableData::DATA_STRING) - { - defaultValue = atoi((static_cast<const StringData*>( - data))->getData().c_str()); - } - else if (type == VariableData::DATA_BOOL) - { - if ((static_cast<const BoolData*>(data))->getData()) - defaultValue = 1; - else - defaultValue = 0; - } - else if (type == VariableData::DATA_FLOAT) - { - defaultValue = CAST_S32( - (static_cast<const FloatData*>(data))->getData()); - } - } - else - { - reportAlways( - "%s: No integer value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - else - { - defaultValue = atoi(iter->second.c_str()); - } - return defaultValue; -} - -int Configuration::resetIntValue(const std::string &key) -{ - GETLOG(); - int defaultValue = 0; - const DefaultsData::const_iterator itdef = mDefaultsData.find(key); - if (itdef == mDefaultsData.end()) - { - reportAlways("%s: No integer value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - else - { - const VariableData *const data = itdef->second; - if (data != nullptr && - data->getType() == VariableData::DATA_INT) - { - defaultValue = (static_cast<const IntData*>( - data))->getData(); - } - else - { - reportAlways("%s: No integer value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - setValue(key, defaultValue); - return defaultValue; -} - -std::string Configuration::getStringValue(const std::string &key) const -{ - GETLOG(); - std::string defaultValue; - const Options::const_iterator iter = mOptions.find(key); - if (iter == mOptions.end()) - { - const DefaultsData::const_iterator - itdef = mDefaultsData.find(key); - - if (itdef != mDefaultsData.end() && - (itdef->second != nullptr)) - { - const VariableData *const data = itdef->second; - const VariableData::DataType type = static_cast< - VariableData::DataType>(data->getType()); - if (type == VariableData::DATA_STRING) - { - defaultValue = (static_cast<const StringData*>( - data))->getData(); - } - else if (type == VariableData::DATA_BOOL) - { - if ((static_cast<const BoolData*>(data))->getData()) - defaultValue = "1"; - else - defaultValue = "0"; - } - else if (type == VariableData::DATA_INT) - { - defaultValue = toString((static_cast<const IntData*>( - data))->getData()); - } - else if (type == VariableData::DATA_FLOAT) - { - defaultValue = toString((static_cast<const FloatData*>( - data))->getData()); - } - } - else - { - reportAlways("%s: No string value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - else - { - defaultValue = iter->second; - } - return defaultValue; -} - - -float Configuration::getFloatValue(const std::string &key) const -{ - GETLOG(); - float defaultValue = 0.0F; - const Options::const_iterator iter = mOptions.find(key); - if (iter == mOptions.end()) - { - const DefaultsData::const_iterator itdef - = mDefaultsData.find(key); - - if (itdef != mDefaultsData.end() && - (itdef->second != nullptr)) - { - const VariableData *const data = itdef->second; - const VariableData::DataType type = static_cast< - VariableData::DataType>(data->getType()); - if (type == VariableData::DATA_FLOAT) - { - defaultValue = static_cast<float>( - (static_cast<const FloatData*>(data))->getData()); - } - else if (type == VariableData::DATA_STRING) - { - defaultValue = static_cast<float>(atof(( - static_cast<const StringData*>( - data))->getData().c_str())); - } - else if (type == VariableData::DATA_BOOL) - { - if ((static_cast<const BoolData*>(data))->getData()) - defaultValue = 1; - else - defaultValue = 0; - } - else if (type == VariableData::DATA_INT) - { - defaultValue = static_cast<float>(( - static_cast<const IntData*>( - data))->getData()); - } - } - else - { - reportAlways("%s: No float value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - else - { - defaultValue = static_cast<float>(atof(iter->second.c_str())); - } - return defaultValue; -} - -bool Configuration::getBoolValue(const std::string &key) const -{ - GETLOG(); - bool defaultValue = false; - const Options::const_iterator iter = mOptions.find(key); - if (iter == mOptions.end()) - { - const DefaultsData::const_iterator itdef - = mDefaultsData.find(key); - - if (itdef != mDefaultsData.end() && - (itdef->second != nullptr)) - { - const VariableData *const data = itdef->second; - const VariableData::DataType type = static_cast< - VariableData::DataType>(data->getType()); - if (type == VariableData::DATA_BOOL) - { - defaultValue = (static_cast<const BoolData*>( - data))->getData(); - } - else if (type == VariableData::DATA_INT) - { - if ((static_cast<const IntData*>(data))->getData() != 0) - defaultValue = true; - else - defaultValue = false; - } - else if (type == VariableData::DATA_STRING) - { - if ((static_cast<const StringData*>( - data))->getData() != "0") - { - defaultValue = true; - } - else - { - defaultValue = false; - } - } - if (type == VariableData::DATA_FLOAT) - { - if (CAST_S32((static_cast<const FloatData*>( - data))->getData()) != 0) - { - defaultValue = true; - } - else - { - defaultValue = false; - } - } - } - else - { - reportAlways( - "%s: No boolean value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - else - { - defaultValue = getBoolFromString(iter->second); - } - - return defaultValue; -} - -bool Configuration::resetBoolValue(const std::string &key) -{ - GETLOG(); - bool defaultValue = false; - const DefaultsData::const_iterator itdef = mDefaultsData.find(key); - - if (itdef == mDefaultsData.end()) - { - reportAlways("%s: No boolean value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - else - { - const VariableData *const data = itdef->second; - if (data != nullptr && - data->getType() == VariableData::DATA_BOOL) - { - defaultValue = (static_cast<const BoolData*>(data))->getData(); - } - else - { - reportAlways("%s: No boolean value in registry for key %s", - mConfigPath.c_str(), - key.c_str()); - } - } - - setValue(key, defaultValue); - return defaultValue; -} - - -void ConfigurationObject::initFromXML(XmlNodeConstPtrConst parentNode) -{ - clear(); - - if (parentNode == nullptr) - return; - - for_each_xml_child_node(node, parentNode) - { - if (xmlNameEqual(node, "list")) - { - // list option handling - const std::string name = XML::getProperty(node, - "name", std::string()); - - for_each_xml_child_node(subnode, node) - { - if (xmlNameEqual(subnode, name.c_str()) && - xmlTypeEqual(subnode, XML_ELEMENT_NODE)) - { - ConfigurationObject *const cobj = new ConfigurationObject; - cobj->initFromXML(subnode); // recurse - mContainerOptions[name].push_back(cobj); - } - } - } - else if (xmlNameEqual(node, "option")) - { - // single option handling - const std::string name = XML::getProperty(node, - "name", std::string()); - if (!name.empty()) - { - mOptions[name] = XML::getProperty(node, - "value", std::string()); - } - } // otherwise ignore - } -} - -void Configuration::init(const std::string &filename, - const UseVirtFs useResManager, - const SkipError skipError) -{ - cleanDefaults(); - clear(); - mFilename = filename; - mUseResManager = useResManager; - - if (useResManager == UseVirtFs_true) - { - mConfigPath = "virtfs://" + filename; - mDirectory.clear(); - if (VirtFs::exists(filename) == false) - { - logger->log("Warning: No configuration file (%s)", - filename.c_str()); - return; - } - } - else - { - mConfigPath = filename; - logger->log1("init 1"); - mDirectory = getRealPath(getFileDir(filename)); - if (Files::existsLocal(filename) == false) - { - logger->log("Warning: No configuration file (%s)", - filename.c_str()); - return; - } - } - - XML::Document doc(filename, - useResManager, - skipError); - logger->log1("init 2"); - if (doc.rootNode() == nullptr) - { - logger->log("Couldn't open configuration file: %s", filename.c_str()); - return; - } - - XmlNodeConstPtrConst rootNode = doc.rootNode(); - - if ((rootNode == nullptr) || !xmlNameEqual(rootNode, "configuration")) - { - logger->log("Warning: No configuration file (%s)", filename.c_str()); - return; - } - - initFromXML(rootNode); -} - -void Configuration::reInit() -{ - XML::Document doc(mFilename, mUseResManager, SkipError_false); - if (doc.rootNode() == nullptr) - { - logger->log("Couldn't open configuration file: %s", mFilename.c_str()); - return; - } - - XmlNodeConstPtrConst rootNode = doc.rootNode(); - - if ((rootNode == nullptr) || !xmlNameEqual(rootNode, "configuration")) - { - logger->log("Warning: No configuration file (%s)", mFilename.c_str()); - return; - } - - initFromXML(rootNode); -} - -void ConfigurationObject::writeToXML(XmlTextWriterPtr writer) -{ - FOR_EACH (Options::const_iterator, i, mOptions) - { -#ifdef DEBUG_CONFIG - if (mLogKeys) - { - if (optionsCount.find(i->first) == optionsCount.end()) - logger->log("unused configuration option: " + i->first); - } -#endif // DEBUG_CONFIG - - XmlTextWriterStartElement(writer, "option"); - XmlTextWriterWriteAttribute(writer, "name", i->first.c_str()); - XmlTextWriterWriteAttribute(writer, "value", i->second.c_str()); - XmlTextWriterEndElement(writer); - } - - for (std::map<std::string, ConfigurationList>::const_iterator - it = mContainerOptions.begin(), it_fend = mContainerOptions.end(); - it != it_fend; ++ it) - { - const char *const name = it->first.c_str(); - - XmlTextWriterStartElement(writer, "list"); - XmlTextWriterWriteAttribute(writer, "name", name); - - // recurse on all elements - FOR_EACH (ConfigurationList::const_iterator, elt_it, it->second) - { - XmlTextWriterStartElement(writer, name); - if (*elt_it != nullptr) - (*elt_it)->writeToXML(writer); - XmlTextWriterEndElement(writer); - } - - XmlTextWriterEndElement(writer); - } -} - -void Configuration::writeUpdated() -{ - if (mUpdated) - write(); -} - -void Configuration::write() -{ - BLOCK_START("Configuration::write") - if (mConfigPath.empty()) - { - BLOCK_END("Configuration::write") - return; - } - - mUpdated = false; - // Do not attempt to write to file that cannot be opened for writing - FILE *const testFile = fopen(mConfigPath.c_str(), "w"); - if (testFile == nullptr) - { - reportAlways("Configuration::write() couldn't open %s for writing", - mConfigPath.c_str()); - BLOCK_END("Configuration::write") - return; - } - fclose(testFile); - - XmlTextWriterPtr writer = XmlNewTextWriterFilename( - mConfigPath.c_str(), 0); - - if (writer == nullptr) - { - logger->log1("Configuration::write() error while creating writer"); - BLOCK_END("Configuration::write") - return; - } - - logger->log1("Configuration::write() writing configuration..."); - - XmlTextWriterSetIndent(writer, 1); - XmlTextWriterStartDocument(writer, nullptr, nullptr, nullptr); -// xmlTextWriterStartDocument(writer, nullptr, "utf8", nullptr); - XmlTextWriterStartRootElement(writer, "configuration"); - - writeToXML(writer); - - XmlTextWriterEndDocument(writer); - XmlSaveTextWriterFilename(writer, - mConfigPath.c_str()); - XmlFreeTextWriter(writer); - BLOCK_END("Configuration::write") -} - -void Configuration::addListener(const std::string &key, - ConfigListener *const listener) -{ - mListenerMap[key].push_front(listener); -} - -void Configuration::removeListener(const std::string &key, - ConfigListener *const listener) -{ - mListenerMap[key].remove(listener); -} - -#ifdef ENABLE_CHECKS -void Configuration::checkListeners(ConfigListener *const listener, - const char *const file, - const unsigned line) -{ - FOR_EACH (ListenerMapIterator, it, mListenerMap) - { - Listeners listeners = it->second; - FOR_EACH (ListenerIterator, it2, listeners) - { - if (*it2 == listener) - { - logger->log("detected not cleaned listener: %p, %s:%u", - static_cast<void*>(listener), file, line); - exit(1); - } - } - } -} -#endif // ENABLE_CHECKS - -void Configuration::removeListeners(ConfigListener *const listener) -{ - FOR_EACH (ListenerMapIterator, it, mListenerMap) - (it->second).remove(listener); -} - -void Configuration::removeOldKeys() -{ - if (mOptions.find(unusedKeys[0]) != mOptions.end() || - mOptions.find(unusedKeys[1]) != mOptions.end() || - mOptions.find(unusedKeys[2]) != mOptions.end()) - { - int f = 0; - while (!unusedKeys[f].empty()) - { - deleteKey(unusedKeys[f]); - logger->log("remove unused key: " + unusedKeys[f]); - f ++; - } - for (f = 0; f < 80; f ++) - { - const std::string str = toString(f); - deleteKey("Outfit" + str); - deleteKey("OutfitUnequip" + str); - deleteKey("commandShortcutCmd" + str); - deleteKey("commandShortcutFlags" + str); - deleteKey("commandShortcutSymbol" + str); - deleteKey("drop" + str); - deleteKey("shortcut" + str); - } - } -} |