diff options
author | Stefan Radomski <github@mintwerk.de> | 2016-05-12 13:12:33 (GMT) |
---|---|---|
committer | Stefan Radomski <github@mintwerk.de> | 2016-05-12 13:12:33 (GMT) |
commit | b62e7979600feee23dc7cdb61042a8fc7673122b (patch) | |
tree | f7351372f37979dd2d048e0b68a16a4cd3b2aadb /apps/uscxml-browser.cpp | |
parent | 1b11b310be61e51b3ac5ebb83f7c8a33aef3d6e8 (diff) | |
download | uscxml-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.cpp | 159 |
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; } |