summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/configreader.h25
-rw-r--r--include/socket.h2
-rw-r--r--include/users.h2
-rw-r--r--src/configparser.cpp21
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 &lt;connect allow&gt; and &lt;connect deny&gt; 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;