summaryrefslogtreecommitdiffstats
path: root/apps/uscxml-browser.cpp
blob: dd0633b0b59c38c19ca64d90edad5c740366dd1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include "uscxml/config.h"
#include "uscxml/Interpreter.h"
#include "uscxml/InterpreterOptions.h"
#include "uscxml/debug/InterpreterIssue.h"
#include "uscxml/debug/DebuggerServlet.h"
#include "uscxml/interpreter/InterpreterMonitor.h"
#include "uscxml/util/DOM.h"

#include "uscxml/interpreter/Logging.h"

#include "uscxml/plugins/Factory.h"
#include "uscxml/server/HTTPServer.h"


int main(int argc, char** argv) {
	using namespace uscxml;

#if defined(HAS_SIGNAL_H) && !defined(WIN32)
	signal(SIGPIPE, SIG_IGN);
#endif

	InterpreterOptions options = InterpreterOptions::fromCmdLine(argc, argv);

	if (!options) {
		InterpreterOptions::printUsageAndExit(argv[0]);
	}

    if (!options.validate) {
        // setup HTTP server
        HTTPServer::SSLConfig* sslConf = NULL;
        if (options.certificate.length() > 0) {
            sslConf = new HTTPServer::SSLConfig();
            sslConf->privateKey = options.certificate;
            sslConf->publicKey = options.certificate;
            sslConf->port = options.httpsPort;

        } else if (options.privateKey.length() > 0 && options.publicKey.length() > 0) {
            sslConf = new HTTPServer::SSLConfig();
            sslConf->privateKey = options.privateKey;
            sslConf->publicKey = options.publicKey;
            sslConf->port = options.httpsPort;

        }
        HTTPServer::getInstance(options.httpPort, options.wsPort, sslConf);
    }
    
    if (options.pluginPath.length() > 0) {
        Factory::setDefaultPluginPath(options.pluginPath);
    }
    
    if (options.verbose) {
        Factory::getInstance()->listComponents();
    }

	// instantiate and configure interpreters
	std::list<Interpreter> interpreters;
	for(size_t i = 0; i < options.interpreters.size(); i++) {

//		InterpreterOptions* currOptions = options.interpreters[0].second;
		std::string documentURL = options.interpreters[i].first;

		LOGD(USCXML_INFO) << "Processing " << documentURL << std::endl;

		try {
			Interpreter interpreter = Interpreter::fromURL(documentURL);
			if (interpreter) {

				if (options.validate) {
					std::list<InterpreterIssue> issues = interpreter.validate();
					for (std::list<InterpreterIssue>::iterator issueIter = issues.begin(); issueIter != issues.end(); issueIter++) {
						LOGD(USCXML_DEBUG) << "" << *issueIter << std::endl;
					}
					if (issues.size() == 0) {
						LOGD(USCXML_DEBUG) << "No issues found" << std::endl;
					}
                    
				}

				if (options.verbose) {
					StateTransitionMonitor* vm = new StateTransitionMonitor();
					vm->copyToInvokers(true);
					interpreter.addMonitor(vm);
				}

				interpreters.push_back(interpreter);

			} else {
				LOGD(USCXML_ERROR) << "Cannot create interpreter from " << documentURL << std::endl;
			}
		} catch (Event e) {
			LOGD(USCXML_ERROR) << e << std::endl;
		}
	}

    if (options.validate) {
        return EXIT_SUCCESS;
    }
    
    if (options.withDebugger) {
        DebuggerServlet* debugger;
        debugger = new DebuggerServlet();
        debugger->copyToInvokers(true);
        HTTPServer::getInstance()->registerServlet("/debug", debugger);
        for (auto interpreter : interpreters) {
            interpreter.addMonitor(debugger);
        }
    }
    
	// run interpreters
    if (interpreters.size() > 0) {
        try {
            std::list<Interpreter>::iterator interpreterIter = interpreters.begin();
            while (interpreters.size() > 0) {
                while(interpreterIter != interpreters.end()) {
                    InterpreterState state = interpreterIter->step();
                    if (state == USCXML_FINISHED) {
                        interpreterIter = interpreters.erase(interpreterIter);
                    } else {
                        interpreterIter++;
                    }
                }
                interpreterIter = interpreters.begin();
            }
        } catch (Event e) {
            LOGD(USCXML_ERROR) << e << std::endl;
        }
    } else if (options.withDebugger) {
        while(true)
            std::this_thread::sleep_for(std::chrono::seconds(1));
    }
	return EXIT_SUCCESS;
}