#include "config.h" #include #include #include #include namespace pt = boost::property_tree; using namespace std::string_literals; namespace { const std::string default_datapath {"/var/lib/blog"}; const std::string default_listen {"::1:9000"}; const std::string default_name{"blog"}; const std::string default_keywords{"blog, reichwein.it, weblog"}; } Config::Config(const std::filesystem::path& config_filename): m_dataPath{default_datapath}, m_listenAddress{"::1"}, m_listenPort{9000}, m_name{default_name}, m_keywords{default_keywords} { try { pt::ptree tree; pt::read_xml(config_filename, tree, pt::xml_parser::no_comments | pt::xml_parser::trim_whitespace); m_dataPath = tree.get("config.datapath", default_datapath); m_name = tree.get("config.name", default_name); std::string listen {tree.get("config.port", default_listen)}; auto pos{listen.find_last_of(':')}; if (pos == std::string::npos) throw std::runtime_error("Bad port address: "s + listen); m_listenAddress = listen.substr(0, pos); m_listenPort = std::stoi(listen.substr(pos + 1)); if (m_listenPort < 0 || m_listenPort > 65535) throw std::runtime_error("Bad listen port: "s + std::to_string(m_listenPort)); m_keywords = tree.get("config.keywords", default_keywords); } catch (const std::exception& ex) { std::cerr << "Error reading config file " << config_filename << ". Using defaults." << std::endl; } } std::string Config::getDataPath() const { return m_dataPath; } std::string Config::getListenAddress() const { return m_listenAddress; } int Config::getListenPort() const { return m_listenPort; } std::string Config::getName() const { return m_name; } std::string Config::getKeywords() const { return m_keywords; }