diff options
author | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-08-14 08:11:54 (GMT) |
---|---|---|
committer | Stefan Radomski <radomski@tk.informatik.tu-darmstadt.de> | 2014-08-14 08:11:54 (GMT) |
commit | 8684cefe080ab61d11d956d17ecfa417c2446dcc (patch) | |
tree | e8f53f52b8098d96d878d0a7f3b07b9b0ba094f3 /src/uscxml/plugins | |
parent | 66b0852b0618cc4bfff08d47aa0af56353226190 (diff) | |
download | uscxml-8684cefe080ab61d11d956d17ecfa417c2446dcc.zip uscxml-8684cefe080ab61d11d956d17ecfa417c2446dcc.tar.gz uscxml-8684cefe080ab61d11d956d17ecfa417c2446dcc.tar.bz2 |
JavaScriptCore in CMake module
Diffstat (limited to 'src/uscxml/plugins')
-rw-r--r-- | src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp | 160 | ||||
-rw-r--r-- | src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h | 18 |
2 files changed, 169 insertions, 9 deletions
diff --git a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp index 5a79094..7db9e66 100644 --- a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.cpp @@ -32,7 +32,8 @@ name##XML.getDocumentElement().setPrefix("mmi");\ std::stringstream name##XMLSS;\ name##XMLSS << name##XML;\ - URL name##URL(target);\ + URL name##URL(name.target);\ + std::cout << "SEND: " << name##XMLSS.str() << std::endl; \ name##URL.setOutContent(name##XMLSS.str());\ name##URL.addOutHeader("Content-type", "application/xml");\ name##URL.download(false);\ @@ -49,6 +50,7 @@ bool pluginConnect(pluma::Host& host) { #endif VoiceXMLInvoker::VoiceXMLInvoker() { + _thread = NULL; } VoiceXMLInvoker::~VoiceXMLInvoker() { @@ -61,6 +63,79 @@ boost::shared_ptr<InvokerImpl> VoiceXMLInvoker::create(InterpreterImpl* interpre } bool VoiceXMLInvoker::httpRecvRequest(const HTTPServer::Request& request) { + tthread::lock_guard<tthread::mutex> lock(_mutex); + + if (!request.data.hasKey("content") || !request.data.at("content").node) { + HTTPServer::Reply reply(request); + reply.status = 500; + HTTPServer::reply(reply); + } + + const Arabica::DOM::Node<std::string>& node = request.data.at("content").node; + std::cout << "RCVD: " << node << std::endl; + + switch(MMIEvent::getType(node)) { + case MMIEvent::NEWCONTEXTRESPONSE: { + NewContextResponse resp = NewContextResponse::fromXML(node); + if (_context.size() == 0) { + _compState = MMI_IDLE; + _context = resp.context; + + StartRequest startReq; + startReq.context = _context; + startReq.source = _url; + startReq.target = _target; + startReq.requestId = uscxml::UUID::getUUID(); + + if (_invokeReq.src.size() > 0) { + startReq.contentURL.href = _invokeReq.src; + } else if(_invokeReq.content.size()) { + startReq.content = _invokeReq.content; + } else if(_invokeReq.dom) { + std::stringstream contentSS; + startReq.contentDOM = _invokeReq.dom; + } + ISSUE_REQUEST(startReq); + + } else { + // already got a context! + } + break; + } + case MMIEvent::STARTRESPONSE: { + StartResponse resp = StartResponse::fromXML(node); + _compState = MMI_RUNNING; + break; + } + + case MMIEvent::DONENOTIFICATION: { + DoneNotification resp = DoneNotification::fromXML(node); + _compState = MMI_IDLE; + break; + } + + case MMIEvent::EXTENSIONNOTIFICATION: { + ExtensionNotification resp = ExtensionNotification::fromXML(node); + Event ev; + ev.name = "mmi.extensionnotification"; + if (resp.dataDOM) { + ev.dom = resp.dataDOM; + } else if(resp.data.size() > 0) { + ev.data = Data::fromJSON(resp.data); // try to parse as JSON + if (ev.data.empty()) { + ev.content = resp.data; + } + } + returnEvent(ev); + } + + default: + break; + } + + + HTTPServer::Reply reply(request); + HTTPServer::reply(reply); return true; } @@ -74,17 +149,25 @@ Data VoiceXMLInvoker::getDataModelVariables() { } void VoiceXMLInvoker::send(const SendRequest& req) { + _workQueue.push(req); } void VoiceXMLInvoker::invoke(const InvokeRequest& req) { + tthread::lock_guard<tthread::mutex> lock(_mutex); + HTTPServer::getInstance()->registerServlet(req.invokeid, this); - std::string target; - Event::getParam(req.params, "target", target); + Event::getParam(req.params, "target", _target); + if (_target.size() == 0) { + LOG(ERROR) << "No target parameter given!"; + return; + } + + _invokeReq = req; NewContextRequest newCtxReq; newCtxReq.source = _url; - newCtxReq.target = target; + newCtxReq.target = _target; newCtxReq.requestId = uscxml::UUID::getUUID(); ISSUE_REQUEST(newCtxReq); @@ -93,6 +176,30 @@ void VoiceXMLInvoker::invoke(const InvokeRequest& req) { } +void VoiceXMLInvoker::uninvoke() { + + ClearContextRequest clrCtxReq; + clrCtxReq.source = _url; + clrCtxReq.target = _target; + clrCtxReq.requestId = uscxml::UUID::getUUID(); + ISSUE_REQUEST(clrCtxReq); + + if (_isRunning) + _isRunning = false; + + SendRequest req; + _workQueue.push(req); + + if (_thread) { + _thread->join(); + delete _thread; + } + + HTTPServer::getInstance()->unregisterServlet(this); + _context = ""; + +} + void VoiceXMLInvoker::run(void* instance) { VoiceXMLInvoker* INSTANCE = (VoiceXMLInvoker*)instance; while(true) { @@ -105,12 +212,47 @@ void VoiceXMLInvoker::run(void* instance) { } } -void VoiceXMLInvoker::process(SendRequest& ctx) { +void VoiceXMLInvoker::process(SendRequest& req) { + tthread::lock_guard<tthread::mutex> lock(_mutex); + while(_context.size() == 0 && _isRunning) + _cond.wait_for(_mutex, 200); -} + if (_context.size() == 0) { + // we never acquired a context + return; + } -void VoiceXMLInvoker::uninvoke() { - HTTPServer::getInstance()->unregisterServlet(this); -} + // dispatch over send request + + // if we did nothing else, send as ExtensionNotification + ExtensionNotification extNotif; + extNotif.context = _context; + extNotif.source = _url; + extNotif.target = _target; + extNotif.requestId = uscxml::UUID::getUUID(); + extNotif.name = req.name; + + if (!req.namelist.empty()) { + for (Event::namelist_t::iterator iter = req.namelist.begin(); iter != req.namelist.end(); iter++) { + req.data.compound[iter->first] = iter->second; + } + } else if (!req.params.empty()) { + for(Event::params_t::iterator it = req.params.begin(), end = req.params.end(); it != end; it = req.params.upper_bound(it->first)) { + Event::getParam(req.params, it->first, req.data.compound[it->first]); + } + } + + if (req.dom) { + extNotif.dataDOM = req.dom; + } else if (req.content.size() > 0) { + extNotif.data = req.content; + } else if (!req.data.empty()) { + extNotif.data = Data::toJSON(req.data); + } + + ISSUE_REQUEST(extNotif); + +} + }
\ 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 b70a073..6f2a248 100644 --- a/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h +++ b/src/uscxml/plugins/invoker/vxml/VoiceXMLInvoker.h @@ -34,6 +34,12 @@ namespace uscxml { class VoiceXMLInvoker : public InvokerImpl, public HTTPServlet { public: + enum ComponentState { + MMI_IDLE, + MMI_PAUSED, + MMI_RUNNING + }; + VoiceXMLInvoker(); virtual ~VoiceXMLInvoker(); virtual boost::shared_ptr<InvokerImpl> create(InterpreterImpl* interpreter); @@ -46,6 +52,10 @@ public: return names; } + bool deleteOnUninvoke() { + return false; + } + bool httpRecvRequest(const HTTPServer::Request& request); void setURL(const std::string& url); @@ -59,8 +69,16 @@ public: protected: std::string _url; + std::string _context; + std::string _target; + + InvokeRequest _invokeReq; + + ComponentState _compState; tthread::thread* _thread; + tthread::condition_variable _cond; + tthread::mutex _mutex; concurrency::BlockingQueue<SendRequest> _workQueue; bool _isRunning; }; |