summaryrefslogtreecommitdiffstats
path: root/src/uscxml/Message.cpp
diff options
context:
space:
mode:
authorStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2012-09-16 22:09:30 (GMT)
committerStefan Radomski <radomski@tk.informatik.tu-darmstadt.de>2012-09-16 22:09:30 (GMT)
commit30576421dd507170a96e31cd56daacc02db46e14 (patch)
treeb12f0fa2ee71d8dc37e339f73490fdcbb9c80fb8 /src/uscxml/Message.cpp
parentd7211d570f8b78442f35bd9c55808053eb18ecc2 (diff)
downloaduscxml-30576421dd507170a96e31cd56daacc02db46e14.zip
uscxml-30576421dd507170a96e31cd56daacc02db46e14.tar.gz
uscxml-30576421dd507170a96e31cd56daacc02db46e14.tar.bz2
Fixed done.state events
Diffstat (limited to 'src/uscxml/Message.cpp')
-rw-r--r--src/uscxml/Message.cpp62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/uscxml/Message.cpp b/src/uscxml/Message.cpp
index f7e7a5a..9b713ca 100644
--- a/src/uscxml/Message.cpp
+++ b/src/uscxml/Message.cpp
@@ -101,6 +101,7 @@ Arabica::DOM::Document<std::string> Event::toDocument() {
Arabica::DOM::Document<std::string> document = Data::toDocument();
Arabica::DOM::Element<std::string> scxmlMsg = document.getDocumentElement();
+
scxmlMsg.setAttribute("source", origin);
scxmlMsg.setAttribute("name", name);
@@ -112,6 +113,40 @@ Arabica::DOM::Document<std::string> SendRequest::toDocument() {
Arabica::DOM::Document<std::string> document = Event::toDocument();
Arabica::DOM::Element<std::string> scxmlMsg = document.getDocumentElement();
+ // add params and namelist
+ if (params.size() > 0 || namelist.size() > 0) {
+ Arabica::DOM::NodeList<std::string> payload = scxmlMsg.getElementsByTagName("scxml:payload");
+ if (payload.getLength() == 0) {
+ Arabica::DOM::Element<std::string> payloadElem = document.createElementNS("http://www.w3.org/2005/07/scxml", "scxml:payload");
+ scxmlMsg.appendChild(payloadElem);
+ }
+ Arabica::DOM::Node<std::string> payloadElem = scxmlMsg.getElementsByTagName("scxml:payload").item(0);
+
+ // add parameters
+ std::map<std::string, std::string>::iterator paramIter = params.begin();
+ while(paramIter != params.end()) {
+ Arabica::DOM::Element<std::string> propertyElem = document.createElementNS("http://www.w3.org/2005/07/scxml", "scxml:property");
+ propertyElem.setAttribute("name", paramIter->first);
+ Arabica::DOM::Text<std::string> textElem = document.createTextNode(paramIter->second);
+ propertyElem.appendChild(textElem);
+ payloadElem.appendChild(propertyElem);
+ paramIter++;
+ }
+
+ // add namelist elements
+ std::map<std::string, std::string>::iterator namelistIter = namelist.begin();
+ while(namelistIter != namelist.end()) {
+ Arabica::DOM::Element<std::string> propertyElem = document.createElementNS("http://www.w3.org/2005/07/scxml", "scxml:property");
+ propertyElem.setAttribute("name", namelistIter->first);
+ Arabica::DOM::Text<std::string> textElem = document.createTextNode(namelistIter->second);
+ propertyElem.appendChild(textElem);
+ payloadElem.appendChild(propertyElem);
+ namelistIter++;
+ }
+
+ }
+
+
scxmlMsg.setAttribute("sendid", sendid);
return document;
@@ -146,6 +181,31 @@ Event Event::fromXML(const std::string& xmlString) {
event.name = ATTR(scxmlMsg, "name");
if (HAS_ATTR(scxmlMsg, "sendid"))
event.sendid = ATTR(scxmlMsg, "sendid");
+
+ Arabica::DOM::NodeList<std::string> payloads = scxmlMsg.getElementsByTagName("scxml:payload");
+ if (payloads.getLength() > 0) {
+ Arabica::DOM::Node<std::string> payload = payloads.item(0);
+ if (payload.getNodeType() == Arabica::DOM::Node_base::ELEMENT_NODE) {
+ Arabica::DOM::Element<std::string> payloadElem = (Arabica::DOM::Element<std::string>)payload;
+ Arabica::DOM::NodeList<std::string> properties = payloadElem.getElementsByTagName("scxml:property");
+ if (properties.getLength() > 0) {
+ for (int i = 0; i < properties.getLength(); i++) {
+ if (HAS_ATTR(properties.item(i), "name")) {
+ std::string key = ATTR(properties.item(i), "name");
+ std::string value;
+ Arabica::DOM::NodeList<std::string> childs = properties.item(i).getChildNodes();
+ for (int j = 0; j < childs.getLength(); j++) {
+ if (childs.item(j).getNodeType() == Arabica::DOM::Node_base::TEXT_NODE) {
+ value = childs.item(j).getNodeValue();
+ break;
+ }
+ }
+ event.compound[key] = Data(value, VERBATIM);
+ }
+ }
+ }
+ }
+ }
}
return event;
}
@@ -160,7 +220,7 @@ InvokeRequest InvokeRequest::fromXML(const std::string& xmlString) {
#ifndef SWIGJAVA
std::ostream& operator<< (std::ostream& os, const Event& event) {
- os << (event.type == Event::EXTERNAL ? "External" : "Internal") << " Event " << (event.dom ? "with DOM attached" : "") << std::endl;
+ os << (event.type == Event::EXTERNAL ? "External" : "Internal") << " Event " /* << (event.dom ? "with DOM attached" : "")*/ << std::endl;
if (event.name.size() > 0)
os << " name: " << event.name << std::endl;