// NeL - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #include #include "configuration.h" // STL includes // NeL includes // #include #include #include #include // Project includes #include "snowballs_client.h" #include "snowballs_config.h" using namespace std; using namespace NLMISC; namespace SBCLIENT { void CConfiguration::setAndCallback(const std::string &varName, void (*cb)(CConfigFile::CVar &var)) { ConfigFile->setCallback(varName, cb); CConfigFile::CVar *varPtr = ConfigFile->getVarPtr(varName); if (!varPtr) { nlwarning("Missing config variable '%s'", varName.c_str()); } else { cb(*varPtr); } } void CConfiguration::dropCallback(const std::string &varName) { ConfigFile->setCallback(varName, NULL); } bool CConfiguration::init() { nlassert(!ConfigFile); ConfigFile = new CConfigFile(); nlassert(ConfigFile); ConfigFile->load(SBCLIENT_CONFIG_FILE); // set the search paths (kinda important) CConfigFile::CVar *var; var = ConfigFile->getVarPtr("SearchPaths"); uint varsize = var->size(); for (uint i = 0; i < varsize; ++i) CPath::addSearchPath(var->asString(i), true, false); var = ConfigFile->getVarPtr("RemapExtensions"); varsize = var->size(); for (uint i = 0; i < varsize; i += 2) CPath::remapExtension(var->asString(i), var->asString(i + 1), true); return true; } bool CConfiguration::release() { // save and release the config file if (ConfigFile) { if (ConfigFile->exists("SaveConfig") && ConfigFile->getVarPtr("SaveConfig")->asBool()) { ConfigFile->save(); } delete ConfigFile; ConfigFile = NULL; } else nlwarning("!ConfigFile"); // release the search paths etc CPath::releaseInstance(); return true; } void CConfiguration::updateUtilities() { CConfigFile::checkConfigFiles(); } float CConfiguration::getValue(const string &varName, float defaultValue) { if (ConfigFile->exists(varName)) return ConfigFile->getVar(varName).asFloat(); CConfigFile::CVar varToCopy; varToCopy.forceAsDouble((double)defaultValue); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } double CConfiguration::getValue(const string &varName, double defaultValue) { if (ConfigFile->exists(varName)) return ConfigFile->getVar(varName).asDouble(); CConfigFile::CVar varToCopy; varToCopy.forceAsDouble(defaultValue); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } int CConfiguration::getValue(const string &varName, int defaultValue) { if (ConfigFile->exists(varName)) return ConfigFile->getVar(varName).asInt(); CConfigFile::CVar varToCopy; varToCopy.forceAsInt(defaultValue); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } string CConfiguration::getValue(const string &varName, const string &defaultValue) { if (ConfigFile->exists(varName)) return ConfigFile->getVar(varName).asString(); CConfigFile::CVar varToCopy; varToCopy.forceAsString(defaultValue); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } ucstring CConfiguration::getValue(const string &varName, const ucstring &defaultValue) { if (ConfigFile->exists(varName)) return ucstring::makeFromUtf8(ConfigFile->getVar(varName).asString()); CConfigFile::CVar varToCopy; varToCopy.forceAsString(defaultValue.toUtf8()); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } bool CConfiguration::getValue(const string &varName, bool defaultValue) { if (ConfigFile->exists(varName)) return ConfigFile->getVar(varName).asBool(); CConfigFile::CVar varToCopy; varToCopy.forceAsInt(defaultValue ? 1 : 0); ConfigFile->insertVar(varName, varToCopy); return defaultValue; } CRGBA CConfiguration::getValue(const string &varName, const CRGBA &defaultValue) { if (ConfigFile->exists(varName)) { return getValue(ConfigFile->getVar(varName), defaultValue); } else { // create a new value only if one doesn't exist CConfigFile::CVar varToCopy; varToCopy.forceAsInt(defaultValue.R); varToCopy.setAsInt(defaultValue.G, 1); varToCopy.setAsInt(defaultValue.B, 2); varToCopy.setAsInt(defaultValue.A, 3); ConfigFile->insertVar(varName, varToCopy); } return defaultValue; } CRGBA CConfiguration::getValue(const CConfigFile::CVar &var, const CRGBA &defaultValue) { if (var.size() >= 3) { if (var.size() > 4) nlwarning("RGBA value in config value '%s' is too long, ignoring unused values"); return CRGBA(var.asInt(0), var.asInt(1), var.asInt(2), var.size() >= 4 ? var.asInt(3) : 255); } nlwarning("Invalid RGBA value in config value '%s', reverting to default { %i, %i, %i, %i }", var.Name.c_str(), (sint)defaultValue.R, (sint)defaultValue.G, (sint)defaultValue.B, (sint)defaultValue.A); return defaultValue; } } /* namespace SBCLIENT */ /* end of file */