diff options
Diffstat (limited to 'src/config')
-rw-r--r-- | src/config/config.cpp | 122 | ||||
-rw-r--r-- | src/config/config.hpp | 103 |
2 files changed, 0 insertions, 225 deletions
diff --git a/src/config/config.cpp b/src/config/config.cpp deleted file mode 100644 index b870339..0000000 --- a/src/config/config.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include <config/config.hpp> - -#include <iostream> -#include <sstream> - -#include <stdlib.h> - -std::string Config::filename = "./biboumi.cfg"; -bool Config::file_must_exist = false; - -std::string Config::get(const std::string& option, const std::string& def) -{ - Config* self = Config::instance().get(); - auto it = self->values.find(option); - - if (it == self->values.end()) - return def; - return it->second; -} - -int Config::get_int(const std::string& option, const int& def) -{ - Config* self = Config::instance().get(); - std::string res = self->get(option, ""); - if (!res.empty()) - return atoi(res.c_str()); - else - return def; -} - -void Config::set(const std::string& option, const std::string& value, bool save) -{ - Config* self = Config::instance().get(); - self->values[option] = value; - if (save) - { - self->save_to_file(); - self->trigger_configuration_change(); - } -} - -void Config::connect(t_config_changed_callback callback) -{ - Config* self = Config::instance().get(); - self->callbacks.push_back(callback); -} - -void Config::close() -{ - Config* self = Config::instance().get(); - self->values.clear(); - Config::instance().reset(); -} - -/** - * Private methods - */ - -void Config::trigger_configuration_change() -{ - std::vector<t_config_changed_callback>::iterator it; - for (it = this->callbacks.begin(); it < this->callbacks.end(); ++it) - (*it)(); -} - -std::unique_ptr<Config>& Config::instance() -{ - static std::unique_ptr<Config> instance; - - if (!instance) - { - instance = std::make_unique<Config>(); - instance->read_conf(); - } - return instance; -} - -bool Config::read_conf() -{ - std::ifstream file; - file.open(filename.data()); - if (!file.is_open()) - { - if (Config::file_must_exist) - { - perror(("Error while opening file " + filename + " for reading.").c_str()); - file.exceptions(std::ifstream::failbit); - } - return false; - } - - std::string line; - size_t pos; - std::string option; - std::string value; - while (file.good()) - { - std::getline(file, line); - if (line == "" || line[0] == '#') - continue ; - pos = line.find('='); - if (pos == std::string::npos) - continue ; - option = line.substr(0, pos); - value = line.substr(pos+1); - this->values[option] = value; - } - return true; -} - -void Config::save_to_file() const -{ - std::ofstream file(this->filename.data()); - if (file.fail()) - { - std::cerr << "Could not save config file." << std::endl; - return ; - } - for (auto& it: this->values) - file << it.first << "=" << it.second << std::endl; - file.close(); -} diff --git a/src/config/config.hpp b/src/config/config.hpp deleted file mode 100644 index e070816..0000000 --- a/src/config/config.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Read the config file and save all the values in a map. - * Also, a singleton. - * - * Use Config::filename = "bla" to set the filename you want to use. - * - * If you want to exit if the file does not exist when it is open for - * reading, set Config::file_must_exist = true. - * - * Config::get() can the be used to access the values in the conf. - * - * Use Config::close() when you're done getting/setting value. This will - * save the config into the file. - */ - -#ifndef CONFIG_INCLUDED -# define CONFIG_INCLUDED - -#include <functional> -#include <fstream> -#include <memory> -#include <vector> -#include <string> -#include <map> - -typedef std::function<void()> t_config_changed_callback; - -class Config -{ -public: - Config(){}; - ~Config(){}; - /** - * returns a value from the config. If it doesn’t exist, use - * the second argument as the default. - * @param option The option we want - * @param def The default value in case the option does not exist - */ - static std::string get(const std::string&, const std::string&); - /** - * returns a value from the config. If it doesn’t exist, use - * the second argument as the default. - * @param option The option we want - * @param def The default value in case the option does not exist - */ - static int get_int(const std::string&, const int&); - /** - * Set a value for the given option. And write all the config - * in the file from which it was read if boolean is set. - * @param option The option to set - * @param value The value to use - * @param save if true, save the config file - */ - static void set(const std::string&, const std::string&, bool save = false); - /** - * Adds a function to a list. This function will be called whenever a - * configuration change occurs. - */ - static void connect(t_config_changed_callback); - /** - * Close the config file, saving it to the file is save == true. - */ - static void close(); - - /** - * Set the value of the filename to use, before calling any method. - */ - static std::string filename; - /** - * Set to true if you want an exception to be raised if the file does not - * exist when reading it. - */ - static bool file_must_exist; - -private: - /** - * Get the singleton instance - */ - static std::unique_ptr<Config>& instance(); - /** - * Read the configuration file at the given path. - */ - bool read_conf(); - /** - * Write all the config values into the configuration file - */ - void save_to_file() const; - /** - * Call all the callbacks previously registered using connect(). - * This is used to notify any class that a configuration change occured. - */ - void trigger_configuration_change(); - - std::map<std::string, std::string> values; - std::vector<t_config_changed_callback> callbacks; - - Config(const Config&) = delete; - Config& operator=(const Config&) = delete; - Config(Config&&) = delete; - Config& operator=(Config&&) = delete; -}; - -#endif // CONFIG_INCLUDED |