diff options
Diffstat (limited to 'src/uscxml/plugins')
24 files changed, 225 insertions, 243 deletions
diff --git a/src/uscxml/plugins/DataModel.cpp b/src/uscxml/plugins/DataModel.cpp index 96afd89..07fd4b4 100644 --- a/src/uscxml/plugins/DataModel.cpp +++ b/src/uscxml/plugins/DataModel.cpp @@ -57,12 +57,12 @@ void DataModel::setForeach(const std::string& item, return _impl->setForeach(item, array, index, iteration); } -void DataModel::assign(const std::string& location, const Data& data) { - return _impl->assign(location, data); +void DataModel::assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { + return _impl->assign(location, data, attr); } -void DataModel::init(const std::string& location, const Data& data) { - return _impl->init(location, data); +void DataModel::init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { + return _impl->init(location, data, attr); } bool DataModel::isDeclared(const std::string& expr) { @@ -73,10 +73,6 @@ size_t DataModel::replaceExpressions(std::string& content) { return _impl->replaceExpressions(content); } -std::string DataModel::andExpressions(std::list<std::string> expressions) { - return _impl->andExpressions(expressions); -} - void DataModel::addExtension(DataModelExtension* ext) { return _impl->addExtension(ext); } diff --git a/src/uscxml/plugins/DataModel.h b/src/uscxml/plugins/DataModel.h index 7716ad7..9185cc8 100644 --- a/src/uscxml/plugins/DataModel.h +++ b/src/uscxml/plugins/DataModel.h @@ -66,17 +66,19 @@ public: uint32_t iteration); /// @copydoc DataModelImpl::assign() - virtual void assign(const std::string& location, const Data& data); + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); /// @copydoc DataModelImpl::init() - virtual void init(const std::string& location, const Data& data); + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); /// @copydoc DataModelImpl::isDeclared() virtual bool isDeclared(const std::string& expr); /// @copydoc DataModelImpl::replaceExpressions() size_t replaceExpressions(std::string& content); - /// @copydoc DataModelImpl::andExpressions() - std::string andExpressions(std::list<std::string> expressions); /// @copydoc DataModelImpl::addExtension() virtual void addExtension(DataModelExtension* ext); diff --git a/src/uscxml/plugins/DataModelImpl.h b/src/uscxml/plugins/DataModelImpl.h index e93361d..b1fbd88 100644 --- a/src/uscxml/plugins/DataModelImpl.h +++ b/src/uscxml/plugins/DataModelImpl.h @@ -182,8 +182,11 @@ public: \endverbatim * @param location A variable or locatio to assign to. * @param data The Data object with the respective data. + * @param attr Additional attributes of the XML assign element. */ - virtual void assign(const std::string& location, const Data& data) = 0; + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()) = 0; /** * Initialize a variable / location in the data-model with a given data object. @@ -192,8 +195,11 @@ public: * * @param location A variable or locatio to assign to. * @param data The Data object with the respective data. + * @param attr Additional attributes of the XML data element. */ - virtual void init(const std::string& location, const Data& data) = 0; + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()) = 0; /** * Register an extension to get data into and out of the data-model. @@ -201,15 +207,6 @@ public: */ virtual void addExtension(DataModelExtension* ext); - /** - * Concat the given terms into a conjunctive form. - * @todo This is required to automatically transform a state-chart into a - * state-machine. Actual transformation is still only available in legacy though. - */ - virtual std::string andExpressions(std::list<std::string>) { - return ""; - } - protected: DataModelCallbacks* _callbacks; }; diff --git a/src/uscxml/plugins/EventHandler.h b/src/uscxml/plugins/EventHandler.h index 436f878..5122e9b 100644 --- a/src/uscxml/plugins/EventHandler.h +++ b/src/uscxml/plugins/EventHandler.h @@ -53,9 +53,6 @@ public: * @return An object to be represented at `_x['name']` */ virtual Data getDataModelVariables() = 0; - -protected: - InterpreterImpl* _interpreter; }; /** diff --git a/src/uscxml/plugins/Factory.cpp b/src/uscxml/plugins/Factory.cpp index 443cb59..60e7a3e 100644 --- a/src/uscxml/plugins/Factory.cpp +++ b/src/uscxml/plugins/Factory.cpp @@ -106,7 +106,6 @@ void Factory::registerPlugins() { } #endif - #ifdef WITH_DM_ECMA_V8 { V8DataModel* dataModel = new V8DataModel(); @@ -352,12 +351,12 @@ bool Factory::hasIOProcessor(const std::string& type) { return false; } -std::shared_ptr<IOProcessorImpl> Factory::createIOProcessor(const std::string& type, InterpreterImpl* interpreter) { +std::shared_ptr<IOProcessorImpl> Factory::createIOProcessor(const std::string& type, IOProcessorCallbacks* callbacks) { // do we have this type ourself? if (_ioProcessorAliases.find(type) != _ioProcessorAliases.end()) { std::string canonicalName = _ioProcessorAliases[type]; if (_ioProcessors.find(canonicalName) != _ioProcessors.end()) { - std::shared_ptr<IOProcessorImpl> ioProc = _ioProcessors[canonicalName]->create(interpreter); + std::shared_ptr<IOProcessorImpl> ioProc = _ioProcessors[canonicalName]->create(callbacks); // ioProc->setInterpreter(interpreter); return ioProc; } @@ -365,7 +364,7 @@ std::shared_ptr<IOProcessorImpl> Factory::createIOProcessor(const std::string& t // lookup in parent factory if (_parentFactory) { - return _parentFactory->createIOProcessor(type, interpreter); + return _parentFactory->createIOProcessor(type, callbacks); } else { ERROR_EXECUTION_THROW("No IOProcessor named '" + type + "' known"); } @@ -497,9 +496,9 @@ void IOProcessorImpl::eventToSCXML(Event& event, event.origintype = type; if (internal) { - _interpreter->enqueueInternal(event); + _callbacks->enqueueInternal(event); } else { - _interpreter->enqueueExternal(event); + _callbacks->enqueueExternal(event); } } @@ -517,9 +516,9 @@ void InvokerImpl::eventToSCXML(Event& event, event.origintype = type; if (internal) { - _interpreter->enqueueInternal(event); + _callbacks->enqueueInternal(event); } else { - _interpreter->enqueueExternal(event); + _callbacks->enqueueExternal(event); } } diff --git a/src/uscxml/plugins/Factory.h b/src/uscxml/plugins/Factory.h index f80b581..9653107 100644 --- a/src/uscxml/plugins/Factory.h +++ b/src/uscxml/plugins/Factory.h @@ -25,6 +25,7 @@ #include "uscxml/plugins/ExecutableContent.h" #include "uscxml/plugins/EventHandler.h" #include "uscxml/plugins/IOProcessor.h" +#include "uscxml/plugins/IOProcessorImpl.h" #include "uscxml/plugins/Invoker.h" #include "uscxml/plugins/DataModelImpl.h" @@ -53,7 +54,7 @@ public: void registerExecutableContent(ExecutableContentImpl* executableContent); std::shared_ptr<DataModelImpl> createDataModel(const std::string& type, DataModelCallbacks* callbacks); - std::shared_ptr<IOProcessorImpl> createIOProcessor(const std::string& type, InterpreterImpl* interpreter); + std::shared_ptr<IOProcessorImpl> createIOProcessor(const std::string& type, IOProcessorCallbacks* callbacks); std::shared_ptr<InvokerImpl> createInvoker(const std::string& type, InterpreterImpl* interpreter); std::shared_ptr<ExecutableContentImpl> createExecutableContent(const std::string& localName, const std::string& nameSpace, InterpreterImpl* interpreter); diff --git a/src/uscxml/plugins/IOProcessorImpl.h b/src/uscxml/plugins/IOProcessorImpl.h index bd28406..24d2631 100644 --- a/src/uscxml/plugins/IOProcessorImpl.h +++ b/src/uscxml/plugins/IOProcessorImpl.h @@ -23,13 +23,31 @@ #include "uscxml/Common.h" #include "uscxml/plugins/EventHandler.h" +#include "uscxml/interpreter/Logging.h" #include "uscxml/messages/Event.h" -#include "uscxml/interpreter/InterpreterImpl.h" namespace uscxml { /** * @ingroup ioproc + * @ingroup callback + * Callbacks available for every IO processor. + */ +class USCXML_API IOProcessorCallbacks { +public: + virtual ~IOProcessorCallbacks() {} ///< silence virtual destructor warning from swig + virtual const std::string& getName() = 0; + virtual const std::string& getSessionId() = 0; + virtual void enqueueInternal(const Event& event) = 0; + virtual void enqueueExternal(const Event& event) = 0; + virtual void enqueueAtInvoker(const std::string& invokeId, const Event& event) = 0; + virtual void enqueueAtParent(const Event& event) = 0; + virtual Logger getLogger() = 0; + +}; + +/** + * @ingroup ioproc * @ingroup abstract * Abstract base class for IOProcessor%s implementations. */ @@ -41,7 +59,7 @@ public: * @param interpreter The imlementation of the associated Interpreter * @todo We will eventually introduce callbacks and prevent complete access to the interpreter. */ - virtual std::shared_ptr<IOProcessorImpl> create(InterpreterImpl* interpreter) = 0; + virtual std::shared_ptr<IOProcessorImpl> create(IOProcessorCallbacks* callbacks) = 0; /** * We received an event from the SCXML Interpreter we are associated with. @@ -67,6 +85,7 @@ protected: */ void eventToSCXML(Event& event, const std::string& type, const std::string& origin, bool internal = false); + IOProcessorCallbacks* _callbacks; }; } diff --git a/src/uscxml/plugins/InvokerImpl.h b/src/uscxml/plugins/InvokerImpl.h index e0446e1..e5f7366 100644 --- a/src/uscxml/plugins/InvokerImpl.h +++ b/src/uscxml/plugins/InvokerImpl.h @@ -115,7 +115,7 @@ protected: XERCESC_NS::DOMElement* _finalize; std::string _invokeId; - + InterpreterImpl* _callbacks; }; } diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp index 22e8ccc..bcde9c9 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp +++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.cpp @@ -420,7 +420,12 @@ Data JSCDataModel::getAsData(const std::string& content) { (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) { d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM); } else { - d = Data(trimmed, Data::INTERPRETED); + // test558, test562 + ERROR_EXECUTION(e, "Given content cannot be interpreted as data"); + e.data.compound["literal"] = Data(trimmed, Data::VERBATIM); + throw e; + +// d = Data(trimmed, Data::INTERPRETED); } } return d; @@ -684,7 +689,7 @@ JSValueRef JSCDataModel::getNodeAsValue(const DOMNode* node) { // } } -void JSCDataModel::assign(const std::string& location, const Data& data) { +void JSCDataModel::assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { // flags on attribute are ignored? if (location.compare("_sessionid") == 0) // test 322 @@ -714,7 +719,7 @@ void JSCDataModel::assign(const std::string& location, const Data& data) { handleException(exception); } -void JSCDataModel::init(const std::string& location, const Data& data) { +void JSCDataModel::init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { try { if (data.empty()) { assign(location, Data("null", Data::INTERPRETED)); @@ -728,26 +733,6 @@ void JSCDataModel::init(const std::string& location, const Data& data) { } } -std::string JSCDataModel::andExpressions(std::list<std::string> expressions) { - if (expressions.size() == 0) - return ""; - - if (expressions.size() == 1) - return *(expressions.begin()); - - std::ostringstream exprSS; - exprSS << "("; - std::string conjunction = ""; - for (std::list<std::string>::const_iterator exprIter = expressions.begin(); - exprIter != expressions.end(); - exprIter++) { - exprSS << conjunction << "(" << *exprIter << ")"; - conjunction = " && "; - } - exprSS << ")"; - return exprSS.str(); -} - void JSCDataModel::handleException(JSValueRef exception) { JSStringRef exceptionStringRef = JSValueToStringCopy(_ctx, exception, NULL); size_t maxSize = JSStringGetMaximumUTF8CStringSize(exceptionStringRef); diff --git a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.h b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.h index c5129a4..3a53da2 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.h +++ b/src/uscxml/plugins/datamodel/ecmascript/JavaScriptCore/JSCDataModel.h @@ -80,10 +80,12 @@ public: virtual bool isDeclared(const std::string& expr); - virtual void assign(const std::string& location, const Data& data); - virtual void init(const std::string& location, const Data& data); - - virtual std::string andExpressions(std::list<std::string>); + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); protected: diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp index 283372d..61eb815 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp +++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.cpp @@ -408,7 +408,7 @@ void V8DataModel::setEvent(const Event& event) { } } if (!data.empty()) { -// std::cout << Data::toJSON(eventCopy.data); +// std::cout << Data::toJSON(data); eventObj->Set(v8::String::NewSymbol("data"), getDataAsValue(data)); // set data part of _event } else { // test 343 / test 488 @@ -436,7 +436,10 @@ Data V8DataModel::getAsData(const std::string& content) { (trimmed[0] == '\'' && trimmed[trimmed.length() - 1] == '\''))) { d = Data(trimmed.substr(1, trimmed.length() - 2), Data::VERBATIM); } else { - d = Data(trimmed, Data::INTERPRETED); + // test558, test562 + ERROR_EXECUTION(e, "Given content cannot be interpreted as data"); + e.data.compound["literal"] = Data(trimmed, Data::VERBATIM); + throw e; } } return d; @@ -631,12 +634,22 @@ void V8DataModel::jsIn(const v8::FunctionCallbackInfo<v8::Value>& info) { } bool V8DataModel::isValidSyntax(const std::string& expr) { + v8::Locker locker(_isolate); + v8::Isolate::Scope isoScope(_isolate); + v8::HandleScope scope(_isolate); + + v8::Local<v8::Context> ctx = v8::Local<v8::Context>::New(_isolate, _context); + v8::Context::Scope contextScope(ctx); // segfaults at newinstance without! + v8::TryCatch tryCatch; v8::Local<v8::String> source = v8::String::New(expr.c_str()); - v8::Local<v8::Script> script = v8::Script::Compile(source); + if (tryCatch.HasCaught() || source.IsEmpty()) { + return false; + } - if (script.IsEmpty() || tryCatch.HasCaught()) { + v8::Local<v8::Script> script = v8::Script::Compile(source); + if (tryCatch.HasCaught() || script.IsEmpty()) { return false; } @@ -726,7 +739,7 @@ bool V8DataModel::evalAsBool(const std::string& expr) { } -void V8DataModel::assign(const std::string& location, const Data& data) { +void V8DataModel::assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { v8::Locker locker(_isolate); v8::Isolate::Scope isoScope(_isolate); @@ -754,8 +767,7 @@ void V8DataModel::assign(const std::string& location, const Data& data) { } } -void V8DataModel::init(const std::string& location, - const Data& data) { +void V8DataModel::init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { v8::Locker locker(_isolate); v8::Isolate::Scope isoScope(_isolate); v8::HandleScope scope(_isolate); @@ -774,26 +786,6 @@ void V8DataModel::init(const std::string& location, } } -std::string V8DataModel::andExpressions(std::list<std::string> expressions) { - if (expressions.size() == 0) - return ""; - - if (expressions.size() == 1) - return *(expressions.begin()); - - std::ostringstream exprSS; - exprSS << "("; - std::string conjunction = ""; - for (std::list<std::string>::const_iterator exprIter = expressions.begin(); - exprIter != expressions.end(); - exprIter++) { - exprSS << conjunction << "(" << *exprIter << ")"; - conjunction = " && "; - } - exprSS << ")"; - return exprSS.str(); -} - v8::Local<v8::Value> V8DataModel::evalAsValue(const std::string& expr, bool dontThrow) { // v8::Locker locker(_isolate); diff --git a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.h b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.h index 3b4d776..a9dbca1 100644 --- a/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.h +++ b/src/uscxml/plugins/datamodel/ecmascript/v8/V8DataModel.h @@ -73,10 +73,12 @@ public: virtual bool isDeclared(const std::string& expr); - virtual void assign(const std::string& location, const Data& data); - virtual void init(const std::string& location, const Data& data); - - virtual std::string andExpressions(std::list<std::string>); + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); protected: diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp index 2ad89b5..ad35f80 100644 --- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp +++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp @@ -349,9 +349,12 @@ Data LuaDataModel::evalAsData(const std::string& content) { throw originalError; // we will assume syntax error and throw } - if (retVals == 0) +#if 1 + // Note: Empty result is not an error test302, but how to do test488? + if (retVals == 0 && !isValidSyntax(trimmedExpr)) { throw originalError; // we will assume syntax error and throw - + } +#endif try { if (retVals == 1) { @@ -446,7 +449,7 @@ bool LuaDataModel::isDeclared(const std::string& expr) { } -void LuaDataModel::assign(const std::string& location, const Data& data) { +void LuaDataModel::assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { if (location.length() == 0) { ERROR_EXECUTION_THROW("Assign element has neither id nor location"); } @@ -539,7 +542,7 @@ void LuaDataModel::assign(const std::string& location, const Data& data) { } } -void LuaDataModel::init(const std::string& location, const Data& data) { +void LuaDataModel::init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { luabridge::setGlobal(_luaState, luabridge::Nil(), location.c_str()); assign(location, data); } @@ -582,17 +585,4 @@ Data LuaDataModel::getAsData(const std::string& content) { return data; } - -std::string LuaDataModel::andExpressions(std::list<std::string> exprs) { - std::stringstream exprSS; - std::list<std::string>::const_iterator listIter; - std::string andExpr; - for (listIter = exprs.begin(); listIter != exprs.end(); listIter++) { - exprSS << andExpr << *listIter; - andExpr = " && "; - } - return exprSS.str(); -} - - } diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.h b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h index 7b7121f..85d7b53 100644 --- a/src/uscxml/plugins/datamodel/lua/LuaDataModel.h +++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h @@ -77,10 +77,12 @@ public: virtual bool isDeclared(const std::string& expr); - virtual void assign(const std::string& location, const Data& data); - virtual void init(const std::string& location, const Data& data); - - virtual std::string andExpressions(std::list<std::string>); + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); protected: diff --git a/src/uscxml/plugins/datamodel/null/NULLDataModel.h b/src/uscxml/plugins/datamodel/null/NULLDataModel.h index 4bea664..fba8577 100644 --- a/src/uscxml/plugins/datamodel/null/NULLDataModel.h +++ b/src/uscxml/plugins/datamodel/null/NULLDataModel.h @@ -90,24 +90,14 @@ public: return true; } - virtual void assign(const XERCESC_NS::DOMElement* assignElem, - const XERCESC_NS::DOMNode* node, - const std::string& content) {} - virtual void assign(const std::string& location, const Data& data) {} - - virtual void init(const XERCESC_NS::DOMElement* dataElem, - const XERCESC_NS::DOMNode* node, - const std::string& content) {} - virtual void init(const std::string& location, const Data& data) {} + virtual void assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) {} + virtual void init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) {} virtual void setCallbacks(DataModelCallbacks* callbacks) { _callbacks = callbacks; } virtual void addExtension(DataModelExtension* ext) {} - virtual std::string andExpressions(std::list<std::string>) { - return ""; - } protected: diff --git a/src/uscxml/plugins/datamodel/promela/PromelaDataModel.cpp b/src/uscxml/plugins/datamodel/promela/PromelaDataModel.cpp index a524c7e..14d24c3 100644 --- a/src/uscxml/plugins/datamodel/promela/PromelaDataModel.cpp +++ b/src/uscxml/plugins/datamodel/promela/PromelaDataModel.cpp @@ -146,7 +146,7 @@ void PromelaDataModel::setEvent(const Event& event) { start != end; start = event.params.upper_bound(start->first)) { // only set first param key if (isNumeric(start->second.atom.c_str(), 10)) { - variable.compound["value"].compound["data"].compound[start->first] = strTo<int>(start->second.atom); + variable.compound["value"].compound["data"].compound[start->first] = Data(strTo<int>(start->second.atom)); } else { variable.compound["value"].compound["data"].compound[start->first] = start->second; } @@ -154,7 +154,7 @@ void PromelaDataModel::setEvent(const Event& event) { for (Event::namelist_t::const_iterator iter = event.namelist.begin(); iter != event.namelist.end(); iter++) { if (isNumeric(iter->second.atom.c_str(), 10)) { - variable.compound["value"].compound["data"].compound[iter->first] = strTo<int>(iter->second.atom); + variable.compound["value"].compound["data"].compound[iter->first] = Data(strTo<int>(iter->second.atom)); } else { variable.compound["value"].compound["data"].compound[iter->first] = iter->second; } @@ -225,11 +225,25 @@ void PromelaDataModel::setEvent(const Event& event) { PromelaParser arrayParser(ss.str(), 1, PromelaParser::PROMELA_EXPR); - setVariable(itemParser.ast, getVariable(arrayParser.ast)); + try { + setVariable(itemParser.ast, getVariable(arrayParser.ast)); + } catch (ErrorEvent e) { + // test150 + PromelaParser itemDeclParser("int " + item); // this is likely the wrong type + evaluateDecl(itemDeclParser.ast); + setVariable(itemParser.ast, getVariable(arrayParser.ast)); + } if (index.length() > 0) { PromelaParser indexParser(index, 1, PromelaParser::PROMELA_EXPR); - setVariable(indexParser.ast, iteration); + try { + setVariable(indexParser.ast, Data(iteration)); + } catch (ErrorEvent e) { + // test150 + PromelaParser indexDeclParser("int " + index); + evaluateDecl(indexDeclParser.ast); + setVariable(indexParser.ast, Data(iteration)); + } } } @@ -322,7 +336,7 @@ void PromelaDataModel::setEvent(const Event& event) { PromelaParserNode* name = *opIterAsgn++; int size = dataToInt(evaluateExpr(*opIterAsgn++)); - variable.compound["size"] = size; + variable.compound["size"] = Data(size); for (size_t i = 0; i < size; i++) { variable.compound["value"].array.push_back(Data(0, Data::INTERPRETED)); } @@ -385,7 +399,7 @@ void PromelaDataModel::setEvent(const Event& event) { return Data(false); if (iequals(node->value, "true")) return Data(true); - return strTo<int>(node->value); + return Data(strTo<int>(node->value)); case PML_NAME: case PML_VAR_ARRAY: case PML_CMPND: @@ -396,13 +410,13 @@ void PromelaDataModel::setEvent(const Event& event) { // return Data(node->value, Data::INTERPRETED); } case PML_PLUS: - return dataToInt(evaluateExpr(*opIter++)) + dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) + dataToInt(evaluateExpr(*opIter++))); case PML_MINUS: - return dataToInt(evaluateExpr(*opIter++)) - dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) - dataToInt(evaluateExpr(*opIter++))); case PML_DIVIDE: - return dataToInt(evaluateExpr(*opIter++)) / dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) / dataToInt(evaluateExpr(*opIter++))); case PML_MODULO: - return dataToInt(evaluateExpr(*opIter++)) % dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) % dataToInt(evaluateExpr(*opIter++))); case PML_EQ: { PromelaParserNode* lhs = *opIter++; PromelaParserNode* rhs = *opIter++; @@ -418,24 +432,24 @@ void PromelaDataModel::setEvent(const Event& event) { || (left.type == Data::VERBATIM && right.type == Data::VERBATIM)) { return (left.atom.compare(right.atom) == 0 ? Data(true) : Data(false)); } - return dataToInt(left) == dataToInt(right); + return Data(dataToInt(left) == dataToInt(right)); } case PML_NEG: - return !dataToBool(evaluateExpr(*opIter++)); + return Data(!dataToBool(evaluateExpr(*opIter++))); case PML_LT: - return dataToInt(evaluateExpr(*opIter++)) < dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) < dataToInt(evaluateExpr(*opIter++))); case PML_LE: - return dataToInt(evaluateExpr(*opIter++)) <= dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) <= dataToInt(evaluateExpr(*opIter++))); case PML_GT: - return dataToInt(evaluateExpr(*opIter++)) > dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) > dataToInt(evaluateExpr(*opIter++))); case PML_GE: - return dataToInt(evaluateExpr(*opIter++)) >= dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) >= dataToInt(evaluateExpr(*opIter++))); case PML_TIMES: - return dataToInt(evaluateExpr(*opIter++)) * dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) * dataToInt(evaluateExpr(*opIter++))); case PML_LSHIFT: - return dataToInt(evaluateExpr(*opIter++)) << dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) << dataToInt(evaluateExpr(*opIter++))); case PML_RSHIFT: - return dataToInt(evaluateExpr(*opIter++)) >> dataToInt(evaluateExpr(*opIter++)); + return Data(dataToInt(evaluateExpr(*opIter++)) >> dataToInt(evaluateExpr(*opIter++))); case PML_AND: case PML_OR: { PromelaParserNode* lhs = *opIter++; @@ -452,15 +466,15 @@ void PromelaDataModel::setEvent(const Event& event) { bool truthRight = dataToBool(right); if (node->type == PML_AND) { - return truthLeft && truthRight; + return Data(truthLeft && truthRight); } else { - return truthLeft || truthRight; + return Data(truthLeft || truthRight); } } default: ERROR_EXECUTION_THROW("Support for " + PromelaParserNode::typeToDesc(node->type) + " expressions not implemented"); } - return 0; + return Data(0, Data::INTERPRETED); } void PromelaDataModel::evaluateStmnt(void* ast) { @@ -481,12 +495,12 @@ void PromelaDataModel::setEvent(const Event& event) { } case PML_INCR: { PromelaParserNode* name = *opIter++; - setVariable(name, strTo<long>(getVariable(name)) + 1); + setVariable(name, Data(strTo<long>(getVariable(name)) + 1)); break; } case PML_DECR: { PromelaParserNode* name = *opIter++; - setVariable(name, strTo<long>(getVariable(name)) - 1); + setVariable(name, Data(strTo<long>(getVariable(name)) - 1)); break; } default: @@ -503,11 +517,6 @@ void PromelaDataModel::setEvent(const Event& event) { ERROR_EXECUTION_THROW("Cannot assign to " + node->value); } -// if (_variables.compound.find(name->value) == _variables.compound.end()) { -// // declare implicitly / convenience -// evaluateDecl(ast); -// } - switch (node->type) { case PML_VAR_ARRAY: { std::list<PromelaParserNode*>::iterator opIter = node->operands.begin(); @@ -515,6 +524,10 @@ void PromelaDataModel::setEvent(const Event& event) { PromelaParserNode* name = *opIter++; PromelaParserNode* expr = *opIter++; + if (!_variables.hasKey(name->value)) { + ERROR_EXECUTION_THROW("Variable " + name->value + " is undeclared"); + } + // is the location an array? if (!_variables[name->value].hasKey("size")) { ERROR_EXECUTION_THROW("Variable " + name->value + " is no array"); @@ -532,6 +545,10 @@ void PromelaDataModel::setEvent(const Event& event) { } case PML_NAME: { // location is an array, but no array was passed + if (!_variables.hasKey(node->value)) { + ERROR_EXECUTION_THROW("Variable " + node->value + " is undeclared"); + } + if (_variables[node->value].hasKey("size")) { if (value.compound.size() > 0 || value.atom.size() > 0) ERROR_EXECUTION_THROW("Variable " + node->value + " is an array"); @@ -547,6 +564,10 @@ void PromelaDataModel::setEvent(const Event& event) { std::list<PromelaParserNode*>::iterator opIter = node->operands.begin(); PromelaParserNode* name = *opIter++; + if (!_variables.hasKey(name->value)) { + ERROR_EXECUTION_THROW("Variable " + name->value + " is undeclared"); + } + // location is no array if (_variables[name->value].hasKey("size")) { ERROR_EXECUTION_THROW("Variable " + name->value + " is an array"); @@ -657,38 +678,43 @@ void PromelaDataModel::setEvent(const Event& event) { default: ERROR_EXECUTION_THROW("Retrieving value of " + PromelaParserNode::typeToDesc(node->type) + " variable not implemented"); } - return 0; + return Data(0, Data::INTERPRETED); } - std::string PromelaDataModel::andExpressions(std::list<std::string> expressions) { + void PromelaDataModel::assign(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { + PromelaParser parser(location); + if (data.atom.size() > 0 && data.type == Data::INTERPRETED) { + setVariable(parser.ast, evalAsData(data.atom)); + } else { + setVariable(parser.ast, data); + } + } - if (expressions.size() == 0) - return ""; + void PromelaDataModel::init(const std::string& location, const Data& data, const std::map<std::string, std::string>& attr) { + { + std::string type = (attr.find("type") != attr.end() ? attr.at("type") : "auto"); + std::string arrSize; - if (expressions.size() == 1) - return *(expressions.begin()); + size_t bracketPos = type.find("["); + if (bracketPos != std::string::npos) { + arrSize = type.substr(bracketPos, type.length() - bracketPos); + type = type.substr(0, bracketPos); + } - std::ostringstream exprSS; - exprSS << "("; - std::string conjunction = ""; - for (std::list<std::string>::const_iterator exprIter = expressions.begin(); - exprIter != expressions.end(); - exprIter++) { - exprSS << conjunction << "(" << *exprIter << ")"; - conjunction = " && "; + std::string expr = type + " " + location + arrSize; + PromelaParser parser(expr, 1, PromelaParser::PROMELA_DECL); + evaluateDecl(parser.ast); } - exprSS << ")"; - return exprSS.str(); - } - void PromelaDataModel::assign(const std::string& location, const Data& data) { - // used for e.g. to assign command line parameters and idlocation PromelaParser parser(location); - setVariable(parser.ast, data); - } - - void PromelaDataModel::init(const std::string& location, const Data& data) { - assign(location, data); + if (data.atom.size() > 0 && data.type == Data::INTERPRETED) { + Data d = Data::fromJSON(data); + if (!d.empty()) + setVariable(parser.ast, Data::fromJSON(data)); + setVariable(parser.ast, data); + } else { + setVariable(parser.ast, data); + } } bool PromelaDataModel::isDeclared(const std::string& expr) { diff --git a/src/uscxml/plugins/datamodel/promela/PromelaDataModel.h b/src/uscxml/plugins/datamodel/promela/PromelaDataModel.h index 2c1f58d..4a763ac 100644 --- a/src/uscxml/plugins/datamodel/promela/PromelaDataModel.h +++ b/src/uscxml/plugins/datamodel/promela/PromelaDataModel.h @@ -60,10 +60,12 @@ public: virtual bool isDeclared(const std::string& expr); - virtual void assign(const std::string& location, const Data& data); - virtual void init(const std::string& location, const Data& data); - - virtual std::string andExpressions(std::list<std::string>); + virtual void assign(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); + virtual void init(const std::string& location, + const Data& data, + const std::map<std::string, std::string>& attr = std::map<std::string, std::string>()); protected: diff --git a/src/uscxml/plugins/datamodel/promela/PromelaParser.h b/src/uscxml/plugins/datamodel/promela/PromelaParser.h index 51a2111..236233d 100644 --- a/src/uscxml/plugins/datamodel/promela/PromelaParser.h +++ b/src/uscxml/plugins/datamodel/promela/PromelaParser.h @@ -83,7 +83,7 @@ public: PromelaParserNode* ast; Type type; - Event pendingException; + ErrorEvent pendingException; operator bool() const { return ast != NULL; } diff --git a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp index d6d0f99..b5d7e8b 100644 --- a/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp +++ b/src/uscxml/plugins/invoker/dirmon/DirMonInvoker.cpp @@ -65,7 +65,7 @@ DirMonInvoker::~DirMonInvoker() { std::shared_ptr<InvokerImpl> DirMonInvoker::create(InterpreterImpl* interpreter) { std::shared_ptr<DirMonInvoker> invoker(new DirMonInvoker()); - invoker->_interpreter = interpreter; + invoker->_callbacks = interpreter; return invoker; } @@ -99,7 +99,7 @@ void DirMonInvoker::eventFromSCXML(const Event& event) { void DirMonInvoker::invoke(const std::string& source, const Event& req) { if (req.params.find("dir") == req.params.end()) { - LOG(_interpreter->getLogger(), USCXML_ERROR) << "No dir param given"; + LOG(_callbacks->getLogger(), USCXML_ERROR) << "No dir param given"; return; } @@ -134,10 +134,10 @@ void DirMonInvoker::invoke(const std::string& source, const Event& req) { std::multimap<std::string, Data>::const_iterator dirIter = req.params.find("dir"); while(dirIter != req.params.upper_bound("dir")) { // this is simplified - Data might be more elaborate than a simple string atom - URL url = URL::resolve(dirIter->second.atom, _interpreter->getBaseURL()); + URL url = URL::resolve(dirIter->second.atom, _callbacks->getBaseURL()); if (!url.isAbsolute()) { - LOG(_interpreter->getLogger(), USCXML_ERROR) << "Given directory '" << dirIter->second << "' cannot be transformed to absolute path"; + LOG(_callbacks->getLogger(), USCXML_ERROR) << "Given directory '" << dirIter->second << "' cannot be transformed to absolute path"; } else { _dir = url.path(); } @@ -145,7 +145,7 @@ void DirMonInvoker::invoke(const std::string& source, const Event& req) { } _watcher = new DirectoryWatch(_dir, _recurse); - _watcher->setLogger(_interpreter->getLogger()); + _watcher->setLogger(_callbacks->getLogger()); _watcher->addMonitor(this); _watcher->updateEntries(true); diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp index 0f7cc24..9ac8621 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp @@ -134,7 +134,7 @@ void USCXMLInvoker::run(void* instance) { e.eventType = Event::PLATFORM; e.invokeid = INSTANCE->_invokedInterpreter.getImpl()->getInvokeId(); e.name = "done.invoke." + e.invokeid; - INSTANCE->_interpreter->enqueueExternal(e); + INSTANCE->_callbacks->enqueueExternal(e); } INSTANCE->_isActive = false; @@ -142,7 +142,7 @@ void USCXMLInvoker::run(void* instance) { std::shared_ptr<InvokerImpl> USCXMLInvoker::create(InterpreterImpl* interpreter) { std::shared_ptr<USCXMLInvoker> invoker(new USCXMLInvoker()); - invoker->_interpreter = interpreter; + invoker->_callbacks = interpreter; return invoker; } @@ -163,10 +163,10 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent) document->appendChild(newNode); // TODO: where do we get the namespace from? - _invokedInterpreter = Interpreter::fromDocument(document, _interpreter->getBaseURL(), false); + _invokedInterpreter = Interpreter::fromDocument(document, _callbacks->getBaseURL(), false); } else if (invokeEvent.data.atom.size() > 0) { // test530 when deserializing - _invokedInterpreter = Interpreter::fromXML(invokeEvent.data.atom, _interpreter->getBaseURL()); + _invokedInterpreter = Interpreter::fromXML(invokeEvent.data.atom, _callbacks->getBaseURL()); } else { _isActive = false; @@ -181,17 +181,17 @@ void USCXMLInvoker::invoke(const std::string& source, const Event& invokeEvent) // create new instances from the parent's ActionLanguage #if 1 InterpreterImpl* invoked = _invokedInterpreter.getImpl().get(); - invoked->_execContent = _interpreter->_execContent.getImpl()->create(invoked); - invoked->_delayQueue = _interpreter->_delayQueue.getImplDelayed()->create(invoked); - invoked->_internalQueue = _interpreter->_internalQueue.getImplBase()->create(); - invoked->_externalQueue = _interpreter->_externalQueue.getImplBase()->create(); - invoked->_microStepper = _interpreter->_microStepper.getImpl()->create(invoked); + invoked->_execContent = _callbacks->_execContent.getImpl()->create(invoked); + invoked->_delayQueue = _callbacks->_delayQueue.getImplDelayed()->create(invoked); + invoked->_internalQueue = _callbacks->_internalQueue.getImplBase()->create(); + invoked->_externalQueue = _callbacks->_externalQueue.getImplBase()->create(); + invoked->_microStepper = _callbacks->_microStepper.getImpl()->create(invoked); // TODO: setup invokers dom, check datamodel attribute and create new instance from parent if matching? #endif // copy monitors - std::set<InterpreterMonitor*>::const_iterator monIter = _interpreter->_monitors.begin(); - while(monIter != _interpreter->_monitors.end()) { + std::set<InterpreterMonitor*>::const_iterator monIter = _callbacks->_monitors.begin(); + while(monIter != _callbacks->_monitors.end()) { if ((*monIter)->copyToInvokers()) { _invokedInterpreter.getImpl()->_monitors.insert(*monIter); } diff --git a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp index d6993dc..cc0c9d4 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp +++ b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.cpp @@ -72,16 +72,16 @@ BasicHTTPIOProcessor::~BasicHTTPIOProcessor() { } -std::shared_ptr<IOProcessorImpl> BasicHTTPIOProcessor::create(InterpreterImpl* interpreter) { +std::shared_ptr<IOProcessorImpl> BasicHTTPIOProcessor::create(IOProcessorCallbacks* callbacks) { std::shared_ptr<BasicHTTPIOProcessor> io(new BasicHTTPIOProcessor()); - io->_interpreter = interpreter; + io->_callbacks = callbacks; // register at http server - std::string path = interpreter->getName(); + std::string path = callbacks->getName(); int i = 2; while (!HTTPServer::registerServlet(path + "/basichttp", io.get())) { std::stringstream ss; - ss << interpreter->getName() << i++; + ss << callbacks->getName() << i++; path = ss.str(); } @@ -184,7 +184,7 @@ void BasicHTTPIOProcessor::eventFromSCXML(const std::string& target, const Event // TODO: is this still needed with isValidTarget()? if (target.length() == 0) { - _interpreter->enqueueInternal(Event("error.communication", Event::PLATFORM)); + _callbacks->enqueueInternal(Event("error.communication", Event::PLATFORM)); return; } diff --git a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h index b70ce8e..dec22fe 100644 --- a/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h +++ b/src/uscxml/plugins/ioprocessor/basichttp/BasicHTTPIOProcessor.h @@ -59,7 +59,7 @@ class USCXML_PLUGIN_API BasicHTTPIOProcessor : public IOProcessorImpl, public HT public: BasicHTTPIOProcessor(); virtual ~BasicHTTPIOProcessor(); - virtual std::shared_ptr<IOProcessorImpl> create(uscxml::InterpreterImpl* interpreter); + virtual std::shared_ptr<IOProcessorImpl> create(uscxml::IOProcessorCallbacks* callbacks); virtual std::list<std::string> getNames() { std::list<std::string> names; @@ -102,4 +102,4 @@ PLUMA_INHERIT_PROVIDER(BasicHTTPIOProcessor, IOProcessorImpl); } -#endif /* end of include guard: BASICHTTPIOPROCESSOR_H_2CUY93KU */
\ No newline at end of file +#endif /* end of include guard: BASICHTTPIOPROCESSOR_H_2CUY93KU */ diff --git a/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.cpp b/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.cpp index c53915b..5a82860 100644 --- a/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.cpp +++ b/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.cpp @@ -41,16 +41,16 @@ SCXMLIOProcessor::~SCXMLIOProcessor() { } -std::shared_ptr<IOProcessorImpl> SCXMLIOProcessor::create(InterpreterImpl* interpreter) { +std::shared_ptr<IOProcessorImpl> SCXMLIOProcessor::create(IOProcessorCallbacks* callbacks) { std::shared_ptr<SCXMLIOProcessor> io(new SCXMLIOProcessor()); - io->_interpreter = interpreter; + io->_callbacks = callbacks; return io; } Data SCXMLIOProcessor::getDataModelVariables() { Data data; - data.compound["location"] = Data("#_scxml_" + _interpreter->getSessionId(), Data::VERBATIM); + data.compound["location"] = Data("#_scxml_" + _callbacks->getSessionId(), Data::VERBATIM); return data; } @@ -71,7 +71,7 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev eventCopy.origintype = "http://www.w3.org/TR/scxml/#SCXMLEventProcessor"; // test 336 - eventCopy.origin = "#_scxml_" + _interpreter->getSessionId(); + eventCopy.origin = "#_scxml_" + _callbacks->getSessionId(); if (false) { } else if(target.length() == 0) { @@ -85,14 +85,14 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev // reqCopy.sendid = ""; // test 198 - _interpreter->enqueueExternal(eventCopy); + _callbacks->enqueueExternal(eventCopy); } else if (iequals(target, "#_internal")) { /** * #_internal: If the target is the special term '#_internal', the Processor * must add the event to the internal event queue of the sending session. */ - _interpreter->enqueueInternal(eventCopy); + _callbacks->enqueueInternal(eventCopy); } else if (iequals(target, "#_parent")) { /** @@ -100,13 +100,7 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev * add the event to the external event queue of the SCXML session that invoked * the sending session, if there is one. */ - - if (_interpreter->_parentQueue) { - _interpreter->_parentQueue.enqueue(eventCopy); - } else { - ERROR_COMMUNICATION_THROW("Sending to parent invoker, but none is set"); - } - + _callbacks->enqueueAtParent(eventCopy); } else if (target.length() > 8 && iequals(target.substr(0, 8), "#_scxml_")) { /** * #_scxml_sessionid: If the target is the special term '#_scxml_sessionid', @@ -117,7 +111,7 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev */ std::string sessionId = target.substr(8); - std::lock_guard<std::recursive_mutex> lock(_interpreter->_instanceMutex); + std::lock_guard<std::recursive_mutex> lock(InterpreterImpl::_instanceMutex); std::map<std::string, std::weak_ptr<InterpreterImpl> > instances = InterpreterImpl::getInstances(); if (instances.find(sessionId) != instances.end()) { std::shared_ptr<InterpreterImpl> otherSession = instances[sessionId].lock(); @@ -138,21 +132,7 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev * session. */ std::string invokeId = target.substr(2); - if (_interpreter->_invokers.find(invokeId) != _interpreter->_invokers.end()) { - std::lock_guard<std::recursive_mutex> lock(_interpreter->_instanceMutex); - try { - _interpreter->_invokers[invokeId].eventFromSCXML(eventCopy); - } catch(Event e) { - // Is this the right thing to do? -// _interpreter->enqueueExternal(eventCopy); - } catch (const std::exception &e) { - ERROR_COMMUNICATION_THROW("Exception caught while sending event to invoker '" + invokeId + "': " + e.what()); - } catch(...) { - ERROR_COMMUNICATION_THROW("Exception caught while sending event to invoker '" + invokeId + "'"); - } - } else { - ERROR_COMMUNICATION_THROW("Can not send to invoked component '" + invokeId + "', no such invokeId"); - } + _callbacks->enqueueAtInvoker(invokeId, eventCopy); } else { ERROR_COMMUNICATION_THROW("Not sure what to make of the target '" + target + "' - raising error"); } @@ -160,4 +140,4 @@ void SCXMLIOProcessor::eventFromSCXML(const std::string& target, const Event& ev -}
\ No newline at end of file +} diff --git a/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.h b/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.h index 21fd13a..6494873 100644 --- a/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.h +++ b/src/uscxml/plugins/ioprocessor/scxml/SCXMLIOProcessor.h @@ -32,7 +32,7 @@ class SCXMLIOProcessor : public IOProcessorImpl { public: SCXMLIOProcessor(); virtual ~SCXMLIOProcessor(); - virtual std::shared_ptr<IOProcessorImpl> create(uscxml::InterpreterImpl* interpreter); + virtual std::shared_ptr<IOProcessorImpl> create(uscxml::IOProcessorCallbacks* callbacks); virtual std::list<std::string> getNames() { std::list<std::string> names; @@ -46,7 +46,7 @@ public: Data getDataModelVariables(); protected: - InterpreterImpl* _interpreter; + IOProcessorCallbacks* _callbacks; }; #ifdef BUILD_AS_PLUGINS @@ -55,4 +55,4 @@ PLUMA_INHERIT_PROVIDER(SCXMLIOProcessor, IOProcessorImpl); } -#endif /* end of include guard: SCXMLIOProcessor_H_2CUY93KU */
\ No newline at end of file +#endif /* end of include guard: SCXMLIOProcessor_H_2CUY93KU */ |