summaryrefslogtreecommitdiffstats
path: root/src/uscxml/interpreter/LargeMicroStep.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/uscxml/interpreter/LargeMicroStep.cpp')
-rw-r--r--src/uscxml/interpreter/LargeMicroStep.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/uscxml/interpreter/LargeMicroStep.cpp b/src/uscxml/interpreter/LargeMicroStep.cpp
index eab303c..a6d90f4 100644
--- a/src/uscxml/interpreter/LargeMicroStep.cpp
+++ b/src/uscxml/interpreter/LargeMicroStep.cpp
@@ -111,6 +111,71 @@ void LargeMicroStep::markAsCancelled() {
_isCancelled = true;
}
+void LargeMicroStep::deserialize(const Data& encodedState) {
+ if (!encodedState.hasKey("configuration") ||
+ !encodedState.hasKey("invocations") ||
+ !encodedState.hasKey("histories") ||
+ !encodedState.hasKey("intializedData")) {
+ ERROR_PLATFORM_THROW("Data does not contain required fields for deserialization ");
+ }
+
+ reset();
+
+ for (auto stateId : encodedState["configuration"].array) {
+ _configuration.insert(_states[strTo<uint32_t>(stateId.atom)]);
+ _configurationPostFix.insert(_states[strTo<uint32_t>(stateId.atom)]);
+ }
+
+ for (auto stateId : encodedState["invocations"].array) {
+ _invocations.insert(_states[strTo<uint32_t>(stateId.atom)]);
+ }
+
+ for (auto stateId : encodedState["histories"].array) {
+ _history.insert(_states[strTo<uint32_t>(stateId.atom)]);
+ }
+
+ for (auto stateId : encodedState["intializedData"].array) {
+ _initializedData.insert(_states[strTo<uint32_t>(stateId.atom)]);
+ }
+
+ for (auto invoked : _invocations) {
+ for (auto invoker : invoked->invoke) {
+ try {
+ _callbacks->invoke(invoker);
+ } catch (ErrorEvent e) {
+ LOG(_callbacks->getLogger(), USCXML_WARN) << e;
+ } catch (...) {
+ }
+ }
+ }
+
+ _flags |= USCXML_CTX_INITIALIZED;
+}
+
+Data LargeMicroStep::serialize() {
+ Data encodedState;
+
+ encodedState["configuration"] = Data();
+ encodedState["invocations"] = Data();
+ encodedState["histories"] = Data();
+ encodedState["intializedData"] = Data();
+
+ for (auto state : _configuration) {
+ encodedState["configuration"].array.push_back(Data(state->documentOrder));
+ }
+ for (auto state : _invocations) {
+ encodedState["invocations"].array.push_back(Data(state->documentOrder));
+ }
+ for (auto state : _history) {
+ encodedState["histories"].array.push_back(Data(state->documentOrder));
+ }
+ for (auto state : _initializedData) {
+ encodedState["intializedData"].array.push_back(Data(state->documentOrder));
+ }
+
+ return encodedState;
+}
+
void LargeMicroStep::reset() {
_isCancelled = false;
_flags = USCXML_CTX_PRISTINE;
@@ -453,6 +518,11 @@ void LargeMicroStep::init(XERCESC_NS::DOMElement* scxml) {
assert(transList.size() == 0);
}
+// for (i = 0; i < _transitions.size(); i++) {
+// _transitions[i]->exitSet = getExitSet(_transitions[i]);
+// LOGD(USCXML_DEBUG) << "" << _transitions[i]->exitSet.second << " / " << _transitions[i]->exitSet.first << std::endl;
+// }
+
_isInitialized = true;
}