From e65c1d261c26702dac82a6390be3fa757bbed6ec Mon Sep 17 00:00:00 2001 From: brain Date: Sat, 16 Dec 2006 21:04:47 +0000 Subject: Add an optional parameter to ConfigReader::ReadValue which defines if we want linefeeds or not. Tidy up some duplicated code in configreader (error reporting) Change ModuleException to inherit from CoreException, have the configreader throw and catch its CoreException on fatal error git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@6013 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/configreader.h | 26 +++++++++++++++++++++++--- include/modules.h | 33 +++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 11 deletions(-) (limited to 'include') diff --git a/include/configreader.h b/include/configreader.h index 115f205c5..98a13034d 100644 --- a/include/configreader.h +++ b/include/configreader.h @@ -30,7 +30,14 @@ class InspSocket; /** Types of data in the core config */ -enum ConfigDataType { DT_NOTHING, DT_INTEGER, DT_CHARPTR, DT_BOOLEAN }; +enum ConfigDataType +{ + DT_NOTHING = 0, + DT_INTEGER = 1, + DT_CHARPTR = 2, + DT_BOOLEAN = 3, + DT_ALLOW_NEWLINE = 128 +}; /** Holds a config value, either string, integer or boolean. * Callback functions receive one or more of these, either on @@ -519,10 +526,23 @@ class ServerConfig : public Extensible */ bool ReadFile(file_cache &F, const char* fname); + /** Load 'filename' into 'target', with the new config parser everything is parsed into + * tag/key/value at load-time rather than at read-value time. + */ + + /** Report a configuration error given in errormessage. + * @param bail If this is set to true, the error is sent to the console, and the program exits + * @param user If this is set to a non-null value, and bail is false, the errors are spooled to + * this user as SNOTICEs. + * If the parameter is NULL, the messages are spooled to all users via WriteOpers as SNOTICEs. + */ + void ReportConfigError(const std::string &errormessage, bool bail, userrec* user); + /** Load 'filename' into 'target', with the new config parser everything is parsed into * tag/key/value at load-time rather than at read-value time. */ bool LoadConf(ConfigDataHash &target, const char* filename, std::ostringstream &errorstream); + /** Load 'filename' into 'target', with the new config parser everything is parsed into * tag/key/value at load-time rather than at read-value time. */ @@ -532,10 +552,10 @@ class ServerConfig : public Extensible /** Writes 'length' chars into 'result' as a string */ - bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length); + bool ConfValue(ConfigDataHash &target, const char* tag, const char* var, int index, char* result, int length, bool allow_linefeeds = false); /** Writes 'length' chars into 'result' as a string */ - bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, std::string &result); + bool ConfValue(ConfigDataHash &target, const std::string &tag, const std::string &var, int index, std::string &result, bool allow_linefeeds = false); /** Tries to convert the value to an integer and write it to 'result' */ diff --git a/include/modules.h b/include/modules.h index 4a9fd87b8..ef103a1a5 100644 --- a/include/modules.h +++ b/include/modules.h @@ -322,24 +322,24 @@ class Event : public ModuleMessage * be loaded. If this happens, the error message returned by ModuleException::GetReason will be displayed to the user * attempting to load the module, or dumped to the console if the ircd is currently loading for the first time. */ -class ModuleException : public std::exception +class CoreException : public std::exception { - private: + protected: /** Holds the error message to be displayed */ - std::string err; + const std::string err; public: - /** Default constructor, just uses the error mesage 'Module threw an exception'. + /** Default constructor, just uses the error mesage 'Core threw an exception'. */ - ModuleException() : err("Module threw an exception") {} + CoreException() : err("Core threw an exception") {} /** This constructor can be used to specify an error message before throwing. */ - ModuleException(std::string message) : err(message) {} + CoreException(const std::string &message) : err(message) {} /** This destructor solves world hunger, cancels the world debt, and causes the world to end. * Actually no, it does nothing. Never mind. * @throws Nothing! */ - virtual ~ModuleException() throw() {}; + virtual ~CoreException() throw() {}; /** Returns the reason for the exception. * The module should probably put something informative here as the user will see this upon failure. */ @@ -349,6 +349,23 @@ class ModuleException : public std::exception } }; +class ModuleException : public CoreException +{ + public: + /** Default constructor, just uses the error mesage 'Module threw an exception'. + */ + ModuleException() : CoreException("Module threw an exception") {} + + /** This constructor can be used to specify an error message before throwing. + */ + ModuleException(const std::string &message) : CoreException(message) {} + /** This destructor solves world hunger, cancels the world debt, and causes the world to end. + * Actually no, it does nothing. Never mind. + * @throws Nothing! + */ + virtual ~ModuleException() throw() {}; +}; + /** Priority types which can be returned from Module::Prioritize() */ enum Priority { PRIORITY_FIRST, PRIORITY_DONTCARE, PRIORITY_LAST, PRIORITY_BEFORE, PRIORITY_AFTER }; @@ -1364,7 +1381,7 @@ class ConfigReader : public classbase * 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. */ - std::string ReadValue(const std::string &tag, const std::string &name, int index); + std::string ReadValue(const std::string &tag, const std::string &name, 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" -- cgit v1.2.3