summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorErik Schilling <ablu.erikschilling@googlemail.com>2011-11-20 20:54:43 +0800
committerErik Schilling <ablu.erikschilling@googlemail.com>2011-11-21 00:51:08 +0800
commitefe49d70045098d067124ac5e9e2f9a73ecd78f1 (patch)
tree37c0a1ef59348eb8eede7b5eed2f46a2b3951d45 /src/common
parentdf82930fa5d5715289f52ab8c05bad39afce270f (diff)
downloadmanaserv-efe49d70045098d067124ac5e9e2f9a73ecd78f1.tar.gz
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.
Diffstat (limited to 'src/common')
-rw-r--r--src/common/configuration.cpp41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/common/configuration.cpp b/src/common/configuration.cpp
index 15ce676..2be6768 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,