summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Schiffer <matthias@gamezock.de>2008-07-08 04:54:10 +0200
committerMatthias Schiffer <matthias@gamezock.de>2008-07-08 04:54:10 +0200
commite000cdf9d31433c4e90a8b59415de5ac8377005d (patch)
tree7cf035fec531837c2ca6fc27c2accdee8e346fe7
parent30f0cb9154306938250bd77ce2f0a9471065732a (diff)
downloadmad-e000cdf9d31433c4e90a8b59415de5ac8377005d.tar
mad-e000cdf9d31433c4e90a8b59415de5ac8377005d.zip
Verschachtelte Konfigurationen (D?mon-Liste)
-rw-r--r--src/Common/ConfigManager.cpp62
-rw-r--r--src/Common/ConfigManager.h5
-rw-r--r--src/Core/ConfigManager.cpp50
-rw-r--r--src/Core/ConfigManager.h7
-rw-r--r--src/Core/DaemonInfo.h45
-rw-r--r--src/mad-core.conf4
6 files changed, 141 insertions, 32 deletions
diff --git a/src/Common/ConfigManager.cpp b/src/Common/ConfigManager.cpp
index 2159c6e..4d0e476 100644
--- a/src/Common/ConfigManager.cpp
+++ b/src/Common/ConfigManager.cpp
@@ -20,33 +20,73 @@
#include "ConfigManager.h"
#include "Util.h"
#include <fstream>
+#include <stdexcept>
namespace Mad {
namespace Common {
bool ConfigManager::loadFile(const std::string &filename) {
std::ifstream file(filename.c_str());
+ std::vector<std::string> section;
+ std::string line, key;
if(!file.good())
return false;
- while(!file.eof()) {
- std::string line;
+ while(!(file.eof() && line.empty())) {
+ std::string nextLine;
+ char bracket = 0;
- std::getline(file, line);
- line = Util::trim(line);
+ if(line.empty()) {
+ std::getline(file, line);
- if(line.empty() || line[0] == '#')
- continue;
+ size_t pos = line.find_first_of('#');
+ if(pos != std::string::npos)
+ line[pos] = 0;
- size_t pos = line.find_first_of(" \t");
+ line = Util::trim(line);
- if(pos == std::string::npos)
- parseLine(line);
- else
- parseLine(line.substr(0, pos), Util::trim(line.substr(pos)));
+ if(line.empty())
+ continue;
+ }
+
+ size_t pos = line.find_first_of("{}");
+
+ if(pos != std::string::npos) {
+ bracket = line[pos];
+ line = Util::trim(line.substr(0, pos));
+ try {
+ nextLine = Util::trim(line.substr(pos+1));
+ }
+ catch(std::out_of_range& e) {}
+ }
+
+ if(!line.empty()) {
+ pos = line.find_first_of(" \t");
+
+ if(pos == std::string::npos) {
+ key = line;
+ parseLine(section, key);
+ }
+ else {
+ key = line.substr(0, pos);
+ parseLine(section, key, Util::trim(line.substr(pos)));
+ }
+ }
+
+ switch(bracket) {
+ case '{':
+ section.push_back(key);
+ break;
+ case '}':
+ section.pop_back();
+ }
+
+ line = nextLine;
}
+ // TODO Depth check
+
return true;
}
diff --git a/src/Common/ConfigManager.h b/src/Common/ConfigManager.h
index ccbfbaa..68669d3 100644
--- a/src/Common/ConfigManager.h
+++ b/src/Common/ConfigManager.h
@@ -21,6 +21,7 @@
#define MAD_COMMON_CONFIGMANAGER_H_
#include <string>
+#include <vector>
namespace Mad {
namespace Common {
@@ -29,14 +30,12 @@ class ConfigManager {
protected:
ConfigManager() {}
- virtual bool parseLine(const std::string &key, const std::string &value = std::string()) = 0;
+ virtual bool parseLine(const std::vector<std::string> &section, const std::string &key, const std::string &value = std::string()) = 0;
bool loadFile(const std::string &filename);
public:
virtual ~ConfigManager() {}
-
- //virtual const std::string& getValue(const std::string &value) const = 0;
};
}
diff --git a/src/Core/ConfigManager.cpp b/src/Core/ConfigManager.cpp
index b358671..e1e5021 100644
--- a/src/Core/ConfigManager.cpp
+++ b/src/Core/ConfigManager.cpp
@@ -25,28 +25,48 @@
namespace Mad {
namespace Core {
-bool ConfigManager::parseLine(const std::string &key, const std::string &value) {
- if(Common::Util::tolower(key) == "configmethod") {
- if(Common::Util::tolower(value) == "mysql")
- methods |= (unsigned short)MYSQL;
- else
- return false;
- }
- else if(Common::Util::tolower(key) == "listen") {
- try {
- listeners.push_back(Net::IPAddress(value));
+bool ConfigManager::parseLine(const std::vector<std::string> &section, const std::string &key, const std::string &value) {
+ if(section.empty()) {
+ if(Common::Util::tolower(key) == "configmethod") {
+ if(Common::Util::tolower(value) == "mysql")
+ methods |= (unsigned short)MYSQL;
+ else
+ return false;
+ }
+ else if(Common::Util::tolower(key) == "daemon") {
+ daemons.push_back(DaemonInfo(value));
}
- catch(Net::InvalidAddressException &e) {
+ else if(Common::Util::tolower(key) == "listen") {
+ try {
+ listeners.push_back(Net::IPAddress(value));
+ }
+ catch(Net::InvalidAddressException &e) {
+ // TODO Logging
+ }
+ }
+ else {
// TODO Logging
+
+ return false;
}
+
+ return true;
}
- else {
- // TODO Logging
+ else if(section.size() == 1 && Common::Util::tolower(section[0]) == "daemon") {
+ if(Common::Util::tolower(key) == "ip")
+ daemons.back().setIP(value);
+ else {
+ // TODO Logging
+
+ return false;
+ }
- return false;
+ return true;
}
- return true;
+ // TODO Logging
+
+ return false;
}
ConfigManager::ConfigManager() {
diff --git a/src/Core/ConfigManager.h b/src/Core/ConfigManager.h
index 00c5933..6a5cf2c 100644
--- a/src/Core/ConfigManager.h
+++ b/src/Core/ConfigManager.h
@@ -20,6 +20,7 @@
#ifndef MAD_CORE_CONFIGMANAGER_H_
#define MAD_CORE_CONFIGMANAGER_H_
+#include "DaemonInfo.h"
#include <Common/ConfigManager.h>
#include <Net/IPAddress.h>
#include <vector>
@@ -36,17 +37,17 @@ class ConfigManager : public Common::ConfigManager {
unsigned short methods;
std::vector<Net::IPAddress> listeners;
+ std::vector<DaemonInfo> daemons;
protected:
- virtual bool parseLine(const std::string &key, const std::string &value);
+ virtual bool parseLine(const std::vector<std::string> &section, const std::string &key, const std::string &value);
public:
ConfigManager();
virtual ~ConfigManager();
const std::vector<Net::IPAddress>& getListenerAddresses() const {return listeners;}
-
- //virtual const std::string& getValue(const std::string &value) const;
+ const std::vector<DaemonInfo>& getDaemonList() const {return daemons;}
};
}
diff --git a/src/Core/DaemonInfo.h b/src/Core/DaemonInfo.h
new file mode 100644
index 0000000..b1dd2ff
--- /dev/null
+++ b/src/Core/DaemonInfo.h
@@ -0,0 +1,45 @@
+/*
+ * DaemonInfo.h
+ *
+ * Copyright (C) 2008 neoraider
+ *
+ * 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 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 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/>.
+ */
+
+#ifndef MAD_CORE_DAEMONINFO_H_
+#define MAD_CORE_DAEMONINFO_H_
+
+#include <string>
+
+namespace Mad {
+namespace Core {
+
+class DaemonInfo {
+ private:
+ std::string name;
+ std::string ip;
+
+ public:
+ DaemonInfo(const std::string& name0) : name(name0) {}
+
+ const std::string& getName() const {return name;}
+
+ void setIP(const std::string& ip0) {ip = ip0;}
+ const std::string& getIP() const {return ip;}
+};
+
+}
+}
+
+#endif /* MAD_CORE_DAEMONINFO_H_ */
diff --git a/src/mad-core.conf b/src/mad-core.conf
index 13d74f5..aced55c 100644
--- a/src/mad-core.conf
+++ b/src/mad-core.conf
@@ -1,3 +1,7 @@
ConfigMethod Mysql
Listen *
+
+Daemon ic01 {
+ IP 192.168.2.11
+}