summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/swig/csharp/uscxml.i1
-rw-r--r--src/bindings/swig/java/uscxml.i1
-rw-r--r--src/bindings/swig/lua/uscxml.i1
-rw-r--r--src/bindings/swig/wrapped/WrappedInvoker.cpp4
-rw-r--r--src/bindings/swig/wrapped/WrappedInvoker.h8
-rw-r--r--src/uscxml/Interpreter.h2
-rw-r--r--src/uscxml/interpreter/InterpreterImpl.h6
-rw-r--r--src/uscxml/messages/Data.h11
-rw-r--r--src/uscxml/plugins/Factory.cpp17
-rw-r--r--src/uscxml/plugins/Factory.h23
-rw-r--r--src/uscxml/plugins/InvokerImpl.h32
-rw-r--r--src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp5
-rw-r--r--src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h4
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp46
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h2
15 files changed, 108 insertions, 55 deletions
diff --git a/src/bindings/swig/csharp/uscxml.i b/src/bindings/swig/csharp/uscxml.i
index e9f94f2..ac154c5 100644
--- a/src/bindings/swig/csharp/uscxml.i
+++ b/src/bindings/swig/csharp/uscxml.i
@@ -71,6 +71,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue;
#include "../../../uscxml/plugins/Factory.h"
#include "../../../uscxml/plugins/DataModelImpl.h"
+#include "../../../uscxml/plugins/ExecutableContent.h"
#include "../wrapped/WrappedInvoker.h"
#include "../wrapped/WrappedDataModel.h"
diff --git a/src/bindings/swig/java/uscxml.i b/src/bindings/swig/java/uscxml.i
index db3b221..eb6da2b 100644
--- a/src/bindings/swig/java/uscxml.i
+++ b/src/bindings/swig/java/uscxml.i
@@ -65,6 +65,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue;
#include "../../../uscxml/plugins/Factory.h"
#include "../../../uscxml/plugins/DataModelImpl.h"
+#include "../../../uscxml/plugins/ExecutableContent.h"
#include "../wrapped/WrappedInvoker.h"
#include "../wrapped/WrappedDataModel.h"
diff --git a/src/bindings/swig/lua/uscxml.i b/src/bindings/swig/lua/uscxml.i
index 9c2f115..0df7508 100644
--- a/src/bindings/swig/lua/uscxml.i
+++ b/src/bindings/swig/lua/uscxml.i
@@ -66,6 +66,7 @@ typedef uscxml::InterpreterIssue InterpreterIssue;
#include "../../../uscxml/plugins/Factory.h"
#include "../../../uscxml/plugins/DataModelImpl.h"
+#include "../../../uscxml/plugins/ExecutableContent.h"
#include "../wrapped/WrappedInvoker.h"
#include "../wrapped/WrappedDataModel.h"
diff --git a/src/bindings/swig/wrapped/WrappedInvoker.cpp b/src/bindings/swig/wrapped/WrappedInvoker.cpp
index 407323d..bdf9c76 100644
--- a/src/bindings/swig/wrapped/WrappedInvoker.cpp
+++ b/src/bindings/swig/wrapped/WrappedInvoker.cpp
@@ -21,8 +21,8 @@
namespace uscxml {
-WrappedInvoker::WrappedInvoker(InterpreterImpl* interpreter) {
- _interpreter = interpreter;
+WrappedInvoker::WrappedInvoker(InvokerCallbacks* callbacks) {
+ _callbacks = callbacks;
}
WrappedInvoker::~WrappedInvoker() {}
diff --git a/src/bindings/swig/wrapped/WrappedInvoker.h b/src/bindings/swig/wrapped/WrappedInvoker.h
index bb5d1ba..dde8602 100644
--- a/src/bindings/swig/wrapped/WrappedInvoker.h
+++ b/src/bindings/swig/wrapped/WrappedInvoker.h
@@ -40,15 +40,15 @@ namespace uscxml {
class WrappedInvoker : public InvokerImpl {
public:
- WrappedInvoker(InterpreterImpl* interpreter);
+ WrappedInvoker(InvokerCallbacks* callbacks);
virtual ~WrappedInvoker();
virtual std::list<std::string> getNames() {
return std::list<std::string>();
};
- virtual std::shared_ptr<InvokerImpl> create(InterpreterImpl* interpreter) {
- std::shared_ptr<InvokerImpl> inv = std::shared_ptr<InvokerImpl>(new WrappedInvoker(interpreter));
+ virtual std::shared_ptr<InvokerImpl> create(InvokerCallbacks* callbacks) {
+ std::shared_ptr<InvokerImpl> inv = std::shared_ptr<InvokerImpl>(new WrappedInvoker(callbacks));
return inv;
}
virtual void invoke(const std::string& source, const Event& invokeEvent) {}
@@ -75,7 +75,7 @@ public:
}
private:
- InterpreterImpl* _interpreter;
+ InvokerCallbacks* _callbacks;
};
diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h
index c74736e..806a0fc 100644
--- a/src/uscxml/Interpreter.h
+++ b/src/uscxml/Interpreter.h
@@ -58,7 +58,7 @@ public:
ContentExecutor execContent; ///< To process executable content elements
EventQueue internalQueue; ///< The queue where internal events will be enqueued
EventQueue externalQueue; ///< The queue for external events
- DelayedEventQueue delayedQueue; ///< The queue for delayed events
+ DelayedEventQueue delayQueue; ///< The queue for delayed events
};
/**
diff --git a/src/uscxml/interpreter/InterpreterImpl.h b/src/uscxml/interpreter/InterpreterImpl.h
index bd3898c..a4948b4 100644
--- a/src/uscxml/interpreter/InterpreterImpl.h
+++ b/src/uscxml/interpreter/InterpreterImpl.h
@@ -32,6 +32,7 @@
#include "uscxml/plugins/Factory.h"
#include "uscxml/plugins/DataModelImpl.h"
#include "uscxml/plugins/IOProcessorImpl.h"
+#include "uscxml/plugins/InvokerImpl.h"
#include "uscxml/interpreter/MicroStepImpl.h"
#include "uscxml/interpreter/ContentExecutorImpl.h"
#include "uscxml/interpreter/EventQueue.h"
@@ -53,6 +54,7 @@ class USCXML_API InterpreterImpl :
public IOProcessorCallbacks,
public ContentExecutorCallbacks,
public DelayedEventQueueCallbacks,
+ public InvokerCallbacks,
public std::enable_shared_from_this<InterpreterImpl> {
public:
enum Binding {
@@ -229,7 +231,7 @@ public:
_dataModel = al.dataModel;
_internalQueue = al.internalQueue;
_externalQueue = al.externalQueue;
- _delayQueue = al.delayedQueue;
+ _delayQueue = al.delayQueue;
}
ActionLanguage getActionLanguage() {
@@ -240,7 +242,7 @@ public:
al.dataModel = _dataModel;
al.internalQueue = _internalQueue;
al.externalQueue = _externalQueue;
- al.delayedQueue = _delayQueue;
+ al.delayQueue = _delayQueue;
return al;
}
diff --git a/src/uscxml/messages/Data.h b/src/uscxml/messages/Data.h
index b279696..6d4af3e 100644
--- a/src/uscxml/messages/Data.h
+++ b/src/uscxml/messages/Data.h
@@ -65,10 +65,17 @@ public:
explicit Data(const std::string& value) : node(NULL), atom(toStr(value)), type(VERBATIM) {}
- template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
+
+#ifndef SWIGIMPORTED
+ // swig barfs on this one, have them explictly
+ template <
+ typename T,
+ typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type
+ >
explicit Data(T value)
: node(NULL), atom(toStr(value)), type(INTERPRETED) {}
-
+#endif
+
template <typename T>
explicit Data(T value, Type type) : node(NULL), atom(toStr(value)), type(type) {}
diff --git a/src/uscxml/plugins/Factory.cpp b/src/uscxml/plugins/Factory.cpp
index 60e7a3e..b4120a1 100644
--- a/src/uscxml/plugins/Factory.cpp
+++ b/src/uscxml/plugins/Factory.cpp
@@ -24,6 +24,17 @@
#include "uscxml/Interpreter.h"
#include "uscxml/interpreter/Logging.h"
+#include "uscxml/plugins/ExecutableContent.h"
+#include "uscxml/plugins/EventHandler.h"
+#include "uscxml/plugins/IOProcessor.h"
+#include "uscxml/plugins/IOProcessorImpl.h"
+#include "uscxml/plugins/Invoker.h"
+#include "uscxml/plugins/DataModelImpl.h"
+
+#include "uscxml/interpreter/ContentExecutorImpl.h"
+#include "uscxml/interpreter/EventQueueImpl.h"
+#include "uscxml/interpreter/MicrostepImpl.h"
+
#include "uscxml/plugins/ExecutableContentImpl.h"
// see http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system
@@ -289,20 +300,20 @@ bool Factory::hasInvoker(const std::string& type) {
return false;
}
-std::shared_ptr<InvokerImpl> Factory::createInvoker(const std::string& type, InterpreterImpl* interpreter) {
+std::shared_ptr<InvokerImpl> Factory::createInvoker(const std::string& type, InvokerCallbacks* callbacks) {
// do we have this type ourself?
if (_invokerAliases.find(type) != _invokerAliases.end()) {
std::string canonicalName = _invokerAliases[type];
if (_invokers.find(canonicalName) != _invokers.end()) {
- std::shared_ptr<InvokerImpl> invoker = _invokers[canonicalName]->create(interpreter);
+ std::shared_ptr<InvokerImpl> invoker = _invokers[canonicalName]->create(callbacks);
return invoker;
}
}
// lookup in parent factory
if (_parentFactory) {
- return _parentFactory->createInvoker(type, interpreter);
+ return _parentFactory->createInvoker(type, callbacks);
} else {
ERROR_EXECUTION_THROW("No Invoker named '" + type + "' known");
}
diff --git a/src/uscxml/plugins/Factory.h b/src/uscxml/plugins/Factory.h
index 9653107..50df6ed 100644
--- a/src/uscxml/plugins/Factory.h
+++ b/src/uscxml/plugins/Factory.h
@@ -22,13 +22,6 @@
#include "uscxml/Common.h"
-#include "uscxml/plugins/ExecutableContent.h"
-#include "uscxml/plugins/EventHandler.h"
-#include "uscxml/plugins/IOProcessor.h"
-#include "uscxml/plugins/IOProcessorImpl.h"
-#include "uscxml/plugins/Invoker.h"
-#include "uscxml/plugins/DataModelImpl.h"
-
#include <string.h>
#ifdef BUILD_AS_PLUGINS
@@ -37,12 +30,21 @@
#include <memory>
#include <set>
+#include <map>
+#include <string>
#include <limits>
namespace uscxml {
class InterpreterImpl;
-
+class IOProcessorImpl;
+class IOProcessorCallbacks;
+class DataModelImpl;
+class DataModelCallbacks;
+class InvokerImpl;
+class InvokerCallbacks;
+class ExecutableContentImpl;
+
class USCXML_API Factory {
public:
Factory(Factory* parentFactory);
@@ -51,11 +53,11 @@ public:
void registerIOProcessor(IOProcessorImpl* ioProcessor);
void registerDataModel(DataModelImpl* dataModel);
void registerInvoker(InvokerImpl* invoker);
- void registerExecutableContent(ExecutableContentImpl* executableContent);
+ void registerExecutableContent(ExecutableContentImpl* executableContent);
std::shared_ptr<DataModelImpl> createDataModel(const std::string& type, DataModelCallbacks* callbacks);
std::shared_ptr<IOProcessorImpl> createIOProcessor(const std::string& type, IOProcessorCallbacks* callbacks);
- std::shared_ptr<InvokerImpl> createInvoker(const std::string& type, InterpreterImpl* interpreter);
+ std::shared_ptr<InvokerImpl> createInvoker(const std::string& type, InvokerCallbacks* interpreter);
std::shared_ptr<ExecutableContentImpl> createExecutableContent(const std::string& localName, const std::string& nameSpace, InterpreterImpl* interpreter);
bool hasDataModel(const std::string& type);
@@ -81,6 +83,7 @@ protected:
std::map<std::string, std::string> _invokerAliases;
std::map<std::pair<std::string, std::string>, ExecutableContentImpl*> _executableContent;
+
#ifdef BUILD_AS_PLUGINS
pluma::Pluma pluma;
#endif
diff --git a/src/uscxml/plugins/InvokerImpl.h b/src/uscxml/plugins/InvokerImpl.h
index e5f7366..9d159a8 100644
--- a/src/uscxml/plugins/InvokerImpl.h
+++ b/src/uscxml/plugins/InvokerImpl.h
@@ -25,11 +25,37 @@
#include "uscxml/Common.h"
#include "uscxml/plugins/EventHandler.h"
#include "uscxml/messages/Event.h"
-#include "uscxml/interpreter/InterpreterImpl.h"
+
+#include <set>
+
+namespace XERCESC_NS {
+ class DOMElement;
+ class DOMDocument;
+ class DOMNode;
+}
namespace uscxml {
class Interpreter;
+class InterpreterMonitor;
+class ActionLanguage;
+class Logger;
+
+/**
+ * @ingroup invoker
+ * @ingroup callback
+ * Callbacks available for every invoker.
+ */
+class USCXML_API InvokerCallbacks {
+public:
+ virtual ~InvokerCallbacks() {} ///< silence virtual destructor warning from swig
+ virtual void enqueueInternal(const Event& event) = 0;
+ virtual void enqueueExternal(const Event& event) = 0;
+ virtual ActionLanguage getActionLanguage() = 0;
+ virtual std::set<InterpreterMonitor*> getMonitors() = 0;
+ virtual std::string getBaseURL() = 0;
+ virtual Logger getLogger() = 0;
+};
/**
* @ingroup invoker
@@ -48,7 +74,7 @@ public:
* @param interpreter The imlementation of the associated Interpreter
* @todo We will eventually introduce callbacks and prevent complete access to the interpreter.
*/
- virtual std::shared_ptr<InvokerImpl> create(InterpreterImpl* interpreter) = 0;
+ virtual std::shared_ptr<InvokerImpl> create(InvokerCallbacks* callbacks) = 0;
/**
* Invoker's parent state became active at the end of a macro-step.
@@ -115,7 +141,7 @@ protected:
XERCESC_NS::DOMElement* _finalize;
std::string _invokeId;
- InterpreterImpl* _callbacks;
+ InvokerCallbacks* _callbacks;
};
}
diff --git a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp
index b5d7e8b..be13bf4 100644
--- a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp
+++ b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp
@@ -34,6 +34,7 @@
#include <boost/algorithm/string.hpp>
#include "uscxml/interpreter/Logging.h"
+#include "uscxml/util/URL.h"
namespace uscxml {
@@ -63,9 +64,9 @@ DirMonInvoker::~DirMonInvoker() {
delete(_watcher);
};
-std::shared_ptr<InvokerImpl> DirMonInvoker::create(InterpreterImpl* interpreter) {
+std::shared_ptr<InvokerImpl> DirMonInvoker::create(InvokerCallbacks* callbacks) {
std::shared_ptr<DirMonInvoker> invoker(new DirMonInvoker());
- invoker->_callbacks = interpreter;
+ invoker->_callbacks = callbacks;
return invoker;
}
diff --git a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h
index e6bb9aa..31e535a 100644
--- a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h
+++ b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.h
@@ -21,9 +21,11 @@
#define DIRMONINVOKER_H_W09J90F0
#include "uscxml/plugins/InvokerImpl.h"
+#include "uscxml/interpreter/Logging.h"
#include <map>
#include <set>
+#include <thread>
#include <sys/stat.h>
#ifdef BUILD_AS_PLUGINS
@@ -101,7 +103,7 @@ class DirMonInvoker : public InvokerImpl, public DirectoryWatchMonitor {
public:
DirMonInvoker();
virtual ~DirMonInvoker();
- virtual std::shared_ptr<InvokerImpl> create(InterpreterImpl* interpreter);
+ virtual std::shared_ptr<InvokerImpl> create(InvokerCallbacks* callbacks);
virtual std::list<std::string> getNames() {
std::list<std::string> names;
diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
index 9ac8621..e776022 100644
--- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
+++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
@@ -140,9 +140,9 @@ void USCXMLInvoker::run(void* instance) {
INSTANCE->_isActive = false;
}
-std::shared_ptr<InvokerImpl> USCXMLInvoker::create(InterpreterImpl* interpreter) {
+std::shared_ptr<InvokerImpl> USCXMLInvoker::create(InvokerCallbacks* callbacks) {
std::shared_ptr<USCXMLInvoker> invoker(new USCXMLInvoker());
- invoker->_callbacks = interpreter;
+ invoker->_callbacks = callbacks;
return invoker;
}
@@ -176,33 +176,31 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent)
if (_invokedInterpreter) {
_invokedInterpreter.getImpl()->_parentQueue = _parentQueue;
_invokedInterpreter.getImpl()->_invokeId = invokeEvent.invokeid;
+
+ // test240 assumes that invoke request params will carry over to the datamodel
_invokedInterpreter.getImpl()->_invokeReq = invokeEvent;
// create new instances from the parent's ActionLanguage
-#if 1
InterpreterImpl* invoked = _invokedInterpreter.getImpl().get();
- invoked->_execContent = _callbacks->_execContent.getImpl()->create(invoked);
- invoked->_delayQueue = _callbacks->_delayQueue.getImplDelayed()->create(invoked);
- invoked->_internalQueue = _callbacks->_internalQueue.getImplBase()->create();
- invoked->_externalQueue = _callbacks->_externalQueue.getImplBase()->create();
- invoked->_microStepper = _callbacks->_microStepper.getImpl()->create(invoked);
+ ActionLanguage al = _callbacks->getActionLanguage();
+
+ al.execContent = al.execContent.getImpl()->create(invoked);
+ al.delayQueue = al.delayQueue.getImplDelayed()->create(invoked);
+ al.internalQueue = al.internalQueue.getImplBase()->create();
+ al.externalQueue = al.externalQueue.getImplBase()->create();
+ al.microStepper = al.microStepper.getImpl()->create(invoked);
+
+ _invokedInterpreter.setActionLanguage(al);
+ // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching?
+
+ // copy monitors
+ std::set<InterpreterMonitor*> monitors = _callbacks->getMonitors();
+ for (auto monitor : monitors) {
+ if (monitor->copyToInvokers()) {
+ _invokedInterpreter.getImpl()->_monitors.insert(monitor);
+ }
+ }
- // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching?
-#endif
- // copy monitors
- std::set<InterpreterMonitor*>::const_iterator monIter = _callbacks->_monitors.begin();
- while(monIter != _callbacks->_monitors.end()) {
- if ((*monIter)->copyToInvokers()) {
- _invokedInterpreter.getImpl()->_monitors.insert(*monIter);
- }
- monIter++;
- }
-
- /**
- * test240 assumes that invoke request params will carry over to the datamodel
- * This is solved by passing the invoke request above
- */
-// _invokedInterpreter.getImpl()->setInvokeRequest(req);
_isActive = true;
// we need to make sure it is at least setup to receive data!
diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
index 78e7057..d37d2af 100644
--- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
+++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
@@ -50,7 +50,7 @@ public:
USCXMLInvoker();
virtual ~USCXMLInvoker();
- virtual std::shared_ptr<InvokerImpl> create(InterpreterImpl* interpreter);
+ virtual std::shared_ptr<InvokerImpl> create(InvokerCallbacks* callbacks);
virtual std::list<std::string> getNames() {
std::list<std::string> names;