diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Common/ConfigManager.cpp | 62 | ||||
-rw-r--r-- | src/Common/ConfigManager.h | 5 | ||||
-rw-r--r-- | src/Core/ConfigManager.cpp | 50 | ||||
-rw-r--r-- | src/Core/ConfigManager.h | 7 | ||||
-rw-r--r-- | src/Core/DaemonInfo.h | 45 | ||||
-rw-r--r-- | src/mad-core.conf | 4 |
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> §ion, 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> §ion, 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> §ion, 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 +} |