diff options
-rw-r--r-- | include/configreader.h | 25 | ||||
-rw-r--r-- | include/socket.h | 2 | ||||
-rw-r--r-- | include/users.h | 2 | ||||
-rw-r--r-- | src/configparser.cpp | 21 |
4 files changed, 39 insertions, 11 deletions
diff --git a/include/configreader.h b/include/configreader.h index b0985f1b5..54d9f7053 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -37,24 +37,39 @@ typedef std::vector<std::string> file_cache; */ typedef std::pair<std::string, std::string> KeyVal; -struct CoreExport ConfigTag : public refcountbase +/** Structure representing a single <tag> in config */ +class CoreExport ConfigTag : public refcountbase { + std::vector<KeyVal> items; + public: const std::string tag; const std::string src_name; const int src_line; - std::vector<KeyVal> items; - - ConfigTag(const std::string& Tag, const std::string& file, int line) - : tag(Tag), src_name(file), src_line(line) {} + /** Get the value of an option, using def if it does not exist */ std::string getString(const std::string& key, const std::string& def = ""); + /** Get the value of an option, using def if it does not exist */ long getInt(const std::string& key, long def = 0); + /** Get the value of an option, using def if it does not exist */ double getFloat(const std::string& key, double def = 0); + /** Get the value of an option, using def if it does not exist */ bool getBool(const std::string& key, bool def = false); + /** Get the value of an option + * @param key The option to get + * @param value The location to store the value (unmodified if does not exist) + * @param allow_newline Allow newlines in the option (normally replaced with spaces) + * @return true if the option exists + */ bool readString(const std::string& key, std::string& value, bool allow_newline = false); std::string getTagLocation(); + + /** Create a new ConfigTag, giving access to the private KeyVal item list */ + static ConfigTag* create(const std::string& Tag, const std::string& file, int line, + std::vector<KeyVal>*&items); + private: + ConfigTag(const std::string& Tag, const std::string& file, int line); }; /** An entire config file, built up of KeyValLists diff --git a/include/socket.h b/include/socket.h index bfde750ea..448d79e9f 100644 --- a/include/socket.h +++ b/include/socket.h @@ -131,7 +131,7 @@ namespace irc } } -struct ConfigTag; +class ConfigTag; /** This class handles incoming connections on client ports. * It will create a new User for every valid connection * and assign it a file descriptor. diff --git a/include/users.h b/include/users.h index fa56abc0e..8fac0d108 100644 --- a/include/users.h +++ b/include/users.h @@ -59,7 +59,7 @@ enum RegistrationState { /* Required forward declaration */ class Channel; class UserResolver; -struct ConfigTag; +class ConfigTag; class OperInfo; /** Holds information relevent to <connect allow> and <connect deny> tags in the config file. diff --git a/src/configparser.cpp b/src/configparser.cpp index 22c3679ab..44eb117a8 100644 --- a/src/configparser.cpp +++ b/src/configparser.cpp @@ -84,7 +84,7 @@ struct Parser unget(ch); } - bool kv() + bool kv(std::vector<KeyVal>* items) { std::string key; nextword(key); @@ -138,7 +138,7 @@ struct Parser break; value.push_back(ch); } - tag->items.push_back(KeyVal(key, value)); + items->push_back(KeyVal(key, value)); return true; } @@ -157,9 +157,10 @@ struct Parser if (name.empty()) throw CoreException("Empty tag name"); - tag = new ConfigTag(name, current.filename, current.line); + std::vector<KeyVal>* items; + tag = ConfigTag::create(name, current.filename, current.line, items); - while (kv()); + while (kv(items)); if (name == "include") { @@ -376,6 +377,18 @@ std::string ConfigTag::getTagLocation() return src_name + ":" + ConvToStr(src_line); } +ConfigTag* ConfigTag::create(const std::string& Tag, const std::string& file, int line, std::vector<KeyVal>*&items) +{ + ConfigTag* rv = new ConfigTag(Tag, file, line); + items = &rv->items; + return rv; +} + +ConfigTag::ConfigTag(const std::string& Tag, const std::string& file, int line) + : tag(Tag), src_name(file), src_line(line) +{ +} + std::string OperInfo::getConfig(const std::string& key) { std::string rv; |