From 66b0852b0618cc4bfff08d47aa0af56353226190 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 13 Aug 2014 17:02:25 +0200 Subject: Started renewed VoiceXMLInvoker --- src/uscxml/Factory.cpp | 7 +- src/uscxml/messages/MMIMessages.cpp | 436 ++++++++++++++++++ src/uscxml/messages/MMIMessages.h | 499 +++++++++++++++++++++ src/uscxml/plugins/invoker/CMakeLists.txt | 38 +- .../plugins/invoker/heartbeat/HeartbeatInvoker.cpp | 2 +- .../plugins/invoker/vxml/VoiceXMLInvoker.cpp | 87 ++-- src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h | 25 +- .../plugins/ioprocessor/modality/MMIMessages.cpp | 436 ------------------ .../plugins/ioprocessor/modality/MMIMessages.h | 499 --------------------- src/uscxml/server/HTTPServer.cpp | 4 +- test/src/test-url.cpp | 2 + test/src/test-vxml-mmi-http.cpp | 8 +- test/src/test-vxml-mmi-socket.cpp | 3 +- test/uscxml/test-jvoicexml.scxml | 70 ++- 14 files changed, 1068 insertions(+), 1048 deletions(-) create mode 100644 src/uscxml/messages/MMIMessages.cpp create mode 100644 src/uscxml/messages/MMIMessages.h delete mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp delete mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIMessages.h diff --git a/src/uscxml/Factory.cpp b/src/uscxml/Factory.cpp index 3bad07f..ce09a27 100644 --- a/src/uscxml/Factory.cpp +++ b/src/uscxml/Factory.cpp @@ -58,6 +58,7 @@ # include "uscxml/plugins/element/postpone/PostponeElement.h" # include "uscxml/plugins/ioprocessor/comet/CometIOProcessor.h" +# include "uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h" # endif @@ -68,7 +69,6 @@ # if (defined UMUNDO_FOUND && defined PROTOBUF_FOUND) # include "uscxml/plugins/invoker/umundo/UmundoInvoker.h" -//# include "uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h" #endif # ifdef OPENSCENEGRAPH_FOUND @@ -370,6 +370,11 @@ void Factory::registerPlugins() { registerInvoker(invoker); } { + VoiceXMLInvoker* invoker = new VoiceXMLInvoker(); + registerInvoker(invoker); + } + + { FetchElement* element = new FetchElement(); registerExecutableContent(element); } diff --git a/src/uscxml/messages/MMIMessages.cpp b/src/uscxml/messages/MMIMessages.cpp new file mode 100644 index 0000000..1c5b98a --- /dev/null +++ b/src/uscxml/messages/MMIMessages.cpp @@ -0,0 +1,436 @@ +/** + * @file + * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#include "MMIMessages.h" + +#include +#include +#include +#include + +#include + +#include + +#define STRING_ATTR_OR_EXPR(element, name)\ +(element.hasAttributeNS(nameSpace, "name##Expr") && interpreter ? \ + interpreter->getDataModel().evalAsString(element.getAttributeNS(nameSpace, "name##Expr")) : \ + (element.hasAttributeNS(nameSpace, #name) ? element.getAttributeNS(nameSpace, #name) : "") \ +) + +#define FIND_EVENT_NODE(node)\ +while (node) {\ + if (node.getNodeType() == Node_base::ELEMENT_NODE) {\ + if (boost::iequals(node.getLocalName(), "MMI")) {\ + node = node.getFirstChild();\ + continue;\ + } else {\ + break;\ + }\ + }\ + node = node.getNextSibling();\ +}\ + + +namespace uscxml { + +using namespace Arabica::DOM; + +std::string MMIEvent::nameSpace = "http://www.w3.org/2008/04/mmi-arch"; + +MMIEvent::Type MMIEvent::getType(Arabica::DOM::Node node) { + if (!node || node.getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE) + return INVALID; + + // MMI container? + if (boost::iequals(node.getLocalName(), "MMI")) { + node = node.getFirstChild(); + if (!node) + return INVALID; + while(node.getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE) { + node = node.getNextSibling(); + if (!node) + return INVALID; + } + } + + if (boost::iequals(node.getLocalName(), "NEWCONTEXTREQUEST")) + return NEWCONTEXTREQUEST; + if (boost::iequals(node.getLocalName(), "NEWCONTEXTRESPONSE")) + return NEWCONTEXTRESPONSE; + if (boost::iequals(node.getLocalName(), "PREPAREREQUEST")) + return PREPAREREQUEST; + if (boost::iequals(node.getLocalName(), "PREPARERESPONSE")) + return PREPARERESPONSE; + if (boost::iequals(node.getLocalName(), "STARTREQUEST")) + return STARTREQUEST; + if (boost::iequals(node.getLocalName(), "STARTRESPONSE")) + return STARTRESPONSE; + if (boost::iequals(node.getLocalName(), "DONENOTIFICATION")) + return DONENOTIFICATION; + if (boost::iequals(node.getLocalName(), "CANCELREQUEST")) + return CANCELREQUEST; + if (boost::iequals(node.getLocalName(), "CANCELRESPONSE")) + return CANCELRESPONSE; + if (boost::iequals(node.getLocalName(), "PAUSEREQUEST")) + return PAUSEREQUEST; + if (boost::iequals(node.getLocalName(), "PAUSERESPONSE")) + return PAUSERESPONSE; + if (boost::iequals(node.getLocalName(), "RESUMEREQUEST")) + return RESUMEREQUEST; + if (boost::iequals(node.getLocalName(), "RESUMERESPONSE")) + return RESUMERESPONSE; + if (boost::iequals(node.getLocalName(), "EXTENSIONNOTIFICATION")) + return EXTENSIONNOTIFICATION; + if (boost::iequals(node.getLocalName(), "CLEARCONTEXTREQUEST")) + return CLEARCONTEXTREQUEST; + if (boost::iequals(node.getLocalName(), "CLEARCONTEXTRESPONSE")) + return CLEARCONTEXTRESPONSE; + if (boost::iequals(node.getLocalName(), "STATUSREQUEST")) + return STATUSREQUEST; + if (boost::iequals(node.getLocalName(), "STATUSRESPONSE")) + return STATUSRESPONSE; + return INVALID; +} + +Arabica::DOM::Document MMIEvent::toXML(bool encapsulateInMMI) const { + Arabica::DOM::DOMImplementation domFactory = Arabica::SimpleDOM::DOMImplementation::getDOMImplementation(); + Document doc = domFactory.createDocument(nameSpace, "", 0); + Element msgElem = doc.createElementNS(nameSpace, tagName); + msgElem.setAttributeNS(nameSpace, "Source", source); + msgElem.setAttributeNS(nameSpace, "Target", target); + msgElem.setAttributeNS(nameSpace, "RequestID", requestId); + + if (data.size() > 0) { + Element dataElem = doc.createElementNS(nameSpace, "Data"); + + // try to parse content + std::stringstream* ss = new std::stringstream(); + (*ss) << data; + std::auto_ptr ssPtr(ss); + Arabica::SAX::InputSource inputSource; + inputSource.setByteStream(ssPtr); + + NameSpacingParser parser; + if(parser.parse(inputSource)) { + Node importedNode = doc.importNode(parser.getDocument().getDocumentElement(), true); + dataElem.appendChild(importedNode); + } else { + Text textElem = doc.createTextNode(data); + dataElem.appendChild(textElem); + } + msgElem.appendChild(dataElem); + } + + if (encapsulateInMMI) { + Element mmiElem = doc.createElementNS(nameSpace, "mmi"); + mmiElem.appendChild(msgElem); + doc.appendChild(mmiElem); + } else { + doc.appendChild(msgElem); + } + return doc; +} + +Arabica::DOM::Document ContextualizedRequest::toXML(bool encapsulateInMMI) const { + Document doc = MMIEvent::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + msgElem.setAttributeNS(nameSpace, "Context", context); + return doc; +} + +Arabica::DOM::Document ContentRequest::toXML(bool encapsulateInMMI) const { + Document doc = ContextualizedRequest::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + + if (contentURL.href.size() > 0) { + Element contentURLElem = doc.createElementNS(nameSpace, "ContentURL"); + contentURLElem.setAttributeNS(nameSpace, "href", contentURL.href); + contentURLElem.setAttributeNS(nameSpace, "fetchtimeout", contentURL.fetchTimeout); + contentURLElem.setAttributeNS(nameSpace, "max-age", contentURL.maxAge); + msgElem.appendChild(contentURLElem); + } + + if (content.size() > 0) { + Element contentElem = doc.createElementNS(nameSpace, "content"); + + // try to parse content + std::stringstream* ss = new std::stringstream(); + (*ss) << content; + std::auto_ptr ssPtr(ss); + Arabica::SAX::InputSource inputSource; + inputSource.setByteStream(ssPtr); + + Arabica::SAX2DOM::Parser parser; + if(parser.parse(inputSource)) { + Node importedNode = doc.importNode(parser.getDocument().getDocumentElement(), true); + contentElem.appendChild(importedNode); + } else { + Text textElem = doc.createTextNode(content); + contentElem.appendChild(textElem); + } + msgElem.appendChild(contentElem); + + } + return doc; +} + +Arabica::DOM::Document ExtensionNotification::toXML(bool encapsulateInMMI) const { + Document doc = ContextualizedRequest::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + msgElem.setAttributeNS(nameSpace, "Name", name); + return doc; +} + +Arabica::DOM::Document StatusResponse::toXML(bool encapsulateInMMI) const { + Document doc = ContextualizedRequest::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + if (status == ALIVE) { + msgElem.setAttributeNS(nameSpace, "Status", "alive"); + } else if(status == DEAD) { + msgElem.setAttributeNS(nameSpace, "Status", "dead"); + } else if(status == FAILURE) { + msgElem.setAttributeNS(nameSpace, "Status", "failure"); + } else if(status == SUCCESS) { + msgElem.setAttributeNS(nameSpace, "Status", "success"); + } + return doc; +} + +Arabica::DOM::Document StatusInfoResponse::toXML(bool encapsulateInMMI) const { + Document doc = StatusResponse::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + + Element statusInfoElem = doc.createElementNS(nameSpace, "StatusInfo"); + Text statusInfoText = doc.createTextNode(statusInfo); + statusInfoElem.appendChild(statusInfoText); + msgElem.appendChild(statusInfoElem); + + return doc; +} + +Arabica::DOM::Document StatusRequest::toXML(bool encapsulateInMMI) const { + Document doc = ContextualizedRequest::toXML(encapsulateInMMI); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + + if (automaticUpdate) { + msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "true"); + } else { + msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "false"); + } + + return doc; +} + +MMIEvent MMIEvent::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + MMIEvent msg; + FIND_EVENT_NODE(node); + + Element msgElem(node); + msg.source = STRING_ATTR_OR_EXPR(msgElem, Source); + msg.target = STRING_ATTR_OR_EXPR(msgElem, Target); +// msg.data = STRING_ATTR_OR_EXPR(msgElem, Data); + msg.requestId = STRING_ATTR_OR_EXPR(msgElem, RequestID); + msg.tagName = msgElem.getLocalName(); + + Element dataElem; + node = msgElem.getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + dataElem = Element(node); + if (dataElem && boost::iequals(dataElem.getLocalName(), "data")) + break; + node = node.getNextSibling(); + } + + if (dataElem && boost::iequals(dataElem.getLocalName(), "data")) { + std::stringstream ss; + node = dataElem.getFirstChild(); + if (node) + ss << node; + msg.data = ss.str(); + } + + return msg; +} + +MMIEvent::operator Event() const { + Event ev; + ev.setOriginType("mmi.event"); + ev.setOrigin(source); + ev.setRaw(data); + ev.setSendId(requestId); + if (data.length() > 0) { + ev.initContent(data); + } + return ev; +} + +ContextualizedRequest ContextualizedRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + ContextualizedRequest msg(MMIEvent::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + msg.context = STRING_ATTR_OR_EXPR(msgElem, Context); + return msg; +} + +ContextualizedRequest::operator Event() const { + Event ev = MMIEvent::operator Event(); + // do we want to represent the context? It's the interpreters name already + return ev; +} + + +ContentRequest ContentRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + ContentRequest msg(ContextualizedRequest::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + Element contentElem; + + node = msgElem.getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) { + contentElem = Element(node); + if (boost::iequals(contentElem.getLocalName(), "content") || + boost::iequals(contentElem.getLocalName(), "contentURL")) + break; + } + node = node.getNextSibling(); + } + + if (contentElem) { + if(boost::iequals(contentElem.getLocalName(), "content")) { + std::stringstream ss; + node = contentElem.getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) { + ss << node; + break; + } + node = node.getNextSibling(); + } + msg.content = ss.str(); + } else if(boost::iequals(contentElem.getLocalName(), "contentURL")) { + msg.contentURL.href = STRING_ATTR_OR_EXPR(contentElem, href); + msg.contentURL.maxAge = STRING_ATTR_OR_EXPR(contentElem, max-age); + msg.contentURL.fetchTimeout = STRING_ATTR_OR_EXPR(contentElem, fetchtimeout); + } + } + + //msg.content = msgElem.getAttributeNS(nameSpace, "Context"); + return msg; +} + +ExtensionNotification ExtensionNotification::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + ExtensionNotification msg(ContextualizedRequest::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + msg.name = STRING_ATTR_OR_EXPR(msgElem, Name); + msg.type = EXTENSIONNOTIFICATION; + return msg; +} + +ExtensionNotification::operator Event() const { + Event ev = ContextualizedRequest::operator Event(); + if (name.length() > 0) { + ev.setName("mmi.extensionnotification." + name); + } else { + ev.setName("mmi.extensionnotification"); + } + return ev; +} + +StatusResponse StatusResponse::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + StatusResponse msg(ContextualizedRequest::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + std::string status = STRING_ATTR_OR_EXPR(msgElem, Status); + + if (boost::iequals(status, "ALIVE")) { + msg.status = ALIVE; + } else if(boost::iequals(status, "DEAD")) { + msg.status = DEAD; + } else if(boost::iequals(status, "FAILURE")) { + msg.status = FAILURE; + } else if(boost::iequals(status, "SUCCESS")) { + msg.status = SUCCESS; + } + msg.type = STATUSRESPONSE; + return msg; +} + +StatusInfoResponse StatusInfoResponse::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + StatusInfoResponse msg(StatusResponse::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + Element statusInfoElem; + + node = msgElem.getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) { + statusInfoElem = Element(node); + if (statusInfoElem && boost::iequals(statusInfoElem.getLocalName(), "statusInfo")) + break; + } + node = node.getNextSibling(); + } + + if (statusInfoElem && boost::iequals(statusInfoElem.getLocalName(), "statusInfo")) { + node = statusInfoElem.getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::TEXT_NODE) { + msg.statusInfo = node.getNodeValue(); + break; + } + node = node.getNextSibling(); + } + } + return msg; +} + + +StatusRequest StatusRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { + StatusRequest msg(ContextualizedRequest::fromXML(node, interpreter)); + FIND_EVENT_NODE(node); + + Element msgElem(node); + std::string autoUpdate = STRING_ATTR_OR_EXPR(msgElem, RequestAutomaticUpdate); + + if (boost::iequals(autoUpdate, "true")) { + msg.automaticUpdate = true; + } else if(boost::iequals(autoUpdate, "on")) { + msg.automaticUpdate = true; + } else if(boost::iequals(autoUpdate, "yes")) { + msg.automaticUpdate = true; + } else if(boost::iequals(autoUpdate, "1")) { + msg.automaticUpdate = true; + } else { + msg.automaticUpdate = false; + } + msg.type = STATUSREQUEST; + return msg; +} + + +} \ No newline at end of file diff --git a/src/uscxml/messages/MMIMessages.h b/src/uscxml/messages/MMIMessages.h new file mode 100644 index 0000000..e4456f8 --- /dev/null +++ b/src/uscxml/messages/MMIMessages.h @@ -0,0 +1,499 @@ +/** + * @file + * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#ifndef MMIEVENT_H_OS0SE7H5 +#define MMIEVENT_H_OS0SE7H5 + +#include +#include +#include + +namespace uscxml { + +class MMIEvent { +public: + enum Type { + NEWCONTEXTREQUEST, + NEWCONTEXTRESPONSE, + PREPAREREQUEST, + PREPARERESPONSE, + STARTREQUEST, + STARTRESPONSE, + DONENOTIFICATION, + CANCELREQUEST, + CANCELRESPONSE, + PAUSEREQUEST, + PAUSERESPONSE, + RESUMEREQUEST, + RESUMERESPONSE, + EXTENSIONNOTIFICATION, + CLEARCONTEXTREQUEST, + CLEARCONTEXTRESPONSE, + STATUSREQUEST, + STATUSRESPONSE, + INVALID + }; + + static Type getType(Arabica::DOM::Node node); + + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static MMIEvent fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + + // conversion operator + operator Event() const; + + std::string source; + std::string target; + std::string data; + std::string requestId; + std::string tagName; + Type type; + + static std::string nameSpace; + +protected: + MMIEvent() {} +}; + +class MMIEventReceiver { +public: + virtual void received(const MMIEvent& mmiEvent) = 0; +}; + +class MMIEventSender { +public: + virtual void send(const MMIEvent& mmiEvent) = 0; +}; + +class NewContextRequest : public MMIEvent { +public: + NewContextRequest() { + tagName = "NewContextRequest"; + type = NEWCONTEXTREQUEST; + } + NewContextRequest(const MMIEvent& father) : MMIEvent(father) {} + static NewContextRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + MMIEvent event = MMIEvent::fromXML(node, interpreter); + event.type = NEWCONTEXTREQUEST; + return event; + } + operator Event() const { + Event ev = MMIEvent::operator Event(); + ev.setName("mmi.newcontextrequest"); + ev.setDOM(toXML()); + return ev; + } + std::string token; ///< special token for server-less modality components +}; + +class ContextualizedRequest : public MMIEvent { +public: + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static ContextualizedRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + operator Event() const; + std::string context; +protected: + ContextualizedRequest() {} + ContextualizedRequest(const MMIEvent& father) : MMIEvent(father) {} +}; + +class PauseRequest : public ContextualizedRequest { +public: + PauseRequest() { + tagName = "PauseRequest"; + type = PAUSEREQUEST; + } + PauseRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static PauseRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + PauseRequest event = ContextualizedRequest::fromXML(node, interpreter); + event.type = PAUSEREQUEST; + return event; + } + operator Event() const { + Event ev = ContextualizedRequest::operator Event(); + ev.setName("mmi.pauserequest"); + ev.setDOM(toXML()); + return ev; + } + +}; +class ResumeRequest : public ContextualizedRequest { +public: + ResumeRequest() { + tagName = "ResumeRequest"; + type = RESUMEREQUEST; + } + ResumeRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static ResumeRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + ResumeRequest event = ContextualizedRequest::fromXML(node, interpreter); + event.type = RESUMEREQUEST; + return event; + } + operator Event() const { + Event ev = ContextualizedRequest::operator Event(); + ev.setDOM(toXML()); + ev.setName("mmi.resumerequest"); + return ev; + } + +}; +class CancelRequest : public ContextualizedRequest { +public: + CancelRequest() { + tagName = "CancelRequest"; + type = CANCELREQUEST; + } + CancelRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static CancelRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + CancelRequest event = ContextualizedRequest::fromXML(node, interpreter); + event.type = CANCELREQUEST; + return event; + } + operator Event() const { + Event ev = ContextualizedRequest::operator Event(); + ev.setName("mmi.cancelrequest"); + ev.setDOM(toXML()); + return ev; + } + +}; +class ClearContextRequest : public ContextualizedRequest { +public: + ClearContextRequest() { + tagName = "ClearContextRequest"; + type = CLEARCONTEXTREQUEST; + } + ClearContextRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static ClearContextRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + ClearContextRequest event = ContextualizedRequest::fromXML(node, interpreter); + event.type = CLEARCONTEXTREQUEST; + return event; + } + operator Event() const { + Event ev = ContextualizedRequest::operator Event(); + ev.setName("mmi.clearcontextrequest"); + ev.setDOM(toXML()); + return ev; + } + +}; +class StatusRequest : public ContextualizedRequest { +public: + StatusRequest() { + tagName = "StatusRequest"; + type = STARTREQUEST; + } + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static StatusRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + operator Event() const; + bool automaticUpdate; +protected: + StatusRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} +}; + +class ContentRequest : public ContextualizedRequest { +public: + struct ContentURL { + std::string href; + std::string maxAge; + std::string fetchTimeout; + }; + + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static ContentRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + operator Event() const; + std::string content; + ContentURL contentURL; +protected: + ContentRequest() {} + ContentRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} +}; + +class PrepareRequest : public ContentRequest { +public: + PrepareRequest() { + tagName = "PrepareRequest"; + type = PREPAREREQUEST; + } + PrepareRequest(const ContentRequest& father) : ContentRequest(father) {} + static PrepareRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + PrepareRequest event = ContentRequest::fromXML(node, interpreter); + event.type = PREPAREREQUEST; + return event; + } + operator Event() const { + Event ev = ContentRequest::operator Event(); + ev.setName("mmi.preparerequest"); + ev.setDOM(toXML()); + return ev; + } +}; + +class StartRequest : public ContentRequest { +public: + StartRequest() { + tagName = "StartRequest"; + type = STARTREQUEST; + } + StartRequest(const ContentRequest& father) : ContentRequest(father) {} + static StartRequest fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + StartRequest event = ContentRequest::fromXML(node, interpreter); + event.type = STARTREQUEST; + return event; + } + operator Event() const { + Event ev = ContentRequest::operator Event(); + ev.setName("mmi.startrequest"); + ev.setDOM(toXML()); + return ev; + } + +}; + +class ExtensionNotification : public ContextualizedRequest { +public: + ExtensionNotification() { + tagName = "ExtensionNotification"; + type = EXTENSIONNOTIFICATION; + } + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static ExtensionNotification fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + operator Event() const; + std::string name; +protected: + ExtensionNotification(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + +}; + +class StatusResponse : public ContextualizedRequest { +public: + enum Status { + ALIVE = 0, + DEAD = 1, + SUCCESS = 2, + FAILURE = 3 + }; + + StatusResponse() { + tagName = "StatusResponse"; + type = STATUSRESPONSE; + } + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + static StatusResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + Status status; +protected: + StatusResponse(const ContextualizedRequest& father) : ContextualizedRequest(father) {} +}; + +class StatusInfoResponse : public StatusResponse { +public: + virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; + StatusInfoResponse(const StatusResponse& father) : StatusResponse(father) {} + static StatusInfoResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL); + std::string statusInfo; +protected: + StatusInfoResponse() {} +}; + +class PrepareResponse : public StatusInfoResponse { +public: + PrepareResponse() { + tagName = "PrepareResponse"; + type = PREPARERESPONSE; + } + PrepareResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static PrepareResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + PrepareResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = PREPARERESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.prepareresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class StartResponse : public StatusInfoResponse { +public: + StartResponse() { + tagName = "StartResponse"; + type = STARTRESPONSE; + } + StartResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static StartResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + StartResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = STARTRESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.startresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class CancelResponse : public StatusInfoResponse { +public: + CancelResponse() { + tagName = "CancelResponse"; + type = CANCELRESPONSE; + } + CancelResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static CancelResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + CancelResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = CANCELRESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.cancelresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class PauseResponse : public StatusInfoResponse { +public: + PauseResponse() { + tagName = "PauseResponse"; + type = PAUSERESPONSE; + } + PauseResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static PauseResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + PauseResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = PAUSERESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.pauseresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class ResumeResponse : public StatusInfoResponse { +public: + ResumeResponse() { + tagName = "ResumeResponse"; + type = RESUMERESPONSE; + } + ResumeResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static ResumeResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + ResumeResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = RESUMERESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.resumeresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class ClearContextResponse : public StatusInfoResponse { +public: + ClearContextResponse() { + tagName = "ClearContextResponse"; + type = CLEARCONTEXTRESPONSE; + } + ClearContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static ClearContextResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + ClearContextResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = CLEARCONTEXTRESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.clearcontextresponse"); + ev.setDOM(toXML()); + return ev; + } +}; + +class NewContextResponse : public StatusInfoResponse { +public: + NewContextResponse() { + tagName = "NewContextResponse"; + type = NEWCONTEXTRESPONSE; + } + NewContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static NewContextResponse fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + NewContextResponse event = StatusInfoResponse::fromXML(node, interpreter); + event.type = NEWCONTEXTRESPONSE; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.newcontextresponse"); + ev.setDOM(toXML()); + return ev; + } + +}; + +class DoneNotification : public StatusInfoResponse { +public: + DoneNotification() { + tagName = "DoneNotification"; + type = DONENOTIFICATION; + } + DoneNotification(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static DoneNotification fromXML(Arabica::DOM::Node node, + InterpreterImpl* interpreter = NULL) { + DoneNotification event = StatusInfoResponse::fromXML(node, interpreter); + event.type = DONENOTIFICATION; + return event; + } + operator Event() const { + Event ev = StatusInfoResponse::operator Event(); + ev.setName("mmi.donenotification"); + ev.setDOM(toXML()); + return ev; + } +}; + +} + +#endif /* end of include guard: MMIEVENT_H_OS0SE7H5 */ diff --git a/src/uscxml/plugins/invoker/CMakeLists.txt b/src/uscxml/plugins/invoker/CMakeLists.txt index 31ec444..2d55aa1 100644 --- a/src/uscxml/plugins/invoker/CMakeLists.txt +++ b/src/uscxml/plugins/invoker/CMakeLists.txt @@ -550,27 +550,23 @@ if (NOT BUILD_MINIMAL) endif() - # VoiceXML modality components - - if (UMUNDO_FOUND AND OFF) - set(USCXML_INVOKERS "vxml ${USCXML_INVOKERS}") - file(GLOB_RECURSE VXML_INVOKER - vxml/*.cpp - vxml/*.h - ) - if (BUILD_AS_PLUGINS) - source_group("" FILES ${VXML_INVOKER}) - add_library( - invoker_voicexml SHARED - ${VXML_INVOKER} - "../Plugins.cpp") - target_link_libraries(invoker_voicexml uscxml) - set_target_properties(invoker_voicexml PROPERTIES FOLDER "Plugin Invoker") - set_target_properties(invoker_voicexml PROPERTIES COMPILE_FLAGS "-DPLUMA_EXPORTS") - set_target_properties(invoker_voicexml PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib") - else() - list (APPEND USCXML_FILES ${VXML_INVOKER}) - endif() + set(USCXML_INVOKERS "vxml ${USCXML_INVOKERS}") + file(GLOB_RECURSE VXML_INVOKER + vxml/*.cpp + vxml/*.h + ) + if (BUILD_AS_PLUGINS) + source_group("" FILES ${VXML_INVOKER}) + add_library( + invoker_voicexml SHARED + ${VXML_INVOKER} + "../Plugins.cpp") + target_link_libraries(invoker_voicexml uscxml) + set_target_properties(invoker_voicexml PROPERTIES FOLDER "Plugin Invoker") + set_target_properties(invoker_voicexml PROPERTIES COMPILE_FLAGS "-DPLUMA_EXPORTS") + set_target_properties(invoker_voicexml PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib") + else() + list (APPEND USCXML_FILES ${VXML_INVOKER}) endif() endif() # BUILD_MINIMAL diff --git a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp index f8b4904..cc06b52 100644 --- a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp +++ b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp @@ -98,7 +98,7 @@ void HeartbeatInvoker::invoke(const InvokeRequest& req) { void HeartbeatInvoker::dispatch(void* instance, std::string name) { HeartbeatInvoker* invoker = (HeartbeatInvoker*)instance; - invoker->returnEvent(invoker->_event); + invoker->returnEvent(invoker->_event, true); } HeartbeatDispatcher* HeartbeatDispatcher::_instance = NULL; diff --git a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp index 573920f..5a79094 100644 --- a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp @@ -19,11 +19,25 @@ #include "VoiceXMLInvoker.h" #include +#include "uscxml/UUID.h" + +#include #ifdef BUILD_AS_PLUGINS #include #endif +#define ISSUE_REQUEST(name) {\ + Arabica::DOM::Document name##XML = name.toXML(true);\ + name##XML.getDocumentElement().setPrefix("mmi");\ + std::stringstream name##XMLSS;\ + name##XMLSS << name##XML;\ + URL name##URL(target);\ + name##URL.setOutContent(name##XMLSS.str());\ + name##URL.addOutHeader("Content-type", "application/xml");\ + name##URL.download(false);\ +} + namespace uscxml { #ifdef BUILD_AS_PLUGINS @@ -43,20 +57,15 @@ VoiceXMLInvoker::~VoiceXMLInvoker() { boost::shared_ptr VoiceXMLInvoker::create(InterpreterImpl* interpreter) { boost::shared_ptr invoker = boost::shared_ptr(new VoiceXMLInvoker()); invoker->_interpreter = interpreter; - invoker->_pub = umundo::TypedPublisher("mmi:jvoicexml"); - invoker->_sub = umundo::TypedSubscriber("mmi:jvoicexml"); - - invoker->_pub.registerType("LifeCycleEvent", new ::LifeCycleEvent()); - - - invoker->_node.addPublisher(invoker->_pub); - invoker->_node.addSubscriber(invoker->_sub); - return invoker; } -void VoiceXMLInvoker::receive(void* object, umundo::Message* msg) { - std::cout << msg->getMeta("um.s11n.type") << std::endl; +bool VoiceXMLInvoker::httpRecvRequest(const HTTPServer::Request& request) { + return true; +} + +void VoiceXMLInvoker::setURL(const std::string& url) { + _url = url; } Data VoiceXMLInvoker::getDataModelVariables() { @@ -65,33 +74,43 @@ Data VoiceXMLInvoker::getDataModelVariables() { } void VoiceXMLInvoker::send(const SendRequest& req) { - StartRequest start; - std::stringstream domSS; -// if (req.dom) { -// // hack until jVoiceXML supports XML -// std::cout << req.dom; -// Arabica::DOM::NodeList prompts = req.dom.getElementsByTagName("vxml:prompt"); -// for (int i = 0; i < prompts.getLength(); i++) { -// if (prompts.item(i).hasChildNodes()) { -// domSS << prompts.item(i).getFirstChild().getNodeValue() << "."; -// } -// } -// } -// domSS << req.getFirstDOMElement(); - domSS << req.dom; - start.content = domSS.str(); - _interpreter->getDataModel().replaceExpressions(start.content); - - start.requestId = "asdf"; - start.source = "asdf"; - start.target = "umundo://mmi/jvoicexml"; - ::LifeCycleEvent lce = MMIProtoBridge::toProto(start); - _pub.sendObj("LifeCycleEvent", &lce); } void VoiceXMLInvoker::invoke(const InvokeRequest& req) { - _pub.waitForSubscribers(1); + HTTPServer::getInstance()->registerServlet(req.invokeid, this); + + std::string target; + Event::getParam(req.params, "target", target); + + NewContextRequest newCtxReq; + newCtxReq.source = _url; + newCtxReq.target = target; + newCtxReq.requestId = uscxml::UUID::getUUID(); + ISSUE_REQUEST(newCtxReq); + + _isRunning = true; + _thread = new tthread::thread(VoiceXMLInvoker::run, this); + +} +void VoiceXMLInvoker::run(void* instance) { + VoiceXMLInvoker* INSTANCE = (VoiceXMLInvoker*)instance; + while(true) { + SendRequest req = INSTANCE->_workQueue.pop(); + if (INSTANCE->_isRunning) { + INSTANCE->process(req); + } else { + return; + } + } +} + +void VoiceXMLInvoker::process(SendRequest& ctx) { + +} + +void VoiceXMLInvoker::uninvoke() { + HTTPServer::getInstance()->unregisterServlet(this); } } \ No newline at end of file diff --git a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h index 88afc1b..b70a073 100644 --- a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h +++ b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h @@ -21,11 +21,10 @@ #define VOICEXMLINVOKER_H_W09J90F0 #include -#include -#include +#include +#include "uscxml/server/HTTPServer.h" -#include -#include +// #include #ifdef BUILD_AS_PLUGINS #include "uscxml/plugins/Plugins.h" @@ -33,7 +32,7 @@ namespace uscxml { -class VoiceXMLInvoker : public InvokerImpl, public umundo::TypedReceiver { +class VoiceXMLInvoker : public InvokerImpl, public HTTPServlet { public: VoiceXMLInvoker(); virtual ~VoiceXMLInvoker(); @@ -47,17 +46,23 @@ public: return names; } - virtual void receive(void* object, umundo::Message* msg); - + bool httpRecvRequest(const HTTPServer::Request& request); + void setURL(const std::string& url); + virtual Data getDataModelVariables(); virtual void send(const SendRequest& req); virtual void invoke(const InvokeRequest& req); + virtual void uninvoke(); + static void run(void*); + void process(SendRequest& ctx); protected: - umundo::Node _node; - umundo::TypedPublisher _pub; - umundo::TypedSubscriber _sub; + std::string _url; + + tthread::thread* _thread; + concurrency::BlockingQueue _workQueue; + bool _isRunning; }; #ifdef BUILD_AS_PLUGINS diff --git a/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp b/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp deleted file mode 100644 index 1c5b98a..0000000 --- a/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp +++ /dev/null @@ -1,436 +0,0 @@ -/** - * @file - * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) - * @copyright Simplified BSD - * - * @cond - * This program is free software: you can redistribute it and/or modify - * it under the terms of the FreeBSD license as published by the FreeBSD - * project. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the FreeBSD license along with this - * program. If not, see . - * @endcond - */ - -#include "MMIMessages.h" - -#include -#include -#include -#include - -#include - -#include - -#define STRING_ATTR_OR_EXPR(element, name)\ -(element.hasAttributeNS(nameSpace, "name##Expr") && interpreter ? \ - interpreter->getDataModel().evalAsString(element.getAttributeNS(nameSpace, "name##Expr")) : \ - (element.hasAttributeNS(nameSpace, #name) ? element.getAttributeNS(nameSpace, #name) : "") \ -) - -#define FIND_EVENT_NODE(node)\ -while (node) {\ - if (node.getNodeType() == Node_base::ELEMENT_NODE) {\ - if (boost::iequals(node.getLocalName(), "MMI")) {\ - node = node.getFirstChild();\ - continue;\ - } else {\ - break;\ - }\ - }\ - node = node.getNextSibling();\ -}\ - - -namespace uscxml { - -using namespace Arabica::DOM; - -std::string MMIEvent::nameSpace = "http://www.w3.org/2008/04/mmi-arch"; - -MMIEvent::Type MMIEvent::getType(Arabica::DOM::Node node) { - if (!node || node.getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE) - return INVALID; - - // MMI container? - if (boost::iequals(node.getLocalName(), "MMI")) { - node = node.getFirstChild(); - if (!node) - return INVALID; - while(node.getNodeType() != Arabica::DOM::Node_base::ELEMENT_NODE) { - node = node.getNextSibling(); - if (!node) - return INVALID; - } - } - - if (boost::iequals(node.getLocalName(), "NEWCONTEXTREQUEST")) - return NEWCONTEXTREQUEST; - if (boost::iequals(node.getLocalName(), "NEWCONTEXTRESPONSE")) - return NEWCONTEXTRESPONSE; - if (boost::iequals(node.getLocalName(), "PREPAREREQUEST")) - return PREPAREREQUEST; - if (boost::iequals(node.getLocalName(), "PREPARERESPONSE")) - return PREPARERESPONSE; - if (boost::iequals(node.getLocalName(), "STARTREQUEST")) - return STARTREQUEST; - if (boost::iequals(node.getLocalName(), "STARTRESPONSE")) - return STARTRESPONSE; - if (boost::iequals(node.getLocalName(), "DONENOTIFICATION")) - return DONENOTIFICATION; - if (boost::iequals(node.getLocalName(), "CANCELREQUEST")) - return CANCELREQUEST; - if (boost::iequals(node.getLocalName(), "CANCELRESPONSE")) - return CANCELRESPONSE; - if (boost::iequals(node.getLocalName(), "PAUSEREQUEST")) - return PAUSEREQUEST; - if (boost::iequals(node.getLocalName(), "PAUSERESPONSE")) - return PAUSERESPONSE; - if (boost::iequals(node.getLocalName(), "RESUMEREQUEST")) - return RESUMEREQUEST; - if (boost::iequals(node.getLocalName(), "RESUMERESPONSE")) - return RESUMERESPONSE; - if (boost::iequals(node.getLocalName(), "EXTENSIONNOTIFICATION")) - return EXTENSIONNOTIFICATION; - if (boost::iequals(node.getLocalName(), "CLEARCONTEXTREQUEST")) - return CLEARCONTEXTREQUEST; - if (boost::iequals(node.getLocalName(), "CLEARCONTEXTRESPONSE")) - return CLEARCONTEXTRESPONSE; - if (boost::iequals(node.getLocalName(), "STATUSREQUEST")) - return STATUSREQUEST; - if (boost::iequals(node.getLocalName(), "STATUSRESPONSE")) - return STATUSRESPONSE; - return INVALID; -} - -Arabica::DOM::Document MMIEvent::toXML(bool encapsulateInMMI) const { - Arabica::DOM::DOMImplementation domFactory = Arabica::SimpleDOM::DOMImplementation::getDOMImplementation(); - Document doc = domFactory.createDocument(nameSpace, "", 0); - Element msgElem = doc.createElementNS(nameSpace, tagName); - msgElem.setAttributeNS(nameSpace, "Source", source); - msgElem.setAttributeNS(nameSpace, "Target", target); - msgElem.setAttributeNS(nameSpace, "RequestID", requestId); - - if (data.size() > 0) { - Element dataElem = doc.createElementNS(nameSpace, "Data"); - - // try to parse content - std::stringstream* ss = new std::stringstream(); - (*ss) << data; - std::auto_ptr ssPtr(ss); - Arabica::SAX::InputSource inputSource; - inputSource.setByteStream(ssPtr); - - NameSpacingParser parser; - if(parser.parse(inputSource)) { - Node importedNode = doc.importNode(parser.getDocument().getDocumentElement(), true); - dataElem.appendChild(importedNode); - } else { - Text textElem = doc.createTextNode(data); - dataElem.appendChild(textElem); - } - msgElem.appendChild(dataElem); - } - - if (encapsulateInMMI) { - Element mmiElem = doc.createElementNS(nameSpace, "mmi"); - mmiElem.appendChild(msgElem); - doc.appendChild(mmiElem); - } else { - doc.appendChild(msgElem); - } - return doc; -} - -Arabica::DOM::Document ContextualizedRequest::toXML(bool encapsulateInMMI) const { - Document doc = MMIEvent::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - msgElem.setAttributeNS(nameSpace, "Context", context); - return doc; -} - -Arabica::DOM::Document ContentRequest::toXML(bool encapsulateInMMI) const { - Document doc = ContextualizedRequest::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - - if (contentURL.href.size() > 0) { - Element contentURLElem = doc.createElementNS(nameSpace, "ContentURL"); - contentURLElem.setAttributeNS(nameSpace, "href", contentURL.href); - contentURLElem.setAttributeNS(nameSpace, "fetchtimeout", contentURL.fetchTimeout); - contentURLElem.setAttributeNS(nameSpace, "max-age", contentURL.maxAge); - msgElem.appendChild(contentURLElem); - } - - if (content.size() > 0) { - Element contentElem = doc.createElementNS(nameSpace, "content"); - - // try to parse content - std::stringstream* ss = new std::stringstream(); - (*ss) << content; - std::auto_ptr ssPtr(ss); - Arabica::SAX::InputSource inputSource; - inputSource.setByteStream(ssPtr); - - Arabica::SAX2DOM::Parser parser; - if(parser.parse(inputSource)) { - Node importedNode = doc.importNode(parser.getDocument().getDocumentElement(), true); - contentElem.appendChild(importedNode); - } else { - Text textElem = doc.createTextNode(content); - contentElem.appendChild(textElem); - } - msgElem.appendChild(contentElem); - - } - return doc; -} - -Arabica::DOM::Document ExtensionNotification::toXML(bool encapsulateInMMI) const { - Document doc = ContextualizedRequest::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - msgElem.setAttributeNS(nameSpace, "Name", name); - return doc; -} - -Arabica::DOM::Document StatusResponse::toXML(bool encapsulateInMMI) const { - Document doc = ContextualizedRequest::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - if (status == ALIVE) { - msgElem.setAttributeNS(nameSpace, "Status", "alive"); - } else if(status == DEAD) { - msgElem.setAttributeNS(nameSpace, "Status", "dead"); - } else if(status == FAILURE) { - msgElem.setAttributeNS(nameSpace, "Status", "failure"); - } else if(status == SUCCESS) { - msgElem.setAttributeNS(nameSpace, "Status", "success"); - } - return doc; -} - -Arabica::DOM::Document StatusInfoResponse::toXML(bool encapsulateInMMI) const { - Document doc = StatusResponse::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - - Element statusInfoElem = doc.createElementNS(nameSpace, "StatusInfo"); - Text statusInfoText = doc.createTextNode(statusInfo); - statusInfoElem.appendChild(statusInfoText); - msgElem.appendChild(statusInfoElem); - - return doc; -} - -Arabica::DOM::Document StatusRequest::toXML(bool encapsulateInMMI) const { - Document doc = ContextualizedRequest::toXML(encapsulateInMMI); - Element msgElem = Element(doc.getDocumentElement().getFirstChild()); - - if (automaticUpdate) { - msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "true"); - } else { - msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "false"); - } - - return doc; -} - -MMIEvent MMIEvent::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - MMIEvent msg; - FIND_EVENT_NODE(node); - - Element msgElem(node); - msg.source = STRING_ATTR_OR_EXPR(msgElem, Source); - msg.target = STRING_ATTR_OR_EXPR(msgElem, Target); -// msg.data = STRING_ATTR_OR_EXPR(msgElem, Data); - msg.requestId = STRING_ATTR_OR_EXPR(msgElem, RequestID); - msg.tagName = msgElem.getLocalName(); - - Element dataElem; - node = msgElem.getFirstChild(); - while (node) { - if (node.getNodeType() == Node_base::ELEMENT_NODE) - dataElem = Element(node); - if (dataElem && boost::iequals(dataElem.getLocalName(), "data")) - break; - node = node.getNextSibling(); - } - - if (dataElem && boost::iequals(dataElem.getLocalName(), "data")) { - std::stringstream ss; - node = dataElem.getFirstChild(); - if (node) - ss << node; - msg.data = ss.str(); - } - - return msg; -} - -MMIEvent::operator Event() const { - Event ev; - ev.setOriginType("mmi.event"); - ev.setOrigin(source); - ev.setRaw(data); - ev.setSendId(requestId); - if (data.length() > 0) { - ev.initContent(data); - } - return ev; -} - -ContextualizedRequest ContextualizedRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - ContextualizedRequest msg(MMIEvent::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - msg.context = STRING_ATTR_OR_EXPR(msgElem, Context); - return msg; -} - -ContextualizedRequest::operator Event() const { - Event ev = MMIEvent::operator Event(); - // do we want to represent the context? It's the interpreters name already - return ev; -} - - -ContentRequest ContentRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - ContentRequest msg(ContextualizedRequest::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - Element contentElem; - - node = msgElem.getFirstChild(); - while (node) { - if (node.getNodeType() == Node_base::ELEMENT_NODE) { - contentElem = Element(node); - if (boost::iequals(contentElem.getLocalName(), "content") || - boost::iequals(contentElem.getLocalName(), "contentURL")) - break; - } - node = node.getNextSibling(); - } - - if (contentElem) { - if(boost::iequals(contentElem.getLocalName(), "content")) { - std::stringstream ss; - node = contentElem.getFirstChild(); - while (node) { - if (node.getNodeType() == Node_base::ELEMENT_NODE) { - ss << node; - break; - } - node = node.getNextSibling(); - } - msg.content = ss.str(); - } else if(boost::iequals(contentElem.getLocalName(), "contentURL")) { - msg.contentURL.href = STRING_ATTR_OR_EXPR(contentElem, href); - msg.contentURL.maxAge = STRING_ATTR_OR_EXPR(contentElem, max-age); - msg.contentURL.fetchTimeout = STRING_ATTR_OR_EXPR(contentElem, fetchtimeout); - } - } - - //msg.content = msgElem.getAttributeNS(nameSpace, "Context"); - return msg; -} - -ExtensionNotification ExtensionNotification::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - ExtensionNotification msg(ContextualizedRequest::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - msg.name = STRING_ATTR_OR_EXPR(msgElem, Name); - msg.type = EXTENSIONNOTIFICATION; - return msg; -} - -ExtensionNotification::operator Event() const { - Event ev = ContextualizedRequest::operator Event(); - if (name.length() > 0) { - ev.setName("mmi.extensionnotification." + name); - } else { - ev.setName("mmi.extensionnotification"); - } - return ev; -} - -StatusResponse StatusResponse::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - StatusResponse msg(ContextualizedRequest::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - std::string status = STRING_ATTR_OR_EXPR(msgElem, Status); - - if (boost::iequals(status, "ALIVE")) { - msg.status = ALIVE; - } else if(boost::iequals(status, "DEAD")) { - msg.status = DEAD; - } else if(boost::iequals(status, "FAILURE")) { - msg.status = FAILURE; - } else if(boost::iequals(status, "SUCCESS")) { - msg.status = SUCCESS; - } - msg.type = STATUSRESPONSE; - return msg; -} - -StatusInfoResponse StatusInfoResponse::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - StatusInfoResponse msg(StatusResponse::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - Element statusInfoElem; - - node = msgElem.getFirstChild(); - while (node) { - if (node.getNodeType() == Node_base::ELEMENT_NODE) { - statusInfoElem = Element(node); - if (statusInfoElem && boost::iequals(statusInfoElem.getLocalName(), "statusInfo")) - break; - } - node = node.getNextSibling(); - } - - if (statusInfoElem && boost::iequals(statusInfoElem.getLocalName(), "statusInfo")) { - node = statusInfoElem.getFirstChild(); - while (node) { - if (node.getNodeType() == Node_base::TEXT_NODE) { - msg.statusInfo = node.getNodeValue(); - break; - } - node = node.getNextSibling(); - } - } - return msg; -} - - -StatusRequest StatusRequest::fromXML(Arabica::DOM::Node node, InterpreterImpl* interpreter) { - StatusRequest msg(ContextualizedRequest::fromXML(node, interpreter)); - FIND_EVENT_NODE(node); - - Element msgElem(node); - std::string autoUpdate = STRING_ATTR_OR_EXPR(msgElem, RequestAutomaticUpdate); - - if (boost::iequals(autoUpdate, "true")) { - msg.automaticUpdate = true; - } else if(boost::iequals(autoUpdate, "on")) { - msg.automaticUpdate = true; - } else if(boost::iequals(autoUpdate, "yes")) { - msg.automaticUpdate = true; - } else if(boost::iequals(autoUpdate, "1")) { - msg.automaticUpdate = true; - } else { - msg.automaticUpdate = false; - } - msg.type = STATUSREQUEST; - return msg; -} - - -} \ No newline at end of file diff --git a/src/uscxml/plugins/ioprocessor/modality/MMIMessages.h b/src/uscxml/plugins/ioprocessor/modality/MMIMessages.h deleted file mode 100644 index e4456f8..0000000 --- a/src/uscxml/plugins/ioprocessor/modality/MMIMessages.h +++ /dev/null @@ -1,499 +0,0 @@ -/** - * @file - * @author 2012-2013 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) - * @copyright Simplified BSD - * - * @cond - * This program is free software: you can redistribute it and/or modify - * it under the terms of the FreeBSD license as published by the FreeBSD - * project. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the FreeBSD license along with this - * program. If not, see . - * @endcond - */ - -#ifndef MMIEVENT_H_OS0SE7H5 -#define MMIEVENT_H_OS0SE7H5 - -#include -#include -#include - -namespace uscxml { - -class MMIEvent { -public: - enum Type { - NEWCONTEXTREQUEST, - NEWCONTEXTRESPONSE, - PREPAREREQUEST, - PREPARERESPONSE, - STARTREQUEST, - STARTRESPONSE, - DONENOTIFICATION, - CANCELREQUEST, - CANCELRESPONSE, - PAUSEREQUEST, - PAUSERESPONSE, - RESUMEREQUEST, - RESUMERESPONSE, - EXTENSIONNOTIFICATION, - CLEARCONTEXTREQUEST, - CLEARCONTEXTRESPONSE, - STATUSREQUEST, - STATUSRESPONSE, - INVALID - }; - - static Type getType(Arabica::DOM::Node node); - - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static MMIEvent fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - - // conversion operator - operator Event() const; - - std::string source; - std::string target; - std::string data; - std::string requestId; - std::string tagName; - Type type; - - static std::string nameSpace; - -protected: - MMIEvent() {} -}; - -class MMIEventReceiver { -public: - virtual void received(const MMIEvent& mmiEvent) = 0; -}; - -class MMIEventSender { -public: - virtual void send(const MMIEvent& mmiEvent) = 0; -}; - -class NewContextRequest : public MMIEvent { -public: - NewContextRequest() { - tagName = "NewContextRequest"; - type = NEWCONTEXTREQUEST; - } - NewContextRequest(const MMIEvent& father) : MMIEvent(father) {} - static NewContextRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - MMIEvent event = MMIEvent::fromXML(node, interpreter); - event.type = NEWCONTEXTREQUEST; - return event; - } - operator Event() const { - Event ev = MMIEvent::operator Event(); - ev.setName("mmi.newcontextrequest"); - ev.setDOM(toXML()); - return ev; - } - std::string token; ///< special token for server-less modality components -}; - -class ContextualizedRequest : public MMIEvent { -public: - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static ContextualizedRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - operator Event() const; - std::string context; -protected: - ContextualizedRequest() {} - ContextualizedRequest(const MMIEvent& father) : MMIEvent(father) {} -}; - -class PauseRequest : public ContextualizedRequest { -public: - PauseRequest() { - tagName = "PauseRequest"; - type = PAUSEREQUEST; - } - PauseRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} - static PauseRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - PauseRequest event = ContextualizedRequest::fromXML(node, interpreter); - event.type = PAUSEREQUEST; - return event; - } - operator Event() const { - Event ev = ContextualizedRequest::operator Event(); - ev.setName("mmi.pauserequest"); - ev.setDOM(toXML()); - return ev; - } - -}; -class ResumeRequest : public ContextualizedRequest { -public: - ResumeRequest() { - tagName = "ResumeRequest"; - type = RESUMEREQUEST; - } - ResumeRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} - static ResumeRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - ResumeRequest event = ContextualizedRequest::fromXML(node, interpreter); - event.type = RESUMEREQUEST; - return event; - } - operator Event() const { - Event ev = ContextualizedRequest::operator Event(); - ev.setDOM(toXML()); - ev.setName("mmi.resumerequest"); - return ev; - } - -}; -class CancelRequest : public ContextualizedRequest { -public: - CancelRequest() { - tagName = "CancelRequest"; - type = CANCELREQUEST; - } - CancelRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} - static CancelRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - CancelRequest event = ContextualizedRequest::fromXML(node, interpreter); - event.type = CANCELREQUEST; - return event; - } - operator Event() const { - Event ev = ContextualizedRequest::operator Event(); - ev.setName("mmi.cancelrequest"); - ev.setDOM(toXML()); - return ev; - } - -}; -class ClearContextRequest : public ContextualizedRequest { -public: - ClearContextRequest() { - tagName = "ClearContextRequest"; - type = CLEARCONTEXTREQUEST; - } - ClearContextRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} - static ClearContextRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - ClearContextRequest event = ContextualizedRequest::fromXML(node, interpreter); - event.type = CLEARCONTEXTREQUEST; - return event; - } - operator Event() const { - Event ev = ContextualizedRequest::operator Event(); - ev.setName("mmi.clearcontextrequest"); - ev.setDOM(toXML()); - return ev; - } - -}; -class StatusRequest : public ContextualizedRequest { -public: - StatusRequest() { - tagName = "StatusRequest"; - type = STARTREQUEST; - } - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static StatusRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - operator Event() const; - bool automaticUpdate; -protected: - StatusRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} -}; - -class ContentRequest : public ContextualizedRequest { -public: - struct ContentURL { - std::string href; - std::string maxAge; - std::string fetchTimeout; - }; - - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static ContentRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - operator Event() const; - std::string content; - ContentURL contentURL; -protected: - ContentRequest() {} - ContentRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} -}; - -class PrepareRequest : public ContentRequest { -public: - PrepareRequest() { - tagName = "PrepareRequest"; - type = PREPAREREQUEST; - } - PrepareRequest(const ContentRequest& father) : ContentRequest(father) {} - static PrepareRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - PrepareRequest event = ContentRequest::fromXML(node, interpreter); - event.type = PREPAREREQUEST; - return event; - } - operator Event() const { - Event ev = ContentRequest::operator Event(); - ev.setName("mmi.preparerequest"); - ev.setDOM(toXML()); - return ev; - } -}; - -class StartRequest : public ContentRequest { -public: - StartRequest() { - tagName = "StartRequest"; - type = STARTREQUEST; - } - StartRequest(const ContentRequest& father) : ContentRequest(father) {} - static StartRequest fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - StartRequest event = ContentRequest::fromXML(node, interpreter); - event.type = STARTREQUEST; - return event; - } - operator Event() const { - Event ev = ContentRequest::operator Event(); - ev.setName("mmi.startrequest"); - ev.setDOM(toXML()); - return ev; - } - -}; - -class ExtensionNotification : public ContextualizedRequest { -public: - ExtensionNotification() { - tagName = "ExtensionNotification"; - type = EXTENSIONNOTIFICATION; - } - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static ExtensionNotification fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - operator Event() const; - std::string name; -protected: - ExtensionNotification(const ContextualizedRequest& father) : ContextualizedRequest(father) {} - -}; - -class StatusResponse : public ContextualizedRequest { -public: - enum Status { - ALIVE = 0, - DEAD = 1, - SUCCESS = 2, - FAILURE = 3 - }; - - StatusResponse() { - tagName = "StatusResponse"; - type = STATUSRESPONSE; - } - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - static StatusResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - Status status; -protected: - StatusResponse(const ContextualizedRequest& father) : ContextualizedRequest(father) {} -}; - -class StatusInfoResponse : public StatusResponse { -public: - virtual Arabica::DOM::Document toXML(bool encapsulateInMMI = false) const; - StatusInfoResponse(const StatusResponse& father) : StatusResponse(father) {} - static StatusInfoResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL); - std::string statusInfo; -protected: - StatusInfoResponse() {} -}; - -class PrepareResponse : public StatusInfoResponse { -public: - PrepareResponse() { - tagName = "PrepareResponse"; - type = PREPARERESPONSE; - } - PrepareResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static PrepareResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - PrepareResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = PREPARERESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.prepareresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class StartResponse : public StatusInfoResponse { -public: - StartResponse() { - tagName = "StartResponse"; - type = STARTRESPONSE; - } - StartResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static StartResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - StartResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = STARTRESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.startresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class CancelResponse : public StatusInfoResponse { -public: - CancelResponse() { - tagName = "CancelResponse"; - type = CANCELRESPONSE; - } - CancelResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static CancelResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - CancelResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = CANCELRESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.cancelresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class PauseResponse : public StatusInfoResponse { -public: - PauseResponse() { - tagName = "PauseResponse"; - type = PAUSERESPONSE; - } - PauseResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static PauseResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - PauseResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = PAUSERESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.pauseresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class ResumeResponse : public StatusInfoResponse { -public: - ResumeResponse() { - tagName = "ResumeResponse"; - type = RESUMERESPONSE; - } - ResumeResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static ResumeResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - ResumeResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = RESUMERESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.resumeresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class ClearContextResponse : public StatusInfoResponse { -public: - ClearContextResponse() { - tagName = "ClearContextResponse"; - type = CLEARCONTEXTRESPONSE; - } - ClearContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static ClearContextResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - ClearContextResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = CLEARCONTEXTRESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.clearcontextresponse"); - ev.setDOM(toXML()); - return ev; - } -}; - -class NewContextResponse : public StatusInfoResponse { -public: - NewContextResponse() { - tagName = "NewContextResponse"; - type = NEWCONTEXTRESPONSE; - } - NewContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static NewContextResponse fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - NewContextResponse event = StatusInfoResponse::fromXML(node, interpreter); - event.type = NEWCONTEXTRESPONSE; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.newcontextresponse"); - ev.setDOM(toXML()); - return ev; - } - -}; - -class DoneNotification : public StatusInfoResponse { -public: - DoneNotification() { - tagName = "DoneNotification"; - type = DONENOTIFICATION; - } - DoneNotification(const StatusInfoResponse& father) : StatusInfoResponse(father) {} - static DoneNotification fromXML(Arabica::DOM::Node node, - InterpreterImpl* interpreter = NULL) { - DoneNotification event = StatusInfoResponse::fromXML(node, interpreter); - event.type = DONENOTIFICATION; - return event; - } - operator Event() const { - Event ev = StatusInfoResponse::operator Event(); - ev.setName("mmi.donenotification"); - ev.setDOM(toXML()); - return ev; - } -}; - -} - -#endif /* end of include guard: MMIEVENT_H_OS0SE7H5 */ diff --git a/src/uscxml/server/HTTPServer.cpp b/src/uscxml/server/HTTPServer.cpp index 9efdc07..a49bf4e 100644 --- a/src/uscxml/server/HTTPServer.cpp +++ b/src/uscxml/server/HTTPServer.cpp @@ -560,8 +560,10 @@ void HTTPServer::wsSendCallback(evutil_socket_t fd, short what, void *arg) { bool HTTPServer::registerServlet(const std::string& path, HTTPServlet* servlet) { HTTPServer* INSTANCE = getInstance(); - if (!INSTANCE->_httpHandle) + if (!INSTANCE->_httpHandle) { + LOG(ERROR) << "Registering a servlet at '" << path << "' with no HTTPServer running, did you forget to specify a port?"; return true; // this is the culprit! + } tthread::lock_guard lock(INSTANCE->_mutex); diff --git a/test/src/test-url.cpp b/test/src/test-url.cpp index 046cc8b..b3f9e28 100644 --- a/test/src/test-url.cpp +++ b/test/src/test-url.cpp @@ -48,6 +48,8 @@ int main(int argc, char** argv) { WSAStartup(MAKEWORD(2, 2), &wsaData); #endif + HTTPServer::getInstance(8099, 8100); + std::string exeName = argv[0]; exeName = exeName.substr(exeName.find_last_of("\\/") + 1); diff --git a/test/src/test-vxml-mmi-http.cpp b/test/src/test-vxml-mmi-http.cpp index 130441c..a2dd14f 100644 --- a/test/src/test-vxml-mmi-http.cpp +++ b/test/src/test-vxml-mmi-http.cpp @@ -1,5 +1,4 @@ #include "uscxml/config.h" -#include "uscxml/server/Socket.h" #include "uscxml/UUID.h" #include #include @@ -16,22 +15,20 @@ #include "uscxml/server/HTTPServer.h" #include "uscxml/URL.h" #include "uscxml/concurrency/tinythread.h" -#include "uscxml/plugins/ioprocessor/modality/MMIMessages.h" +#include "uscxml/messages/MMIMessages.h" #include #ifdef _WIN32 #include "XGetopt.h" #endif -#include "uscxml/plugins/ioprocessor/modality/MMIMessages.cpp" - #define ISSUE_REQUEST(name) {\ Arabica::DOM::Document name##XML = name.toXML(true);\ name##XML.getDocumentElement().setPrefix("mmi");\ std::stringstream name##XMLSS;\ name##XMLSS << name##XML;\ URL name##URL(target);\ - std::cout << name##XMLSS.str();\ + std::cout << "SEND:" << std::endl << name##XMLSS.str() << std::flush;\ name##URL.setOutContent(name##XMLSS.str());\ name##URL.addOutHeader("Content-type", "application/xml");\ name##URL.download(false);\ @@ -50,6 +47,7 @@ std::string context; class MMIServlet : public HTTPServlet { public: bool httpRecvRequest(const HTTPServer::Request& request) { + std::cout << "RCVD:" << std::endl << request << std::flush; tthread::lock_guard lock(Mutex); const Arabica::DOM::Document& doc = request.data.at("content").node.getOwnerDocument(); diff --git a/test/src/test-vxml-mmi-socket.cpp b/test/src/test-vxml-mmi-socket.cpp index 8246c3b..99662c9 100644 --- a/test/src/test-vxml-mmi-socket.cpp +++ b/test/src/test-vxml-mmi-socket.cpp @@ -12,10 +12,9 @@ #endif #include "uscxml/concurrency/tinythread.h" -#include "uscxml/plugins/ioprocessor/modality/MMIMessages.h" +#include "uscxml/messages/MMIMessages.h" #include -#include "uscxml/plugins/ioprocessor/modality/MMIMessages.cpp" using namespace uscxml; diff --git a/test/uscxml/test-jvoicexml.scxml b/test/uscxml/test-jvoicexml.scxml index 691a951..311f1c8 100644 --- a/test/uscxml/test-jvoicexml.scxml +++ b/test/uscxml/test-jvoicexml.scxml @@ -2,56 +2,50 @@ xmlns:vxml="http://www.w3.org/2001/vxml" datamodel="ecmascript"> - - - - - - + + + + + + + + + + + + + Hello World! + + + + + + Goodbye! + + + + + + + + - + - - - - - - - - Hello World! - - - - - - Goodbye! - - - - - - - - \ No newline at end of file -- cgit v0.12