summaryrefslogtreecommitdiffstats
path: root/src/uscxml/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/plugins')
-rw-r--r--src/uscxml/plugins/Invoker.cpp9
-rw-r--r--src/uscxml/plugins/Invoker.h5
-rw-r--r--src/uscxml/plugins/InvokerImpl.h13
-rw-r--r--src/uscxml/plugins/datamodel/CMakeLists.txt2
-rw-r--r--src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp18
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp41
-rw-r--r--src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h7
7 files changed, 80 insertions, 15 deletions
diff --git a/src/uscxml/plugins/Invoker.cpp b/src/uscxml/plugins/Invoker.cpp
index a021ff7..82c15f3 100644
--- a/src/uscxml/plugins/Invoker.cpp
+++ b/src/uscxml/plugins/Invoker.cpp
@@ -40,4 +40,13 @@ XERCESC_NS::DOMElement* Invoker::getFinalize() {
return _impl->getFinalize();
}
+void Invoker::deserialize(const Data& encodedState) {
+ return _impl->deserialize(encodedState);
+}
+
+Data Invoker::serialize() {
+ return _impl->serialize();
+}
+
+
}
diff --git a/src/uscxml/plugins/Invoker.h b/src/uscxml/plugins/Invoker.h
index 2191e7b..bb01ddd 100644
--- a/src/uscxml/plugins/Invoker.h
+++ b/src/uscxml/plugins/Invoker.h
@@ -56,6 +56,11 @@ public:
/// @copydoc InvokerImpl::getFinalize
virtual XERCESC_NS::DOMElement* getFinalize();
+ /// @copydoc InvokerImpl::deserialize
+ virtual void deserialize(const Data& encodedState);
+
+ /// @copydoc InvokerImpl::serialize
+ virtual Data serialize();
protected:
std::shared_ptr<InvokerImpl> _impl;
};
diff --git a/src/uscxml/plugins/InvokerImpl.h b/src/uscxml/plugins/InvokerImpl.h
index b000ce2..e0446e1 100644
--- a/src/uscxml/plugins/InvokerImpl.h
+++ b/src/uscxml/plugins/InvokerImpl.h
@@ -90,6 +90,19 @@ public:
_invokeId = invokeId;
}
+ /**
+ * Load a state from a Data object
+ * @param encodedState The state we returned somewhen else via serialize.
+ */
+ virtual void deserialize(const Data& encodedState) {}
+
+ /**
+ * Save our state into a Data object
+ */
+ virtual Data serialize() {
+ return Data();
+ }
+
protected:
/**
* Return an event to the SCXML Interpreter instance.
diff --git a/src/uscxml/plugins/datamodel/CMakeLists.txt b/src/uscxml/plugins/datamodel/CMakeLists.txt
index e68fc8f..a208856 100644
--- a/src/uscxml/plugins/datamodel/CMakeLists.txt
+++ b/src/uscxml/plugins/datamodel/CMakeLists.txt
@@ -66,7 +66,7 @@ if (WITH_DM_PROMELA)
promela/*.c
promela/*.h
)
- list (APPEND USCXML_FILES ${PROMELA_DATAMODEL})
+ list (APPEND USCXML_FILES ${PROMELA_DATAMODEL})
endif()
if (NOT SWIG_FOUND)
diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
index aae0111..22e8ccc 100644
--- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
+++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp
@@ -395,8 +395,14 @@ void JSCDataModel::setEvent(const Event& event) {
}
Data JSCDataModel::evalAsData(const std::string& content) {
- JSValueRef result = evalAsValue(content);
- return getValueAsData(result);
+ try {
+ JSValueRef result = evalAsValue(content);
+ return getValueAsData(result);
+ } catch (ErrorEvent e) {
+ // test453 vs test554
+ throw e;
+// return Data(content, Data::INTERPRETED);
+ }
}
Data JSCDataModel::getAsData(const std::string& content) {
@@ -593,7 +599,7 @@ void JSCDataModel::setForeach(const std::string& item,
const std::string& index,
uint32_t iteration) {
if (!isDeclared(item)) {
- assign(item, Data());
+ assign(item, Data("null", Data::INTERPRETED));
}
// assign array element to item
std::stringstream ss;
@@ -710,7 +716,11 @@ void JSCDataModel::assign(const std::string& location, const Data& data) {
void JSCDataModel::init(const std::string& location, const Data& data) {
try {
- assign(location, data);
+ if (data.empty()) {
+ assign(location, Data("null", Data::INTERPRETED));
+ } else {
+ assign(location, data);
+ }
} catch (ErrorEvent e) {
// test 277
evalAsValue(location + " = undefined", true);
diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
index 868fee7..0f7cc24 100644
--- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
+++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp
@@ -75,6 +75,29 @@ void USCXMLInvoker::stop() {
}
}
+void USCXMLInvoker::deserialize(const Data& encodedState) {
+ _invokedInterpreter.deserialize(encodedState["intepreter"]);
+}
+
+Data USCXMLInvoker::serialize() {
+ Data encodedState;
+
+ std::lock_guard<std::recursive_mutex> lock(_mutex);
+
+ InterpreterState state = USCXML_UNDEF;
+ while((state = _invokedInterpreter.getState())) {
+ if (state != USCXML_IDLE && state != USCXML_MACROSTEPPED && state != USCXML_FINISHED) {
+ _cond.wait(_mutex);
+ } else {
+ break;
+ }
+ }
+
+ encodedState["intepreter"] = Data(_invokedInterpreter.serialize());
+
+ return encodedState;
+}
+
void USCXMLInvoker::uninvoke() {
_isActive = false;
stop();
@@ -100,13 +123,9 @@ void USCXMLInvoker::run(void* instance) {
InterpreterState state = USCXML_UNDEF;
while(state != USCXML_FINISHED) {
- state = INSTANCE->_invokedInterpreter.step();
-
-// if (!INSTANCE->_isStarted) {
-// // we have been cancelled
-// INSTANCE->_isActive = false;
-// return;
-// }
+ std::lock_guard<std::recursive_mutex> lock(INSTANCE->_mutex);
+ state = INSTANCE->_invokedInterpreter.step(200);
+ INSTANCE->_cond.notify_all();
}
if (INSTANCE->_isActive) {
@@ -143,10 +162,11 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent)
XERCESC_NS::DOMNode* newNode = document->importNode(invokeEvent.data.node, true);
document->appendChild(newNode);
-// std::cout << *document << std::endl;
-
// TODO: where do we get the namespace from?
_invokedInterpreter = Interpreter::fromDocument(document, _interpreter->getBaseURL(), false);
+ } else if (invokeEvent.data.atom.size() > 0) {
+ // test530 when deserializing
+ _invokedInterpreter = Interpreter::fromXML(invokeEvent.data.atom, _interpreter->getBaseURL());
} else {
_isActive = false;
@@ -191,7 +211,8 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent)
start();
} else {
- /// test 530
+ // test 530
+ // TODO: Is this the correct thing/place to do?
Event e("done.invoke." + invokeEvent.invokeid, Event::PLATFORM);
eventToSCXML(e, USCXML_INVOKER_SCXML_TYPE, _invokeId);
_isActive = false;
diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
index 9509de3..78e7057 100644
--- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
+++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h
@@ -67,6 +67,9 @@ public:
virtual void invoke(const std::string& source, const Event& invokeEvent);
virtual void uninvoke();
+ virtual void deserialize(const Data& encodedState);
+ virtual Data serialize();
+
protected:
void start();
@@ -78,6 +81,10 @@ protected:
std::thread* _thread;
EventQueue _parentQueue;
Interpreter _invokedInterpreter;
+
+ std::recursive_mutex _mutex;
+ std::condition_variable_any _cond;
+
};
#ifdef BUILD_AS_PLUGINS