aboutsummaryrefslogtreecommitdiff
path: root/apps/apps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'apps/apps.cpp')
-rw-r--r--apps/apps.cpp75
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);
+}
}
}