summaryrefslogtreecommitdiffstats
path: root/src/uscxml/Interpreter.cpp
diff options
context:
space:
mode:
authorStefan Radomski <sradomski@mintwerk.de>2015-07-08 20:03:03 (GMT)
committerStefan Radomski <sradomski@mintwerk.de>2015-07-08 20:03:03 (GMT)
commit57ba362eae6e8209cf560555fd4cc4bb76dbe2a1 (patch)
tree00a2e2c5fd6993a5ee118df147cae3ef6e9cca9a /src/uscxml/Interpreter.cpp
parentf02d7e5919f16d8396839fcff1e0588d6ccf3004 (diff)
downloaduscxml-57ba362eae6e8209cf560555fd4cc4bb76dbe2a1.zip
uscxml-57ba362eae6e8209cf560555fd4cc4bb76dbe2a1.tar.gz
uscxml-57ba362eae6e8209cf560555fd4cc4bb76dbe2a1.tar.bz2
done.event bug and prolog tests
Fixed the done.event bug and added first prolog transformed IRP tests
Diffstat (limited to 'src/uscxml/Interpreter.cpp')
-rw-r--r--src/uscxml/Interpreter.cpp73
1 files changed, 33 insertions, 40 deletions
diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp
index 58991e5..72232b8 100644
--- a/src/uscxml/Interpreter.cpp
+++ b/src/uscxml/Interpreter.cpp
@@ -1312,19 +1312,15 @@ void InterpreterImpl::setupDOM() {
// normalize document
-#if 0
- // make sure every state has an id
- Arabica::XPath::NodeSet<std::string> states;
- states.push_back(_xpath.evaluate("//" + _nsInfo.xpathPrefix + "state", _scxml).asNodeSet());
- states.push_back(_xpath.evaluate("//" + _nsInfo.xpathPrefix + "final", _scxml).asNodeSet());
- states.push_back(_xpath.evaluate("//" + _nsInfo.xpathPrefix + "history", _scxml).asNodeSet());
- for (int i = 0; i < states.size(); i++) {
- Arabica::DOM::Element<std::string> stateElem = Arabica::DOM::Element<std::string>(states[i]);
- if (!stateElem.hasAttribute("id")) {
- stateElem.setAttribute("id", UUID::getUUID());
- }
- }
-#endif
+ // make sure every state has an id - not required per spec, but needed for us
+ Arabica::XPath::NodeSet<std::string> states = getAllStates();
+ for (int i = 0; i < states.size(); i++) {
+ Arabica::DOM::Element<std::string> stateElem = Arabica::DOM::Element<std::string>(states[i]);
+ if (!stateElem.hasAttribute("id")) {
+ stateElem.setAttribute("id", UUID::getUUID());
+ }
+ _cachedStates[ATTR(stateElem, "id")] = stateElem;
+ }
// make sure every invoke has an idlocation or id - actually required!
Arabica::XPath::NodeSet<std::string> invokes = _xpath.evaluate("//" + _nsInfo.xpathPrefix + "invoke", _scxml).asNodeSet();
@@ -1620,39 +1616,36 @@ void InterpreterImpl::receive(const Event& event, bool toFront) {
_condVar.notify_all();
}
-void InterpreterImpl::internalDoneSend(const Arabica::DOM::Element<std::string>& state) {
+void InterpreterImpl::internalDoneSend(const Arabica::DOM::Element<std::string>& state, const Arabica::DOM::Element<std::string>& doneData) {
if (!isState(state))
return;
- if (parentIsScxmlState(state))
- return;
+// if (parentIsScxmlState(state))
+// return;
Event event;
- Arabica::XPath::NodeSet<std::string> doneDatas = filterChildElements(_nsInfo.xmlNSPrefix + "donedata", state);
- if (doneDatas.size() > 0) {
- // only process first donedata element
- Arabica::DOM::Element<std::string> doneData = Element<std::string>(doneDatas[0]);
- processParamChilds(doneData, event.params);
- Arabica::XPath::NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", doneDatas[0]);
- if (contents.size() > 1)
- LOG(ERROR) << "Only a single content element is allowed for send elements - using first one";
- if (contents.size() > 0) {
- std::string expr;
- processContentElement(Element<std::string>(contents[0]), event.dom, event.content, expr);
- if (expr.length() > 0) {
- try {
- event.content =_dataModel.evalAsString(expr);
- } catch (Event e) {
- e.name = "error.execution";
- e.dom = contents[0];
- receiveInternal(e);
- }
- }
- }
- }
-
- event.name = "done.state." + ATTR_CAST(state.getParentNode(), "id"); // parent?!
+ if (doneData) {
+ processParamChilds(doneData, event.params);
+ Arabica::XPath::NodeSet<std::string> contents = filterChildElements(_nsInfo.xmlNSPrefix + "content", doneData);
+ if (contents.size() > 1)
+ LOG(ERROR) << "Only a single content element is allowed for send elements - using first one";
+ if (contents.size() > 0) {
+ std::string expr;
+ processContentElement(Element<std::string>(contents[0]), event.dom, event.content, expr);
+ if (expr.length() > 0) {
+ try {
+ event.content =_dataModel.evalAsString(expr);
+ } catch (Event e) {
+ e.name = "error.execution";
+ e.dom = contents[0];
+ receiveInternal(e);
+ }
+ }
+ }
+ }
+
+ event.name = "done.state." + ATTR_CAST(state, "id"); // parent?!
receiveInternal(event);
}