diff options
Diffstat (limited to 'src/uscxml/plugins')
8 files changed, 209 insertions, 20 deletions
diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp index 9f04670..d8a3c8d 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp +++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp @@ -63,6 +63,8 @@ boost::shared_ptr<DataModelImpl> V8DataModel::create(Interpreter* interpreter) { dm->setName(interpreter->getName()); dm->setSessionId(interpreter->getSessionId()); dm->eval("_ioprocessors = {};"); + dm->eval("_invokers = {};"); + dm->eval("_x = {};"); return dm; } @@ -183,7 +185,7 @@ Data V8DataModel::getValueAsData(const v8::Handle<v8::Value>& value) { } else if(value->IsUint32()) { LOG(ERROR) << "IsUint32 is unimplemented" << std::endl; } else if(value->IsUndefined()) { - LOG(ERROR) << "IsUndefined is unimplemented" << std::endl; + data.atom = "undefined"; } return data; } @@ -269,6 +271,10 @@ std::string V8DataModel::evalAsString(const std::string& expr) { v8::HandleScope handleScope; v8::Context::Scope contextScope(_contexts.back()); v8::Handle<v8::Value> result = evalAsValue(expr); + if (result->IsObject()) { + Data data = getValueAsData(result); + return toStr(data); + } v8::String::AsciiValue data(result->ToString()); return std::string(*data); } diff --git a/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.cpp b/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.cpp new file mode 100644 index 0000000..eb3d810 --- /dev/null +++ b/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.cpp @@ -0,0 +1,48 @@ +#include "OSGConverter.h" +#include <glog/logging.h> + +#ifdef BUILD_AS_PLUGINS +#include <Pluma/Connector.hpp> +#endif + +namespace uscxml { + +#ifdef BUILD_AS_PLUGINS +PLUMA_CONNECTOR +bool connect(pluma::Host& host) { + host.add( new OSGConverterProvider() ); + return true; +} +#endif + +OSGConverter::OSGConverter() { +} + +OSGConverter::~OSGConverter() { +}; + +boost::shared_ptr<IOProcessorImpl> OSGConverter::create(Interpreter* interpreter) { + boost::shared_ptr<OSGConverter> invoker = boost::shared_ptr<OSGConverter>(new OSGConverter()); + invoker->_interpreter = interpreter; + return invoker; +} + +Data OSGConverter::getDataModelVariables() { + Data data; + return data; +} + +void OSGConverter::send(const SendRequest& req) { + std::cout << req << std::endl; + Event event; + event.name = "error"; + returnEvent(event); +} + +void OSGConverter::cancel(const std::string sendId) { +} + +void OSGConverter::invoke(const InvokeRequest& req) { +} + +}
\ No newline at end of file diff --git a/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.h b/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.h new file mode 100644 index 0000000..c52b1ee --- /dev/null +++ b/src/uscxml/plugins/invoker/graphics/openscenegraph/OSGConverter.h @@ -0,0 +1,42 @@ +#ifndef OSGCONVERTER_H_W09J90F0 +#define OSGCONVERTER_H_W09J90F0 + +#include <uscxml/Interpreter.h> + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + +namespace uscxml { + +class OSGConverter : public InvokerImpl { +public: + OSGConverter(); + virtual ~OSGConverter(); + virtual boost::shared_ptr<IOProcessorImpl> create(Interpreter* interpreter); + + virtual std::set<std::string> getNames() { + std::set<std::string> names; + names.insert("osgconverter"); + names.insert("osgconvert"); + names.insert("http://uscxml.tk.informatik.tu-darmstadt.de/#osgconverter"); + names.insert("http://uscxml.tk.informatik.tu-darmstadt.de/#osgconvert"); + return names; + } + + virtual Data getDataModelVariables(); + virtual void send(const SendRequest& req); + virtual void cancel(const std::string sendId); + virtual void invoke(const InvokeRequest& req); + +protected: +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(OSGConverter, Invoker); +#endif + +} + + +#endif /* end of include guard: OSGCONVERTER_H_W09J90F0 */ diff --git a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp index 1f08378..0272ca8 100644 --- a/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp +++ b/src/uscxml/plugins/invoker/heartbeat/HeartbeatInvoker.cpp @@ -19,6 +19,7 @@ HeartbeatInvoker::HeartbeatInvoker() { } HeartbeatInvoker::~HeartbeatInvoker() { + cancel(""); }; boost::shared_ptr<IOProcessorImpl> HeartbeatInvoker::create(Interpreter* interpreter) { diff --git a/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.cpp b/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.cpp new file mode 100644 index 0000000..e217eaa --- /dev/null +++ b/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.cpp @@ -0,0 +1,44 @@ +#include "Sqlite3Invoker.h" +#include <glog/logging.h> + +#ifdef BUILD_AS_PLUGINS +#include <Pluma/Connector.hpp> +#endif + +namespace uscxml { + +#ifdef BUILD_AS_PLUGINS +PLUMA_CONNECTOR +bool connect(pluma::Host& host) { + host.add( new Sqlite3InvokerProvider() ); + return true; +} +#endif + +Sqlite3Invoker::Sqlite3Invoker() { +} + +Sqlite3Invoker::~Sqlite3Invoker() { +}; + +boost::shared_ptr<IOProcessorImpl> Sqlite3Invoker::create(Interpreter* interpreter) { + boost::shared_ptr<Sqlite3Invoker> invoker = boost::shared_ptr<Sqlite3Invoker>(new Sqlite3Invoker()); + invoker->_interpreter = interpreter; + return invoker; +} + +Data Sqlite3Invoker::getDataModelVariables() { + Data data; + return data; +} + +void Sqlite3Invoker::send(const SendRequest& req) { +} + +void Sqlite3Invoker::cancel(const std::string sendId) { +} + +void Sqlite3Invoker::invoke(const InvokeRequest& req) { +} + +}
\ No newline at end of file diff --git a/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.h b/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.h new file mode 100644 index 0000000..f2ae915 --- /dev/null +++ b/src/uscxml/plugins/invoker/sqlite3/Sqlite3Invoker.h @@ -0,0 +1,40 @@ +#ifndef SQLITE3INVOKER_H_W09J90F0 +#define SQLITE3INVOKER_H_W09J90F0 + +#include <uscxml/Interpreter.h> + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + +namespace uscxml { + +class Sqlite3Invoker : public InvokerImpl { +public: + Sqlite3Invoker(); + virtual ~Sqlite3Invoker(); + virtual boost::shared_ptr<IOProcessorImpl> create(Interpreter* interpreter); + + virtual std::set<std::string> getNames() { + std::set<std::string> names; + names.insert("sqlite3"); + names.insert("http://uscxml.tk.informatik.tu-darmstadt.de/#sqlite3"); + return names; + } + + virtual Data getDataModelVariables(); + virtual void send(const SendRequest& req); + virtual void cancel(const std::string sendId); + virtual void invoke(const InvokeRequest& req); + +protected: +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(Sqlite3Invoker, Invoker); +#endif + +} + + +#endif /* end of include guard: SQLITE3INVOKER_H_W09J90F0 */ diff --git a/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.cpp b/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.cpp index 3ed39d6..98d08b3 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.cpp +++ b/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.cpp @@ -75,14 +75,15 @@ Data EventIOProcessor::getDataModelVariables() { void EventIOProcessor::send(const SendRequest& req) { - // I cant figure out how to copy the reference into the struct :( - _sendData[req.sendid].req = req; - _sendData[req.sendid].ioProcessor = this; + + _sendData[req.sendid] = new SendData(); + _sendData[req.sendid]->scxmlReq = req; + _sendData[req.sendid]->ioProcessor = this; int err = 0; char uriBuf[1024]; - struct evhttp_uri* targetURI = evhttp_uri_parse(_sendData[req.sendid].req.target.c_str()); + struct evhttp_uri* targetURI = evhttp_uri_parse(_sendData[req.sendid]->scxmlReq.target.c_str()); if (evhttp_uri_get_port(targetURI) < 0) evhttp_uri_set_port(targetURI, 80); const char* hostName = evhttp_uri_get_host(targetURI); @@ -108,11 +109,14 @@ void EventIOProcessor::send(const SendRequest& req) { ssLocalURI << evhttp_uri_get_path(targetURI) << evhttp_uri_get_fragment(targetURI); std::string localURI = ssLocalURI.str(); - if (_httpConnections.find(endPoint) == _httpConnections.end()) - _httpConnections[endPoint] = evhttp_connection_base_new(_asyncQueue._eventLoop, _dns, evhttp_uri_get_host(targetURI), evhttp_uri_get_port(targetURI)); + if (_httpConnections.find(endPoint) == _httpConnections.end()) { + struct evhttp_connection* conn = evhttp_connection_base_new(_asyncQueue._eventLoop, _dns, evhttp_uri_get_host(targetURI), evhttp_uri_get_port(targetURI)); + evhttp_connection_set_retries(conn, 3); + _httpConnections[endPoint] = conn; + } struct evhttp_connection* httpConn = _httpConnections[endPoint]; - struct evhttp_request* httpReq = evhttp_request_new(EventIOServer::httpSendReqDoneCallback, this); + struct evhttp_request* httpReq = evhttp_request_new(EventIOServer::httpSendReqDoneCallback, _sendData[req.sendid]); // event name if (req.name.size() > 0) { @@ -163,6 +167,15 @@ void EventIOProcessor::send(const SendRequest& req) { } } +void EventIOProcessor::httpSendReqDone(struct SendData* sendData) { + if (sendData->httpReq == NULL || evhttp_request_get_response_code(sendData->httpReq) != 200) { + Event failureEvent; + failureEvent.name = "error.communication"; + sendData->ioProcessor->returnEvent(failureEvent); + } + delete _sendData[sendData->scxmlReq.sendid]; +} + void EventIOProcessor::httpRecvReq(struct evhttp_request *req) { const char *cmdtype; @@ -246,12 +259,6 @@ void EventIOProcessor::httpRecvReq(struct evhttp_request *req) { evhttp_send_reply(req, 200, "OK", NULL); } -void EventIOProcessor::httpSendReqDone(struct evhttp_request *req) { - if (req) { - LOG(INFO) << "got return code " << evhttp_request_get_response_code(req) << std::endl; - } -} - EventIOServer::EventIOServer(unsigned short port) { _port = port; _base = event_base_new(); @@ -333,7 +340,6 @@ void EventIOServer::start() { void EventIOServer::run(void* instance) { EventIOServer* INSTANCE = (EventIOServer*)instance; - LOG(INFO) << "HTTP Server started" << std::endl; while(INSTANCE->_isRunning) { event_base_dispatch(INSTANCE->_base); } diff --git a/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.h b/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.h index 783332e..7dd1c41 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.h +++ b/src/uscxml/plugins/ioprocessor/basichttp/libevent/EventIOProcessor.h @@ -23,7 +23,8 @@ class EventIOProcessor : public IOProcessorImpl { public: struct SendData { EventIOProcessor* ioProcessor; - uscxml::SendRequest req; + uscxml::SendRequest scxmlReq; + evhttp_request* httpReq; }; EventIOProcessor(); @@ -48,11 +49,11 @@ public: static void run(void* instance); virtual std::string getPath() { return _interpreter->getName(); } - virtual void httpSendReqDone(struct evhttp_request *req); + virtual void httpSendReqDone(struct SendData* sendData); virtual void httpRecvReq(struct evhttp_request *req); protected: - std::map<std::string, SendData> _sendData; + std::map<std::string, SendData*> _sendData; std::string _url; @@ -82,9 +83,10 @@ private: void determineAddress(); static std::string syncResolve(const std::string& hostname); - static void httpSendReqDoneCallback(struct evhttp_request *req, void *cb_arg) { - ((EventIOProcessor*)cb_arg)->httpSendReqDone(req); + EventIOProcessor::SendData* sendData = (EventIOProcessor::SendData*)cb_arg; + sendData->httpReq = req; + sendData->ioProcessor->httpSendReqDone(sendData); } static void httpRecvReqCallback(struct evhttp_request *req, void *cb_arg) { ((EventIOProcessor*)cb_arg)->httpRecvReq(req); |