diff options
author | Stefan Radomski <github@mintwerk.de> | 2017-01-13 16:47:44 (GMT) |
---|---|---|
committer | Stefan Radomski <github@mintwerk.de> | 2017-01-13 16:47:44 (GMT) |
commit | 4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235 (patch) | |
tree | 8c023473bb342780ddf51a893d18369f1319bb5c /src/uscxml/plugins | |
parent | 0aa0fe08dc308c94379c47d0bf9745e341cb4c81 (diff) | |
download | uscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.zip uscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.tar.gz uscxml-4f6cbe9e7aec2b4a6c8f286f9097abfb011a6235.tar.bz2 |
First support for serialization and some bug fixes for DOM per data.src
Diffstat (limited to 'src/uscxml/plugins')
-rw-r--r-- | src/uscxml/plugins/Invoker.cpp | 9 | ||||
-rw-r--r-- | src/uscxml/plugins/Invoker.h | 5 | ||||
-rw-r--r-- | src/uscxml/plugins/InvokerImpl.h | 13 | ||||
-rw-r--r-- | src/uscxml/plugins/datamodel/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp | 18 | ||||
-rw-r--r-- | src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp | 41 | ||||
-rw-r--r-- | src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h | 7 |
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 |