diff options
Diffstat (limited to 'apps/apps.cpp')
-rw-r--r-- | apps/apps.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/apps/apps.cpp b/apps/apps.cpp index b353e85..916b0e0 100644 --- a/apps/apps.cpp +++ b/apps/apps.cpp @@ -1,5 +1,7 @@ #include "apps.h" #include <netdb.h> +#include <log4cplus/consoleappender.h> +#include <log4cplus/configurator.h> namespace trygvis { namespace apps { @@ -43,5 +45,78 @@ std::string get_hostname() { void app_execution::usage() { cerr << desc << endl; } + +const po::options_description logging_options() { + po::options_description desc; + + return desc; +} + +void setup_logging(string app_name) { + Appender *console = new ConsoleAppender(true, true); + + string pattern = string("%-5p ") /*"%6r "*/ + app_name + "/%-20c %m%n"; // add %M (function name) + + PatternLayout *layout = new PatternLayout(LOG4CPLUS_TEXT(pattern)); + console->setLayout(auto_ptr<Layout>(layout)); + + Hierarchy &h = Logger::getDefaultHierarchy(); + h.getRoot().addAppender(SharedAppenderPtr(console)); +} + +int launch_app(app *app, int argc, const char *argv[]) { + po::options_description all("Options"); + + auto all_options = all.add_options(); + all_options("help", "This help message"); + app->add_options(all_options); + + all.add(logging_options()); + app->add_extra_options(all); + + po::variables_map vm; + + try { + auto parsed = po::parse_command_line(argc, argv, all); + po::store(parsed, vm); + + po::notify(vm); + + auto unrecognized = po::collect_unrecognized(parsed.options, po::include_positional); + + if (vm.count("help")) { + cerr << all << "\n"; + return EXIT_FAILURE; + } + + if (unrecognized.size()) { + cerr << "Unrecognized option: " << unrecognized.at(0) << "\n"; + return EXIT_FAILURE; + } + + setup_logging(app->app_name); + + Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main")); + + app_execution execution(all, vm, logger); + + return app->main(execution); + } catch (po::required_option &e) { + cerr << "Missing required option: " << e.get_option_name() << endl; + cerr << all << endl; + return EXIT_FAILURE; + } catch (po::unknown_option &e) { + cerr << e.what() << endl; + return EXIT_FAILURE; + } +} + +int real_main(app *app, int argc, const char *argv[]) { + if (argc == 0) { + return EXIT_FAILURE; + } + + return launch_app(app, argc, argv); +} } } |