diff options
author | Peter Powell <petpow@saberuk.com> | 2013-05-17 05:46:51 +0100 |
---|---|---|
committer | attilamolnar <attilamolnar@hush.com> | 2013-05-27 00:15:30 +0200 |
commit | 244a65e8556328642350575c4a94ee8fc1b676b4 (patch) | |
tree | 97bf4ff8cf2621a28041a719bd8d766f44014c5b /src | |
parent | ee641f3f229143940fbe359ac98863edfdf249ce (diff) |
Clean up the FileReader class and all of the modules that use it.
- Modules which use this class will now have to catch a
CoreException when opening files if they wish to ignore
the failed loading of a file.
- m_randquote has been cleaned up massively and the RANDQUOTE
command has been removed as it was pretty much useless.
Diffstat (limited to 'src')
-rw-r--r-- | src/configreader.cpp | 1 | ||||
-rw-r--r-- | src/modules.cpp | 92 | ||||
-rw-r--r-- | src/modules/extra/m_ssl_gnutls.cpp | 12 | ||||
-rw-r--r-- | src/modules/m_opermotd.cpp | 12 | ||||
-rw-r--r-- | src/modules/m_randquote.cpp | 63 |
5 files changed, 57 insertions, 123 deletions
diff --git a/src/configreader.cpp b/src/configreader.cpp index 8951ec0ee..0016fccaf 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -23,7 +23,6 @@ #include "inspircd.h" -#include <fstream> #include "xline.h" #include "listmode.h" #include "exitcodes.h" diff --git a/src/modules.cpp b/src/modules.cpp index b01b1b5c2..dfbe1358e 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -24,6 +24,7 @@ */ +#include <fstream> #include "inspircd.h" #include "xline.h" #include "socket.h" @@ -583,82 +584,45 @@ const std::vector<std::string> ModuleManager::GetAllModuleNames(int filter) return retval; } -FileReader::FileReader(const std::string &filename) +FileReader::FileReader(const std::string& filename) { - LoadFile(filename); + Load(filename); } -FileReader::FileReader() +void FileReader::Load(const std::string& filename) { -} - -std::string FileReader::Contents() -{ - std::string x; - for (file_cache::iterator a = this->fc.begin(); a != this->fc.end(); a++) + // If the file is stored in the file cache then we used that version instead. + ConfigFileCache::iterator it = ServerInstance->Config->Files.find(filename); + if (it != ServerInstance->Config->Files.end()) { - x.append(*a); - x.append("\r\n"); - } - return x; -} - -unsigned long FileReader::ContentSize() -{ - return this->contentsize; -} - -void FileReader::CalcSize() -{ - unsigned long n = 0; - for (file_cache::iterator a = this->fc.begin(); a != this->fc.end(); a++) - n += (a->length() + 2); - this->contentsize = n; -} - -void FileReader::LoadFile(const std::string &filename) -{ - std::map<std::string, file_cache>::iterator file = ServerInstance->Config->Files.find(filename); - if (file != ServerInstance->Config->Files.end()) - { - this->fc = file->second; + this->lines = it->second; } else { - fc.clear(); - FILE* f = fopen(filename.c_str(), "r"); - if (!f) - return; - char linebuf[MAXBUF*10]; - while (fgets(linebuf, sizeof(linebuf), f)) - { - int len = strlen(linebuf); - if (len) - fc.push_back(std::string(linebuf, len - 1)); - } - fclose(f); - } - CalcSize(); -} + lines.clear(); + std::ifstream stream(filename.c_str()); + if (!stream.is_open()) + throw CoreException(filename + " does not exist or is not readable!"); -FileReader::~FileReader() -{ -} - -bool FileReader::Exists() -{ - return (!(fc.size() == 0)); -} + std::string line; + while (std::getline(stream, line)) + { + lines.push_back(line); + totalSize += line.size() + 2; + } -std::string FileReader::GetLine(int x) -{ - if ((x<0) || ((unsigned)x>fc.size())) - return ""; - return fc[x]; + stream.close(); + } } -int FileReader::FileSize() +std::string FileReader::GetString() { - return fc.size(); + std::string buffer; + for (file_cache::iterator it = this->lines.begin(); it != this->lines.end(); ++it) + { + buffer.append(*it); + buffer.append("\r\n"); + } + return buffer; } diff --git a/src/modules/extra/m_ssl_gnutls.cpp b/src/modules/extra/m_ssl_gnutls.cpp index 5ae530608..0659f631c 100644 --- a/src/modules/extra/m_ssl_gnutls.cpp +++ b/src/modules/extra/m_ssl_gnutls.cpp @@ -360,12 +360,12 @@ class ModuleSSLGnuTLS : public Module FileReader reader; - reader.LoadFile(certfile); - std::string cert_string = reader.Contents(); + reader.Load(certfile); + std::string cert_string = reader.GetString(); gnutls_datum_t cert_datum = { (unsigned char*)cert_string.data(), static_cast<unsigned int>(cert_string.length()) }; - reader.LoadFile(keyfile); - std::string key_string = reader.Contents(); + reader.Load(keyfile); + std::string key_string = reader.GetString(); gnutls_datum_t key_datum = { (unsigned char*)key_string.data(), static_cast<unsigned int>(key_string.length()) }; // If this fails, no SSL port will work. At all. So, do the smart thing - throw a ModuleException @@ -431,8 +431,8 @@ class ModuleSSLGnuTLS : public Module if (!dhfile.empty()) { // Try to load DH params from file - reader.LoadFile(dhfile); - std::string dhstring = reader.Contents(); + reader.Load(dhfile); + std::string dhstring = reader.GetString(); gnutls_datum_t dh_datum = { (unsigned char*)dhstring.data(), static_cast<unsigned int>(dhstring.length()) }; if ((ret = gnutls_dh_params_import_pkcs3(dh_params, &dh_datum, GNUTLS_X509_FMT_PEM)) < 0) diff --git a/src/modules/m_opermotd.cpp b/src/modules/m_opermotd.cpp index b228dc8b7..aa5767b4c 100644 --- a/src/modules/m_opermotd.cpp +++ b/src/modules/m_opermotd.cpp @@ -107,9 +107,15 @@ class ModuleOpermotd : public Module ConfigTag* conf = ServerInstance->Config->ConfValue("opermotd"); onoper = conf->getBool("onoper", true); - FileReader f(conf->getString("file", "opermotd")); - for (int i=0, filesize = f.FileSize(); i < filesize; i++) - cmd.opermotd.push_back(f.GetLine(i)); + try + { + FileReader reader(conf->getString("file", "opermotd")); + cmd.opermotd = reader.GetVector(); + } + catch (CoreException&) + { + // Nothing happens here as we do the error handling in ShowOperMOTD. + } if (conf->getBool("processcolors")) InspIRCd::ProcessColors(cmd.opermotd); diff --git a/src/modules/m_randquote.cpp b/src/modules/m_randquote.cpp index 62d3022cf..8b9ffd6e9 100644 --- a/src/modules/m_randquote.cpp +++ b/src/modules/m_randquote.cpp @@ -25,73 +25,38 @@ #include "inspircd.h" -static FileReader *quotes = NULL; - -std::string prefix; -std::string suffix; - -/** Handle /RANDQUOTE - */ -class CommandRandquote : public Command -{ - public: - CommandRandquote(Module* Creator) : Command(Creator,"RANDQUOTE", 0) - { - } - - CmdResult Handle (const std::vector<std::string>& parameters, User *user) - { - std::string str; - int fsize; - - fsize = quotes->FileSize(); - str = quotes->GetLine(ServerInstance->GenRandomInt(fsize)); - user->WriteNotice(prefix + str + suffix); - - return CMD_SUCCESS; - } -}; - class ModuleRandQuote : public Module { - CommandRandquote cmd; - public: - ModuleRandQuote() - : cmd(this) - { - } + private: + std::string prefix; + std::string suffix; + std::vector<std::string> quotes; + public: void init() CXX11_OVERRIDE { ConfigTag* conf = ServerInstance->Config->ConfValue("randquote"); - - std::string q_file = conf->getString("file","quotes"); prefix = conf->getString("prefix"); suffix = conf->getString("suffix"); + FileReader reader(conf->getString("file", "quotes")); + quotes = reader.GetVector(); - quotes = new FileReader(q_file); - if (!quotes->Exists()) - { - throw ModuleException("m_randquote: QuoteFile not Found!! Please check your config - module will not function."); - } - ServerInstance->Modules->AddService(cmd); Implementation eventlist[] = { I_OnUserConnect }; ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } - ~ModuleRandQuote() + void OnUserConnect(LocalUser* user) CXX11_OVERRIDE { - delete quotes; + if (!quotes.empty()) + { + unsigned long random = ServerInstance->GenRandomInt(quotes.size()); + user->WriteNotice(prefix + quotes[random] + suffix); + } } Version GetVersion() CXX11_OVERRIDE { - return Version("Provides random quotes on connect.",VF_VENDOR); - } - - void OnUserConnect(LocalUser* user) CXX11_OVERRIDE - { - cmd.Handle(std::vector<std::string>(), user); + return Version("Provides random quotes on connect.", VF_VENDOR); } }; |