summaryrefslogtreecommitdiffstats
path: root/apps/uscxml-browser.cpp
diff options
context:
space:
mode:
authorStefan Radomski <github@mintwerk.de>2016-05-12 13:12:33 (GMT)
committerStefan Radomski <github@mintwerk.de>2016-05-12 13:12:33 (GMT)
commitb62e7979600feee23dc7cdb61042a8fc7673122b (patch)
treef7351372f37979dd2d048e0b68a16a4cd3b2aadb /apps/uscxml-browser.cpp
parent1b11b310be61e51b3ac5ebb83f7c8a33aef3d6e8 (diff)
downloaduscxml-b62e7979600feee23dc7cdb61042a8fc7673122b.zip
uscxml-b62e7979600feee23dc7cdb61042a8fc7673122b.tar.gz
uscxml-b62e7979600feee23dc7cdb61042a8fc7673122b.tar.bz2
Major Refactoring v2.0
Diffstat (limited to 'apps/uscxml-browser.cpp')
-rw-r--r--apps/uscxml-browser.cpp159
1 files changed, 17 insertions, 142 deletions
diff --git a/apps/uscxml-browser.cpp b/apps/uscxml-browser.cpp
index f223cef..cf666c9 100644
--- a/apps/uscxml-browser.cpp
+++ b/apps/uscxml-browser.cpp
@@ -1,94 +1,12 @@
#include "uscxml/config.h"
#include "uscxml/Interpreter.h"
-#include "uscxml/dom/DOMUtils.h"
+#include "uscxml/util/DOM.h"
-#ifndef BUILD_MINIMAL
-# include "uscxml/debug/DebuggerServlet.h"
-#endif
-#include <glog/logging.h>
+#include <easylogging++.h>
-#include "uscxml/Factory.h"
+#include "uscxml/plugins/Factory.h"
#include "uscxml/server/HTTPServer.h"
-#ifdef HAS_SIGNAL_H
-#include <signal.h>
-#endif
-
-#ifdef HAS_EXECINFO_H
-#include <execinfo.h>
-#endif
-
-#ifdef HAS_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#ifdef CMAKE_BUILD_TYPE_DEBUG
-
-#ifdef HAS_EXECINFO_H
-void printBacktrace(void** array, int size) {
- char** messages = backtrace_symbols(array, size);
- for (size_t i = 0; i < size && messages != NULL; ++i) {
- std::cerr << "\t" << messages[i] << std::endl;
- }
- std::cerr << std::endl;
- free(messages);
-}
-
-#ifdef HAS_DLFCN_H
-// see https://gist.github.com/nkuln/2020860
-typedef void (*cxa_throw_type)(void *, void *, void (*) (void *));
-cxa_throw_type orig_cxa_throw = 0;
-
-void load_orig_throw_code() {
- orig_cxa_throw = (cxa_throw_type) dlsym(RTLD_NEXT, "__cxa_throw");
-}
-
-extern "C"
-CXA_THROW_SIGNATURE {
- std::cerr << __FUNCTION__ << " will throw exception from " << std::endl;
- if (orig_cxa_throw == 0)
- load_orig_throw_code();
-
- void *array[50];
- size_t size = backtrace(array, 50);
- printBacktrace(array, size);
- orig_cxa_throw(thrown_exception, pvtinfo, dest);
-}
-#endif
-#endif
-
-
-// see http://stackoverflow.com/questions/2443135/how-do-i-find-where-an-exception-was-thrown-in-c
-void customTerminate() {
- static bool tried_throw = false;
- try {
- // try once to re-throw currently active exception
- if (!tried_throw) {
- tried_throw = true;
- throw;
- } else {
- tried_throw = false;
- }
- } catch (const std::exception &e) {
- std::cerr << __FUNCTION__ << " caught unhandled exception. what(): "
- << e.what() << std::endl;
- } catch (const uscxml::Event &e) {
- std::cerr << __FUNCTION__ << " caught unhandled exception. Event: "
- << e << std::endl;
- } catch (...) {
- std::cerr << __FUNCTION__ << " caught unknown/unhandled exception."
- << std::endl;
- }
-
-#ifdef HAS_EXECINFO_H
- void * array[50];
- int size = backtrace(array, 50);
-
- printBacktrace(array, size);
-#endif
- abort();
-}
-#endif
int main(int argc, char** argv) {
using namespace uscxml;
@@ -97,16 +15,8 @@ int main(int argc, char** argv) {
signal(SIGPIPE, SIG_IGN);
#endif
-#ifdef CMAKE_BUILD_TYPE_DEBUG
- std::set_terminate(customTerminate);
-#endif
-
InterpreterOptions options = InterpreterOptions::fromCmdLine(argc, argv);
- // setup logging
- google::LogToStderr();
- google::InitGoogleLogging(argv[0]);
-
if (options.pluginPath.length() > 0) {
Factory::setDefaultPluginPath(options.pluginPath);
}
@@ -135,15 +45,6 @@ int main(int argc, char** argv) {
}
HTTPServer::getInstance(options.httpPort, options.wsPort, sslConf);
-#ifndef BUILD_MINIMAL
- DebuggerServlet* debugger;
- if (options.withDebugger) {
- debugger = new DebuggerServlet();
- debugger->copyToInvokers(true);
- HTTPServer::getInstance()->registerServlet("/debug", debugger);
- }
-#endif
-
// instantiate and configure interpreters
std::list<Interpreter> interpreters;
for(int i = 0; i < options.interpreters.size(); i++) {
@@ -157,7 +58,7 @@ int main(int argc, char** argv) {
Interpreter interpreter = Interpreter::fromURL(documentURL);
if (interpreter) {
- if (options.checking) {
+ if (options.validate) {
std::list<InterpreterIssue> issues = interpreter.validate();
for (std::list<InterpreterIssue>::iterator issueIter = issues.begin(); issueIter != issues.end(); issueIter++) {
std::cout << *issueIter << std::endl;
@@ -168,22 +69,12 @@ int main(int argc, char** argv) {
}
- interpreter.setCmdLineOptions(options.additionalParameters);
- interpreter.setCmdLineOptions(currOptions->additionalParameters);
- interpreter.setCapabilities(options.getCapabilities());
-
if (options.verbose) {
- StateTransitionMonitor* vm = new StateTransitionMonitor();
+ StateTransitionMonitor* vm = new StateTransitionMonitor(interpreter);
vm->copyToInvokers(true);
- interpreter.addMonitor(vm);
+ interpreter.setMonitor(vm);
}
-#ifndef BUILD_MINIMAL
- if (options.withDebugger) {
- interpreter.addMonitor(debugger);
- }
-#endif
-
interpreters.push_back(interpreter);
} else {
@@ -194,35 +85,19 @@ int main(int argc, char** argv) {
}
}
- // start interpreters
+ // run interpreters
try {
std::list<Interpreter>::iterator interpreterIter = interpreters.begin();
- while(interpreterIter != interpreters.end()) {
- interpreterIter->start();
- interpreterIter++;
- }
-
- bool stillRunning = true;
- // call from main thread for UI events
- while(interpreters.size() > 0) {
- interpreterIter = interpreters.begin();
- while(interpreterIter != interpreters.end()) {
- stillRunning = interpreterIter->runOnMainThread(25);
- if (!stillRunning) {
- interpreters.erase(interpreterIter++);
- } else {
- interpreterIter++;
- }
- }
- }
-
-#ifndef BUILD_MINIMAL
- if (options.withDebugger) {
- // idle and wait for CTRL+C or debugging events
- while(true)
- tthread::this_thread::sleep_for(tthread::chrono::seconds(1));
- }
-#endif
+ while (interpreters.size() > 0) {
+ while(interpreterIter != interpreters.end()) {
+ InterpreterState state = interpreterIter->step();
+ if (state == USCXML_FINISHED) {
+ interpreterIter = interpreters.erase(interpreterIter);
+ } else {
+ interpreterIter++;
+ }
+ }
+ }
} catch (Event e) {
std::cout << e << std::endl;
}