From e000cdf9d31433c4e90a8b59415de5ac8377005d Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 8 Jul 2008 04:54:10 +0200 Subject: Verschachtelte Konfigurationen (D?mon-Liste) --- src/Common/ConfigManager.cpp | 62 ++++++++++++++++++++++++++++++++++++-------- src/Common/ConfigManager.h | 5 ++-- src/Core/ConfigManager.cpp | 50 ++++++++++++++++++++++++----------- src/Core/ConfigManager.h | 7 ++--- src/Core/DaemonInfo.h | 45 ++++++++++++++++++++++++++++++++ src/mad-core.conf | 4 +++ 6 files changed, 141 insertions(+), 32 deletions(-) create mode 100644 src/Core/DaemonInfo.h (limited to 'src') 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 +#include namespace Mad { namespace Common { bool ConfigManager::loadFile(const std::string &filename) { std::ifstream file(filename.c_str()); + std::vector 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 +#include 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 §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 §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 #include #include @@ -36,17 +37,17 @@ class ConfigManager : public Common::ConfigManager { unsigned short methods; std::vector listeners; + std::vector daemons; protected: - virtual bool parseLine(const std::string &key, const std::string &value); + virtual bool parseLine(const std::vector §ion, const std::string &key, const std::string &value); public: ConfigManager(); virtual ~ConfigManager(); const std::vector& getListenerAddresses() const {return listeners;} - - //virtual const std::string& getValue(const std::string &value) const; + const std::vector& 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 . + */ + +#ifndef MAD_CORE_DAEMONINFO_H_ +#define MAD_CORE_DAEMONINFO_H_ + +#include + +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 +} -- cgit v1.2.3