diff options
author | Erik Schilling <ablu.erikschilling@googlemail.com> | 2011-11-20 20:54:43 +0800 |
---|---|---|
committer | Erik Schilling <ablu.erikschilling@googlemail.com> | 2011-11-21 00:51:08 +0800 |
commit | efe49d70045098d067124ac5e9e2f9a73ecd78f1 (patch) | |
tree | 37c0a1ef59348eb8eede7b5eed2f46a2b3951d45 | |
parent | df82930fa5d5715289f52ab8c05bad39afce270f (diff) | |
download | manaserv-efe49d70045098d067124ac5e9e2f9a73ecd78f1.tar.gz manaserv-efe49d70045098d067124ac5e9e2f9a73ecd78f1.tar.bz2 manaserv-efe49d70045098d067124ac5e9e2f9a73ecd78f1.tar.xz manaserv-efe49d70045098d067124ac5e9e2f9a73ecd78f1.zip |
Allow includes in configuration file.
You can now use <include file="myconfig.xml" /> to include a configuration file
into the main configuration.
Reviewed-by: Bjorn.
-rw-r--r-- | src/common/configuration.cpp | 41 |
1 files changed, 35 insertions, 6 deletions
diff --git a/src/common/configuration.cpp b/src/common/configuration.cpp index 15ce6763..2be6768c 100644 --- a/src/common/configuration.cpp +++ b/src/common/configuration.cpp @@ -21,6 +21,7 @@ #include <cmath> #include <map> +#include <set> #include <libxml/xmlreader.h> #include "common/configuration.h" @@ -35,24 +36,40 @@ static std::map< std::string, std::string > options; /**< Location of config file. */ static std::string configPath; +static std::set<std::string> processedFiles; -bool Configuration::initialize(const std::string &fileName) +static bool readFile(const std::string &fileName) { - if (fileName.empty()) - configPath = DEFAULT_CONFIG_FILE; + if (processedFiles.find(fileName) != processedFiles.end()) + { + LOG_WARN("Cycle include in configuration file '" << + fileName << "'."); + return false; + } else - configPath = fileName; + processedFiles.insert(fileName); - XML::Document doc(configPath, false); + XML::Document doc(fileName, false); xmlNodePtr node = doc.rootNode(); if (!node || !xmlStrEqual(node->name, BAD_CAST "configuration")) { - LOG_WARN("No configuration file '" << configPath.c_str() << "'."); + LOG_WARN("No configuration file '" << fileName.c_str() << "'."); return false; } for (node = node->xmlChildrenNode; node != NULL; node = node->next) { + if (xmlStrEqual(node->name, BAD_CAST "include")) + { + std::string file = XML::getProperty(node, "file", std::string()); + if (!readFile(file)) + { + LOG_WARN("Error ocurred while parsing included " << + "configuration file '" << file << "'."); + return false; + } + continue; + } if (!xmlStrEqual(node->name, BAD_CAST "option")) continue; if (!XML::hasProperty(node, "name") || !XML::hasProperty(node, "value")) @@ -64,6 +81,17 @@ bool Configuration::initialize(const std::string &fileName) if (!key.empty()) options[key] = value; } + return true; +} + +bool Configuration::initialize(const std::string &fileName) +{ + if (fileName.empty()) + configPath = DEFAULT_CONFIG_FILE; + else + configPath = fileName; + + readFile(configPath); LOG_INFO("Using config file: " << configPath); @@ -72,6 +100,7 @@ bool Configuration::initialize(const std::string &fileName) void Configuration::deinitialize() { + processedFiles.clear(); } std::string Configuration::getValue(const std::string &key, |