diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-05-29 15:54:49 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-05-29 15:54:49 +0300 |
commit | 88f71d6a8673932d178408e7632a6eea08623294 (patch) | |
tree | 0cc0c1d9bc663abaec614441164db86e88f878fe /src/configmanager.cpp | |
parent | 13dc76b540a0fa9bd62e3e996dd707b610e792e5 (diff) | |
download | plus-88f71d6a8673932d178408e7632a6eea08623294.tar.gz plus-88f71d6a8673932d178408e7632a6eea08623294.tar.bz2 plus-88f71d6a8673932d178408e7632a6eea08623294.tar.xz plus-88f71d6a8673932d178408e7632a6eea08623294.zip |
Move config related functions from client into configmanager.
Diffstat (limited to 'src/configmanager.cpp')
-rw-r--r-- | src/configmanager.cpp | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/src/configmanager.cpp b/src/configmanager.cpp new file mode 100644 index 000000000..745ef195a --- /dev/null +++ b/src/configmanager.cpp @@ -0,0 +1,322 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 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 "configmanager.h" + +#include "client.h" +#include "configuration.h" +#include "logger.h" +#include "settings.h" + +#include "being/beingspeech.h" +#include "being/playerrelations.h" + +#include "utils/files.h" +#include "utils/gettext.h" +#include "utils/mkdir.h" +#include "utils/paths.h" +#include "utils/physfstools.h" + +#include "render/renderers.h" + +#include "debug.h" + +/** + * Initializes the home directory. On UNIX and FreeBSD, ~/.mana is used. On + * Windows and other systems we use the current working directory. + */ +void ConfigManager::initServerConfig(const std::string &serverName) +{ + settings.serverConfigDir = settings.configDir + dirSeparator + serverName; + + if (mkdir_r(settings.serverConfigDir.c_str())) + { + // TRANSLATORS: directory creation error + logger->error(strprintf(_("%s doesn't exist and can't be created! " + "Exiting."), settings.serverConfigDir.c_str())); + } + const std::string configPath = settings.serverConfigDir + "/config.xml"; + FILE *configFile = fopen(configPath.c_str(), "r"); + if (!configFile) + { + configFile = fopen(configPath.c_str(), "wt"); + logger->log("Creating new server config: " + configPath); + } + if (configFile) + { + fclose(configFile); + serverConfig.init(configPath); + serverConfig.setDefaultValues(getConfigDefaults()); + logger->log("serverConfigPath: " + configPath); + } +} + +void ConfigManager::initConfiguration() +{ +#ifdef DEBUG_CONFIG + config.setIsMain(true); +#endif + + // Fill configuration with defaults + config.setValue("hwaccel", false); +#ifdef USE_OPENGL +#if (defined __APPLE__) + config.setValue("opengl", static_cast<int>(RENDER_NORMAL_OPENGL)); +#elif (defined ANDROID) + config.setValue("opengl", static_cast<int>(RENDER_GLES_OPENGL)); +#elif (defined WIN32) + config.setValue("opengl", static_cast<int>(RENDER_SAFE_OPENGL)); +#else + config.setValue("opengl", static_cast<int>(RENDER_SOFTWARE)); +#endif +#else + config.setValue("opengl", static_cast<int>(RENDER_SOFTWARE)); +#endif + config.setValue("screen", false); + config.setValue("sound", true); + config.setValue("guialpha", 0.8F); +// config.setValue("remember", true); + config.setValue("sfxVolume", 100); + config.setValue("musicVolume", 60); + config.setValue("fpslimit", 60); + std::string defaultUpdateHost = branding.getValue("defaultUpdateHost", ""); + if (!checkPath(defaultUpdateHost)) + defaultUpdateHost.clear(); + config.setValue("updatehost", defaultUpdateHost); + config.setValue("useScreenshotDirectorySuffix", true); + config.setValue("ChatLogLength", 128); + + std::string configPath; + + if (settings.options.test.empty()) + configPath = settings.configDir + "/config.xml"; + else + configPath = settings.configDir + "/test.xml"; + + FILE *configFile = fopen(configPath.c_str(), "r"); + if (!configFile) + { + configFile = fopen(configPath.c_str(), "wt"); + logger->log1("Creating new config"); + } + if (!configFile) + { + logger->log("Can't create %s. Using defaults.", configPath.c_str()); + } + else + { + fclose(configFile); + config.init(configPath); + logger->log1("init 3"); + config.setDefaultValues(getConfigDefaults()); + logger->log("configPath: " + configPath); + } +} + +void ConfigManager::backupConfig(const std::string &name) +{ + const std::string confName = std::string(settings.configDir).append( + "/").append(name).append(".bak"); + const int maxFileIndex = 5; + ::remove((confName + toString(maxFileIndex)).c_str()); + for (int f = maxFileIndex; f > 1; f --) + { + const std::string fileName1 = confName + toString(f - 1); + const std::string fileName2 = confName + toString(f); + Files::renameFile(fileName1, fileName2); + } + const std::string fileName3 = std::string(settings.configDir).append( + "/").append(name); + const std::string fileName4 = confName + toString(1); + Files::copyFile(fileName3, fileName4); +} + +#ifndef ANDROID +void ConfigManager::storeSafeParameters() +{ + bool tmpHwaccel; + RenderType tmpOpengl; + int tmpFpslimit; + int tmpAltFpslimit; + bool tmpSound; + int width; + int height; + std::string font; + std::string bFont; + std::string particleFont; + std::string helpFont; + std::string secureFont; + std::string npcFont; + std::string japanFont; + std::string chinaFont; + bool showBackground; + bool enableMumble; + bool enableMapReduce; + + isSafeMode = config.getBoolValue("safemode"); + if (isSafeMode) + logger->log1("Run in safe mode"); + + tmpOpengl = intToRenderType(config.getIntValue("opengl")); + + width = config.getIntValue("screenwidth"); + height = config.getIntValue("screenheight"); + tmpHwaccel = config.getBoolValue("hwaccel"); + + tmpFpslimit = config.getIntValue("fpslimit"); + tmpAltFpslimit = config.getIntValue("altfpslimit"); + tmpSound = config.getBoolValue("sound"); + + font = config.getStringValue("font"); + bFont = config.getStringValue("boldFont"); + particleFont = config.getStringValue("particleFont"); + helpFont = config.getStringValue("helpFont"); + secureFont = config.getStringValue("secureFont"); + npcFont = config.getStringValue("npcFont"); + japanFont = config.getStringValue("japanFont"); + chinaFont = config.getStringValue("chinaFont"); + + showBackground = config.getBoolValue("showBackground"); + enableMumble = config.getBoolValue("enableMumble"); + enableMapReduce = config.getBoolValue("enableMapReduce"); + + if (!settings.options.safeMode && !tmpOpengl) + { + // if video mode configured reset most settings to safe + config.setValue("hwaccel", false); + config.setValue("altfpslimit", 3); + config.setValue("sound", false); + config.setValue("safemode", true); + config.setValue("screenwidth", 640); + config.setValue("screenheight", 480); + config.setValue("font", "fonts/dejavusans.ttf"); + config.setValue("boldFont", "fonts/dejavusans-bold.ttf"); + config.setValue("particleFont", "fonts/dejavusans.ttf"); + config.setValue("helpFont", "fonts/dejavusansmono.ttf"); + config.setValue("secureFont", "fonts/dejavusansmono.ttf"); + config.setValue("npcFont", "fonts/dejavusans.ttf"); + config.setValue("japanFont", "fonts/mplus-1p-regular.ttf"); + config.setValue("chinaFont", "fonts/wqy-microhei.ttf"); + config.setValue("showBackground", false); + config.setValue("enableMumble", false); + config.setValue("enableMapReduce", false); + } + else + { + // if video mode not configured reset only video mode to safe + config.setValue("screenwidth", 640); + config.setValue("screenheight", 480); + } +#if defined(__APPLE__) + config.setValue("opengl", static_cast<int>(RENDER_NORMAL_OPENGL)); +#else + config.setValue("opengl", static_cast<int>(RENDER_SOFTWARE)); +#endif + + config.write(); + + if (settings.options.safeMode) + { + isSafeMode = true; + return; + } + + config.setValue("safemode", false); + if (!tmpOpengl) + { + config.setValue("hwaccel", tmpHwaccel); + config.setValue("opengl", static_cast<int>(tmpOpengl)); + config.setValue("fpslimit", tmpFpslimit); + config.setValue("altfpslimit", tmpAltFpslimit); + config.setValue("sound", tmpSound); + config.setValue("screenwidth", width); + config.setValue("screenheight", height); + config.setValue("font", font); + config.setValue("boldFont", bFont); + config.setValue("particleFont", particleFont); + config.setValue("helpFont", helpFont); + config.setValue("secureFont", secureFont); + config.setValue("npcFont", npcFont); + config.setValue("japanFont", japanFont); + config.setValue("chinaFont", chinaFont); + config.setValue("showBackground", showBackground); + config.setValue("enableMumble", enableMumble); + config.setValue("enableMapReduce", enableMapReduce); + } + else + { + config.setValue("opengl", static_cast<int>(tmpOpengl)); + config.setValue("screenwidth", width); + config.setValue("screenheight", height); + } +} +#endif + +void ConfigManager::checkConfigVersion() +{ + const int version = config.getIntValue("cfgver"); + if (version < 1) + { + if (config.getIntValue("fontSize") == 11) + config.deleteKey("fontSize"); + if (config.getIntValue("npcfontSize") == 13) + config.deleteKey("npcfontSize"); + } + if (version < 2) + { + if (config.getIntValue("screenButtonsSize") == 1) + config.deleteKey("screenButtonsSize"); + if (config.getIntValue("screenJoystickSize") == 1) + config.deleteKey("screenJoystickSize"); + } + if (version < 3) + { + config.setValue("audioFrequency", 44100); +#ifdef ANDROID + config.setValue("customcursor", false); +#endif + } + if (version < 4) + { +#ifdef ANDROID + config.setValue("showDidYouKnow", false); +#endif + } + if (version < 5) + { + if (config.getIntValue("speech") == BeingSpeech::TEXT_OVERHEAD) + { + config.setValue("speech", static_cast<int>( + BeingSpeech::NO_NAME_IN_BUBBLE)); + } + } + if (version < 6) + config.setValue("blur", false); + + if (version < 7) + config.setValue("download-music", true); + + if (version < 8) + config.deleteKey("videodetected"); + + config.setValue("cfgver", 8); +} |