From f3f570b4fa14dd375ad4a06bddca8f365fb32c55 Mon Sep 17 00:00:00 2001 From: peavey Date: Tue, 26 Dec 2006 01:48:55 +0000 Subject: Also add support for default values for ConfValueBool and ConfValueInteger in configreader, and for ReadFlag and ReadInteger in modules. git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6116 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/configreader.h | 5 +++++ include/modules.h | 29 ++++++++++++++++++++++++----- src/configreader.cpp | 45 ++++++++++++++++++++++++++++++++++++++------- src/modules.cpp | 17 ++++++++++++++--- 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/include/configreader.h b/include/configreader.h index d814a398e..5e8c62e06 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -152,6 +152,7 @@ struct MultiConfig { const char* tag; char* items[12]; + char* items_default[12]; int datatype[12]; MultiNotify init_function; MultiValidator validation_function; @@ -581,16 +582,20 @@ class ServerConfig : public Extensible /** Tries to convert the value to an integer and write it to 'result' */ bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, int index, int &result); + bool ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index, int &result); /** Tries to convert the value to an integer and write it to 'result' */ bool ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, int &result); + bool ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index, int &result); /** Returns true if the value exists and has a true value, false otherwise */ bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, int index); + bool ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index); /** Returns true if the value exists and has a true value, false otherwise */ bool ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, int index); + bool ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index); /** Returns the number of occurences of tag in the config file */ diff --git a/include/modules.h b/include/modules.h index 8f5462b3a..9928ad326 100644 --- a/include/modules.h +++ b/include/modules.h @@ -1397,21 +1397,30 @@ class ConfigReader : public classbase /** Retrieves a value from the config file. * This method retrieves a value from the config file. Where multiple copies of the tag - * exist in the config file, index indicates which of the values to retrieve. If the - * tag is not found the default value is returned instead. + * exist in the config file, index indicates which of the values to retrieve. */ - std::string ReadValue(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool allow_linefeeds = false); + std::string ReadValue(const std::string &tag, const std::string &name, int index, bool allow_linefeeds = false); /** Retrieves a value from the config file. * This method retrieves a value from the config file. Where multiple copies of the tag - * exist in the config file, index indicates which of the values to retrieve. + * exist in the config file, index indicates which of the values to retrieve. If the + * tag is not found the default value is returned instead. */ - std::string ReadValue(const std::string &tag, const std::string &name, int index, bool allow_linefeeds = false); + std::string ReadValue(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool allow_linefeeds = false); + /** Retrieves a boolean value from the config file. * This method retrieves a boolean value from the config file. Where multiple copies of the tag * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes" * and "true" in the config file count as true to ReadFlag, and any other value counts as false. */ bool ReadFlag(const std::string &tag, const std::string &name, int index); + /** Retrieves a boolean value from the config file. + * This method retrieves a boolean value from the config file. Where multiple copies of the tag + * exist in the config file, index indicates which of the values to retrieve. The values "1", "yes" + * and "true" in the config file count as true to ReadFlag, and any other value counts as false. + * If the tag is not found, the default value is used instead. + */ + bool ReadFlag(const std::string &tag, const std::string &name, const std::string &default_value, int index); + /** Retrieves an integer value from the config file. * This method retrieves an integer value from the config file. Where multiple copies of the tag * exist in the config file, index indicates which of the values to retrieve. Any invalid integer @@ -1421,6 +1430,16 @@ class ConfigReader : public classbase * will return CONF_NOT_UNSIGNED */ long ReadInteger(const std::string &tag, const std::string &name, int index, bool needs_unsigned); + /** Retrieves an integer value from the config file. + * This method retrieves an integer value from the config file. Where multiple copies of the tag + * exist in the config file, index indicates which of the values to retrieve. Any invalid integer + * values in the tag will cause the objects error value to be set, and any call to GetError() will + * return CONF_INVALID_NUMBER to be returned. needs_unsigned is set if the number must be unsigned. + * If a signed number is placed into a tag which is specified unsigned, 0 will be returned and GetError() + * will return CONF_NOT_UNSIGNED. If the tag is not found, the default value is used instead. + */ + long ReadInteger(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool needs_unsigned); + /** Returns the last error to occur. * Valid errors can be found by looking in modules.h. Any nonzero value indicates an error condition. * A call to GetError() resets the error flag back to 0. diff --git a/src/configreader.cpp b/src/configreader.cpp index 0c5949e49..7741b9d9f 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -643,52 +643,62 @@ void ServerConfig::Read(bool bail, userrec* user) {"connect", {"allow", "deny", "password", "timeout", "pingfreq", "flood", "threshold", "sendq", "recvq", "localmax", "globalmax", NULL}, + {"", "", "", "", "", "", "", "", "", "", "", NULL}, {DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER, DT_INTEGER}, InitConnect, DoConnect, DoneConnect}, {"uline", {"server", NULL}, + {"", NULL}, {DT_CHARPTR}, InitULine,DoULine,DoneULine}, {"banlist", {"chan", "limit", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_INTEGER}, InitMaxBans, DoMaxBans, DoneMaxBans}, {"module", {"name", NULL}, + {"", NULL}, {DT_CHARPTR}, InitModule, DoModule, DoneModule}, {"badip", {"reason", "ipmask", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoZLine, DoneXLine}, {"badnick", {"reason", "nick", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoQLine, DoneXLine}, {"badhost", {"reason", "host", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoKLine, DoneXLine}, {"exception", {"reason", "host", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoELine, DoneXLine}, {"type", {"name", "classes", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitTypes, DoType, DoneClassesAndTypes}, {"class", {"name", "commands", NULL}, + {"", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitClasses, DoClass, DoneClassesAndTypes}, @@ -791,7 +801,7 @@ void ServerConfig::Read(bool bail, userrec* user) case DT_CHARPTR: { char item[MAXBUF]; - if (ConfValue(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], tagnum, item, MAXBUF, allow_newlines)) + if (ConfValue(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item, MAXBUF, allow_newlines)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem("")); @@ -800,7 +810,7 @@ void ServerConfig::Read(bool bail, userrec* user) case DT_INTEGER: { int item = 0; - if (ConfValueInteger(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], tagnum, item)) + if (ConfValueInteger(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum, item)) vl.push_back(ValueItem(item)); else vl.push_back(ValueItem(0)); @@ -808,7 +818,7 @@ void ServerConfig::Read(bool bail, userrec* user) break; case DT_BOOLEAN: { - bool item = ConfValueBool(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], tagnum); + bool item = ConfValueBool(this->config_data, MultiValues[Index].tag, MultiValues[Index].items[valuenum], MultiValues[Index].items_default[valuenum], tagnum); vl.push_back(ValueItem(item)); } break; @@ -1325,29 +1335,50 @@ bool ServerConfig::ConfValue(ConfigDataHash &target, const std::string &tag, con bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, int index, int &result) { - return ConfValueInteger(target, std::string(tag), std::string(var), index, result); + return ConfValueInteger(target, std::string(tag), std::string(var), "", index, result); +} + +bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index, int &result) +{ + return ConfValueInteger(target, std::string(tag), std::string(var), std::string(default_value), index, result); } bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, int &result) +{ + return ConfValueInteger(target, tag, var, "", index, result); +} + +bool ServerConfig::ConfValueInteger(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index, int &result) { std::string value; std::istringstream stream; - bool r = ConfValue(target, tag, var, index, value); + bool r = ConfValue(target, tag, var, default_value, index, value); stream.str(value); if(!(stream >> result)) return false; return r; } + bool ServerConfig::ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, int index) { - return ConfValueBool(target, std::string(tag), std::string(var), index); + return ConfValueBool(target, std::string(tag), std::string(var), "", index); +} + +bool ServerConfig::ConfValueBool(ConfigDataHash &target, const char* tag, const char* var, const char* default_value, int index) +{ + return ConfValueBool(target, std::string(tag), std::string(var), std::string(default_value), index); } bool ServerConfig::ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, int index) +{ + return ConfValueBool(target, tag, var, "", index); +} + +bool ServerConfig::ConfValueBool(ConfigDataHash &target, const std::string &tag, const std::string &var, const std::string &default_value, int index) { std::string result; - if(!ConfValue(target, tag, var, index, result)) + if(!ConfValue(target, tag, var, default_value, index, result)) return false; return ((result == "yes") || (result == "true") || (result == "1")); diff --git a/src/modules.cpp b/src/modules.cpp index 18b2bf618..69506c7a6 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -643,16 +643,22 @@ std::string ConfigReader::ReadValue(const std::string &tag, const std::string &n return ReadValue(tag, name, "", index, allow_linefeeds); } +bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, const std::string &default_value, int index) +{ + return ServerInstance->Config->ConfValueBool(*this->data, tag, name, default_value, index); +} + bool ConfigReader::ReadFlag(const std::string &tag, const std::string &name, int index) { - return ServerInstance->Config->ConfValueBool(*this->data, tag, name, index); + return ReadFlag(tag, name, "", index); } -long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, int index, bool needs_unsigned) + +long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, const std::string &default_value, int index, bool needs_unsigned) { int result; - if(!ServerInstance->Config->ConfValueInteger(*this->data, tag, name, index, result)) + if(!ServerInstance->Config->ConfValueInteger(*this->data, tag, name, default_value, index, result)) { this->error = CONF_VALUE_NOT_FOUND; return 0; @@ -667,6 +673,11 @@ long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, return result; } +long ConfigReader::ReadInteger(const std::string &tag, const std::string &name, int index, bool needs_unsigned) +{ + return ReadInteger(tag, name, "", index, needs_unsigned); +} + long ConfigReader::GetError() { long olderr = this->error; -- cgit v1.2.3