aboutsummaryrefslogtreecommitdiff
path: root/apps/launcher.cpp
diff options
context:
space:
mode:
authorTrygve Laugstøl <trygvis@inamo.no>2015-06-21 00:15:04 +0200
committerTrygve Laugstøl <trygvis@inamo.no>2015-06-21 00:15:43 +0200
commitc56840f03cf139d60c6d90b55cf16e70f6ae2bc2 (patch)
treec9f19ab065496ac704fbf855da031ef5643eefa3 /apps/launcher.cpp
parentd91e500592790f1ef22ebfe921f273a61ff6252f (diff)
downloadble-toys-c56840f03cf139d60c6d90b55cf16e70f6ae2bc2.tar.gz
ble-toys-c56840f03cf139d60c6d90b55cf16e70f6ae2bc2.tar.bz2
ble-toys-c56840f03cf139d60c6d90b55cf16e70f6ae2bc2.tar.xz
ble-toys-c56840f03cf139d60c6d90b55cf16e70f6ae2bc2.zip
o Going all header file based and single-executable to launch all apps.
o Ading CMake magic to generate the launcher
Diffstat (limited to 'apps/launcher.cpp')
-rw-r--r--apps/launcher.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/apps/launcher.cpp b/apps/launcher.cpp
new file mode 100644
index 0000000..dc31abd
--- /dev/null
+++ b/apps/launcher.cpp
@@ -0,0 +1,94 @@
+#include "apps.h"
+#include "apps-list.gen.h"
+#include <log4cplus/consoleappender.h>
+#include <log4cplus/configurator.h>
+#include <boost/algorithm/string/predicate.hpp>
+
+using namespace trygvis::apps;
+using namespace std;
+
+const po::options_description logging_options() {
+ po::options_description desc;
+
+ return desc;
+}
+
+void setup_logging(po::variables_map vm) {
+ Appender *console = new ConsoleAppender(true, true);
+ PatternLayout *layout = new PatternLayout(LOG4CPLUS_TEXT("%-5p" /*" %6r"*/ " %-20c %m%n"));
+ console->setLayout(auto_ptr<Layout>(layout));
+
+ Hierarchy &h = Logger::getDefaultHierarchy();
+ h.getRoot().addAppender(SharedAppenderPtr(console));
+}
+
+template<typename App>
+int launch_app(int argc, const char *argv[]) {
+ App app;
+
+ po::options_description all("Options");
+
+ auto all_options = all.add_options();
+ 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(vm);
+
+ Logger logger = Logger::getInstance(LOG4CPLUS_TEXT(app.app_name));
+
+ 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 main(int argc, const char *argv[]) {
+ if (argc == 0) {
+ return EXIT_FAILURE;
+ }
+
+ string app_name;
+ if (boost::ends_with(argv[0], "launcher")) {
+ if (argc <= 1) {
+ cerr << "Missing required argument: app" << endl;
+ return EXIT_FAILURE;
+ }
+
+ app_name = argv[1];
+ --argc;
+ argv = &argv[1];
+ } else {
+ app_name = argv[0];
+ }
+
+ return launch(app_name, argc, argv);
+}