From 83113fe69769dbf5714262623996b9ea93e73515 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 3 Oct 2012 09:48:11 +0200 Subject: [PATCH] Allow setting more unregistered variables in Config class which can be later accessed using CONFIG_LIST --- include/transport/config.h | 1 + src/config.cpp | 42 ++++++++++++++++++++++++++------------ src/tests/config.cpp | 25 +++++++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/include/transport/config.h b/include/transport/config.h index de7888ac..a672abe6 100644 --- a/include/transport/config.h +++ b/include/transport/config.h @@ -37,6 +37,7 @@ #define CONFIG_STRING_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as() : DEF) #define CONFIG_BOOL_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as() : DEF) +#define CONFIG_LIST_DEFAULTED(PTR, KEY, DEF) ((*PTR).hasKey(KEY) ? (*PTR)[KEY].as >() : DEF) namespace Transport { diff --git a/src/config.cpp b/src/config.cpp index 432fb86f..ce49f6d6 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -135,18 +135,6 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description ; - // Load configs passed by command line - if (m_argc != 0 && m_argv) { - basic_command_line_parser parser = command_line_parser(m_argc, m_argv).options(opts).allow_unregistered(); - parsed_options parsed = parser.run(); - BOOST_FOREACH(option &opt, parsed.options) { - if (opt.unregistered && !opt.value.empty()) { - m_unregistered[opt.string_key] = variable_value(opt.value[0], false); - } - } - store(parsed, m_variables); - } - parsed_options parsed = parse_config_file(ifs, opts, true); bool found_working = false; @@ -212,15 +200,43 @@ bool Config::load(std::istream &ifs, boost::program_options::options_description parsed.options.push_back(boost::program_options::basic_option("database.database", value)); } + std::list has_key; BOOST_FOREACH(option &opt, parsed.options) { if (opt.unregistered) { - m_unregistered[opt.string_key] = variable_value(opt.value[0], false); + if (std::find(has_key.begin(), has_key.end(), opt.string_key) == has_key.end()) { + has_key.push_back(opt.string_key); + m_unregistered[opt.string_key] = variable_value(opt.value[0], false); + } + else { + std::list list; + try { + list = m_unregistered[opt.string_key].as >(); + } + catch(...) { + list.push_back(m_unregistered[opt.string_key].as()); + } + + list.push_back(opt.value[0]); + m_unregistered[opt.string_key] = variable_value(list, false); + } } else if (opt.value[0].find("$jid") != std::string::npos) { boost::replace_all(opt.value[0], "$jid", jid); } } + // Load configs passed by command line + if (m_argc != 0 && m_argv) { + basic_command_line_parser parser = command_line_parser(m_argc, m_argv).options(opts).allow_unregistered(); + parsed_options parsed = parser.run(); + BOOST_FOREACH(option &opt, parsed.options) { + if (opt.unregistered && !opt.value.empty()) { + m_unregistered[opt.string_key] = variable_value(opt.value[0], false); + } + } + store(parsed, m_variables); + } + store(parsed, m_variables); notify(m_variables); diff --git a/src/tests/config.cpp b/src/tests/config.cpp index d9e344f0..2f524677 100644 --- a/src/tests/config.cpp +++ b/src/tests/config.cpp @@ -24,7 +24,10 @@ using namespace Transport; class ConfigTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_TEST_SUITE(ConfigTest); + CPPUNIT_TEST(setStringTwice); CPPUNIT_TEST(updateBackendConfig); + CPPUNIT_TEST(unregisteredList); + CPPUNIT_TEST(unregisteredString); CPPUNIT_TEST_SUITE_END(); public: @@ -35,6 +38,14 @@ class ConfigTest : public CPPUNIT_NS :: TestFixture{ } + void setStringTwice() { + char *argv[3] = {"binary", "--service.jids=localhost", NULL}; + Config cfg(2, argv); + std::istringstream ifs("service.jids = irc.freenode.org\n"); + cfg.load(ifs); + CPPUNIT_ASSERT_EQUAL(std::string("localhost"), CONFIG_STRING(&cfg, "service.jids")); + } + void updateBackendConfig() { Config cfg; CPPUNIT_ASSERT(!cfg.hasKey("registration.needPassword")); @@ -44,6 +55,20 @@ class ConfigTest : public CPPUNIT_NS :: TestFixture{ CPPUNIT_ASSERT_EQUAL(false, CONFIG_BOOL(&cfg, "registration.needPassword")); } + void unregisteredList() { + Config cfg; + std::istringstream ifs("service.irc_server = irc.freenode.org\nservice.irc_server=localhost\n"); + cfg.load(ifs); + CPPUNIT_ASSERT_EQUAL(2, (int) CONFIG_LIST(&cfg, "service.irc_server").size()); + } + + void unregisteredString() { + Config cfg; + std::istringstream ifs("service.irc_server = irc.freenode.org"); + cfg.load(ifs); + CPPUNIT_ASSERT_EQUAL(std::string("irc.freenode.org"), CONFIG_STRING(&cfg, "service.irc_server")); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION (ConfigTest);