From c0e29f9d4574be340d23c88605bf8868b166f718 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 27 Mar 2013 17:05:27 +0100 Subject: Polished PHP interface somewhat --- contrib/cmake/FindPHP5.cmake | 3 +- src/bindings/swig/java/CMakeLists.txt | 1 + src/bindings/swig/php/CMakeLists.txt | 5 +- src/bindings/swig/php/test.php | 31 +- src/bindings/swig/php/uscxml.i | 7 +- src/bindings/swig/php/uscxmlNativePHP.php | 443 ++++++++++++++++++++- src/uscxml/Interpreter.h | 4 +- src/uscxml/Message.h | 216 ++++++++-- src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp | 4 +- src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h | 4 +- test/samples/uscxml/test-invoked.scxml | 24 +- 11 files changed, 690 insertions(+), 52 deletions(-) diff --git a/contrib/cmake/FindPHP5.cmake b/contrib/cmake/FindPHP5.cmake index 6ad81a5..68e0f68 100644 --- a/contrib/cmake/FindPHP5.cmake +++ b/contrib/cmake/FindPHP5.cmake @@ -29,11 +29,12 @@ if (UNIX) ERROR_VARIABLE PHP_LDFLAGS_errors RESULT_VARIABLE PHP_LDFLAGS_result) - set(PHP_ZTS_ENABLED OFF) execute_process(COMMAND ${PHP_CONFIG} --configure-options OUTPUT_VARIABLE PHP_CONFIGURE_OPTIONS ERROR_VARIABLE PHP_CONFIGURE_OPTIONS_errors RESULT_VARIABLE PHP_CONFIGURE_OPTIONS_result) + + set(PHP_ZTS_ENABLED OFF) if (PHP_CONFIGURE_OPTIONS MATCHES ".*enable-maintainer-zts.*") set(PHP_ZTS_ENABLED ON) endif() diff --git a/src/bindings/swig/java/CMakeLists.txt b/src/bindings/swig/java/CMakeLists.txt index a729b8e..b66e3f2 100644 --- a/src/bindings/swig/java/CMakeLists.txt +++ b/src/bindings/swig/java/CMakeLists.txt @@ -27,5 +27,6 @@ foreach(JNI_LIBRARY ${JNI_LIBRARIES}) endif() endforeach() set_target_properties(uscxmlNativeJava PROPERTIES FOLDER "Bindings") +set_target_properties(uscxmlNativeJava PROPERTIES COMPILE_FLAGS "-DSWIG") swig_link_libraries(uscxmlNativeJava uscxml) diff --git a/src/bindings/swig/php/CMakeLists.txt b/src/bindings/swig/php/CMakeLists.txt index 17c9465..91c6c36 100644 --- a/src/bindings/swig/php/CMakeLists.txt +++ b/src/bindings/swig/php/CMakeLists.txt @@ -45,6 +45,7 @@ if(APPLE) _zend_register_resource _zend_rsrc_list_get_rsrc_type _zend_wrong_param_count + _zend_throw_exception _zval_used_for_init ) set(PHP_MODULE_CXX_FLAGS @@ -74,7 +75,9 @@ endif() if (PHP_ZTS_ENABLED) # we are only building php bindings for unices anyhow - set_target_properties(uscxmlNativePHP PROPERTIES COMPILE_FLAGS "-DZTS -DPTHREADS") + set_target_properties(uscxmlNativePHP PROPERTIES COMPILE_FLAGS "-DZTS -DPTHREADS -DSWIG") +else() + set_target_properties(uscxmlNativePHP PROPERTIES COMPILE_FLAGS "-DSWIG") endif() set_target_properties(uscxmlNativePHP PROPERTIES FOLDER "Bindings") diff --git a/src/bindings/swig/php/test.php b/src/bindings/swig/php/test.php index 6a15429..6896ab0 100644 --- a/src/bindings/swig/php/test.php +++ b/src/bindings/swig/php/test.php @@ -41,20 +41,31 @@ class MyMonitor extends InterpreterMonitor { $monitor = new MyMonitor(); -$interpreter = Interpreter::fromURI('https://raw.github.com/tklab-tud/uscxml/master/test/samples/uscxml/test-ecmascript.scxml'); -$interpreter->addMonitor($monitor); -$interpreter->interpret(); +// $interpreter = Interpreter::fromURI('https://raw.github.com/tklab-tud/uscxml/master/test/samples/uscxml/test-ecmascript.scxml'); +// $interpreter->addMonitor($monitor); +// $interpreter->interpret(); -$interpreter = Interpreter::fromURI('https://raw.github.com/tklab-tud/uscxml/master/test/samples/uscxml/test-invoked.scxml'); +$interpreter = Interpreter::fromURI('/Users/sradomski/Documents/TK/Code/uscxml/test/samples/uscxml/test-invoked.scxml'); $parentQueue = new ParentQueue(); $interpreter->setParentQueue($parentQueue); -$interpreter->interpret(); //$interpreter->start(); - -#while($interpreter->isRunning()) { +$interpreter->interpret(); +exit(); +while($interpreter->isRunning()) { $event = $parentQueue->pop(); - print_r($event); - print(Event_name_get($event) . "\n"); -#} + print("Name: " . $event->getName() . "\n"); + print("Content: " . $event->getContent() . "\n"); + + print("Namelist: \n"); + $namelist = $event->getNameList(); + print("\tSize: ". $namelist->size() ."\n"); + + $keys = $event->getNameListKeys(); + + for ($i = 0; $i < $keys->size(); $i++) { + print("\t" . $namelist->get($keys->get($i)) . "\n"); + } + +} ?> \ No newline at end of file diff --git a/src/bindings/swig/php/uscxml.i b/src/bindings/swig/php/uscxml.i index 54e9f27..6180d05 100644 --- a/src/bindings/swig/php/uscxml.i +++ b/src/bindings/swig/php/uscxml.i @@ -1,7 +1,7 @@ %module(directors="1", allprotected="1") uscxmlNativePHP // import swig typemaps -%include +%include "stl.i" // macros from cmake %import "uscxml/config.h" @@ -40,4 +40,7 @@ void*** tsrm_ls; %include "../../../uscxml/Interpreter.h" %include "../../../uscxml/concurrency/BlockingQueue.h" -%template(ParentQueue) uscxml::concurrency::BlockingQueue; +%template(ParentQueue) uscxml::concurrency::BlockingQueue; +%template(NameList) std::map; +%template(ParamList) std::vector; +%template(Params) std::map >; diff --git a/src/bindings/swig/php/uscxmlNativePHP.php b/src/bindings/swig/php/uscxmlNativePHP.php index 91f6b21..7a63a1a 100644 --- a/src/bindings/swig/php/uscxmlNativePHP.php +++ b/src/bindings/swig/php/uscxmlNativePHP.php @@ -94,6 +94,38 @@ class Data { function toXMLString() { return Data_toXMLString($this->_cPtr); } + + function getCompund() { + return Data_getCompund($this->_cPtr); + } + + function setCompound($compound) { + Data_setCompound($this->_cPtr,$compound); + } + + function getArray() { + return Data_getArray($this->_cPtr); + } + + function setArray($array) { + Data_setArray($this->_cPtr,$array); + } + + function getAtom() { + return Data_getAtom($this->_cPtr); + } + + function setAtom($atom) { + Data_setAtom($this->_cPtr,$atom); + } + + function getType() { + return Data_getType($this->_cPtr); + } + + function setType($type) { + Data_setType($this->_cPtr,$type); + } } class Event { @@ -138,6 +170,76 @@ class Event { } } + function getName() { + return Event_getName($this->_cPtr); + } + + function setName($name) { + Event_setName($this->_cPtr,$name); + } + + function getType() { + return Event_getType($this->_cPtr); + } + + function setType($type) { + Event_setType($this->_cPtr,$type); + } + + function getOrigin() { + return Event_getOrigin($this->_cPtr); + } + + function setOrigin($origin) { + Event_setOrigin($this->_cPtr,$origin); + } + + function getOriginType() { + return Event_getOriginType($this->_cPtr); + } + + function setOriginType($originType) { + Event_setOriginType($this->_cPtr,$originType); + } + + function getDOM() { + return Event_getDOM($this->_cPtr); + } + + function setDOM($dom) { + Event_setDOM($this->_cPtr,$dom); + } + + function getSendId() { + return Event_getSendId($this->_cPtr); + } + + function setSendId($sendId) { + Event_setSendId($this->_cPtr,$sendId); + } + + function getInvokeId() { + return Event_getInvokeId($this->_cPtr); + } + + function setInvokeId($invokeId) { + Event_setInvokeId($this->_cPtr,$invokeId); + } + + function getData() { + $r=Event_getData($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new Data($r); + } + return $r; + } + + function setData($invokeId) { + Event_setData($this->_cPtr,$invokeId); + } + static function fromXML($xmlString) { $r=Event_fromXML($xmlString); if (is_resource($r)) { @@ -174,6 +276,7 @@ class InvokeRequest extends Event { } function __get($var) { + if ($var === 'namelist') return new NameList(InvokeRequest_namelist_get($this->_cPtr)); $func = 'InvokeRequest_'.$var.'_get'; if (function_exists($func)) return call_user_func($func,$this->_cPtr); if ($var === 'thisown') return swig_uscxmlNativePHP_get_newobject($this->_cPtr); @@ -191,6 +294,78 @@ class InvokeRequest extends Event { } } + function getType() { + return InvokeRequest_getType($this->_cPtr); + } + + function setType($type) { + InvokeRequest_setType($this->_cPtr,$type); + } + + function getSource() { + return InvokeRequest_getSource($this->_cPtr); + } + + function setSource($src) { + InvokeRequest_setSource($this->_cPtr,$src); + } + + function getContent() { + return InvokeRequest_getContent($this->_cPtr); + } + + function setContent($content) { + InvokeRequest_setContent($this->_cPtr,$content); + } + + function isAutoForwarded() { + return InvokeRequest_isAutoForwarded($this->_cPtr); + } + + function setAutoForwarded($autoForward) { + InvokeRequest_setAutoForwarded($this->_cPtr,$autoForward); + } + + function getNameList() { + $r=InvokeRequest_getNameList($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new NameList($r); + } + return $r; + } + + function getNameListKeys() { + $r=InvokeRequest_getNameListKeys($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new ParamList($r); + } + return $r; + } + + function getParams() { + $r=InvokeRequest_getParams($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new Params($r); + } + return $r; + } + + function getParamKeys() { + $r=InvokeRequest_getParamKeys($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new ParamList($r); + } + return $r; + } + static function fromXML($xmlString) { $r=InvokeRequest_fromXML($xmlString); if (is_resource($r)) { @@ -227,6 +402,7 @@ class SendRequest extends Event { } function __get($var) { + if ($var === 'namelist') return new NameList(SendRequest_namelist_get($this->_cPtr)); $func = 'SendRequest_'.$var.'_get'; if (function_exists($func)) return call_user_func($func,$this->_cPtr); if ($var === 'thisown') return swig_uscxmlNativePHP_get_newobject($this->_cPtr); @@ -244,6 +420,78 @@ class SendRequest extends Event { } } + function getTarget() { + return SendRequest_getTarget($this->_cPtr); + } + + function setTarget($target) { + SendRequest_setTarget($this->_cPtr,$target); + } + + function getType() { + return SendRequest_getType($this->_cPtr); + } + + function setType($type) { + SendRequest_setType($this->_cPtr,$type); + } + + function getDelayMs() { + return SendRequest_getDelayMs($this->_cPtr); + } + + function setDelayMs($delayMs) { + SendRequest_setDelayMs($this->_cPtr,$delayMs); + } + + function getContent() { + return SendRequest_getContent($this->_cPtr); + } + + function setContent($content) { + SendRequest_setContent($this->_cPtr,$content); + } + + function getNameList() { + $r=SendRequest_getNameList($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new NameList($r); + } + return $r; + } + + function getNameListKeys() { + $r=SendRequest_getNameListKeys($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new ParamList($r); + } + return $r; + } + + function getParams() { + $r=SendRequest_getParams($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new Params($r); + } + return $r; + } + + function getParamKeys() { + $r=SendRequest_getParamKeys($this->_cPtr); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new ParamList($r); + } + return $r; + } + static function fromXML($xmlString) { $r=SendRequest_fromXML($xmlString); if (is_resource($r)) { @@ -641,7 +889,7 @@ class ParentQueue { } function __construct($res=null) { - if (is_resource($res) && get_resource_type($res) === '_p_uscxml__concurrency__BlockingQueueT_uscxml__Event_t') { + if (is_resource($res) && get_resource_type($res) === '_p_uscxml__concurrency__BlockingQueueT_uscxml__SendRequest_t') { $this->_cPtr=$res; return; } @@ -661,7 +909,7 @@ class ParentQueue { if (is_resource($r)) { $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); if (class_exists($c)) return new $c($r); - return new Event($r); + return new SendRequest($r); } return $r; } @@ -671,5 +919,196 @@ class ParentQueue { } } +class NameList { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_uscxmlNativePHP_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_uscxmlNativePHP_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + + function __construct($arg1=null) { + if (is_resource($arg1) && get_resource_type($arg1) === '_p_std__mapT_std__string_std__string_t') { + $this->_cPtr=$arg1; + return; + } + switch (func_num_args()) { + case 0: $this->_cPtr=new_NameList(); break; + default: $this->_cPtr=new_NameList($arg1); + } + } + + function size() { + return NameList_size($this->_cPtr); + } + + function clear() { + NameList_clear($this->_cPtr); + } + + function get($key) { + return NameList_get($this->_cPtr,$key); + } + + function set($key,$x) { + NameList_set($this->_cPtr,$key,$x); + } + + function del($key) { + NameList_del($this->_cPtr,$key); + } + + function has_key($key) { + return NameList_has_key($this->_cPtr,$key); + } + + function is_empty() { + return NameList_is_empty($this->_cPtr); + } +} + +class ParamList { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_uscxmlNativePHP_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_uscxmlNativePHP_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + + function __construct($n=null) { + if (is_resource($n) && get_resource_type($n) === '_p_std__vectorT_std__string_t') { + $this->_cPtr=$n; + return; + } + switch (func_num_args()) { + case 0: $this->_cPtr=new_ParamList(); break; + default: $this->_cPtr=new_ParamList($n); + } + } + + function size() { + return ParamList_size($this->_cPtr); + } + + function capacity() { + return ParamList_capacity($this->_cPtr); + } + + function reserve($n) { + ParamList_reserve($this->_cPtr,$n); + } + + function clear() { + ParamList_clear($this->_cPtr); + } + + function push($x) { + ParamList_push($this->_cPtr,$x); + } + + function is_empty() { + return ParamList_is_empty($this->_cPtr); + } + + function pop() { + return ParamList_pop($this->_cPtr); + } + + function get($i) { + return ParamList_get($this->_cPtr,$i); + } + + function set($i,$val) { + ParamList_set($this->_cPtr,$i,$val); + } +} + +class Params { + public $_cPtr=null; + protected $_pData=array(); + + function __set($var,$value) { + if ($var === 'thisown') return swig_uscxmlNativePHP_alter_newobject($this->_cPtr,$value); + $this->_pData[$var] = $value; + } + + function __isset($var) { + if ($var === 'thisown') return true; + return array_key_exists($var, $this->_pData); + } + + function __get($var) { + if ($var === 'thisown') return swig_uscxmlNativePHP_get_newobject($this->_cPtr); + return $this->_pData[$var]; + } + + function __construct($arg1=null) { + if (is_resource($arg1) && get_resource_type($arg1) === '_p_std__mapT_std__string_std__vectorT_std__string_t_t') { + $this->_cPtr=$arg1; + return; + } + switch (func_num_args()) { + case 0: $this->_cPtr=new_Params(); break; + default: $this->_cPtr=new_Params($arg1); + } + } + + function size() { + return Params_size($this->_cPtr); + } + + function clear() { + Params_clear($this->_cPtr); + } + + function get($key) { + $r=Params_get($this->_cPtr,$key); + if (is_resource($r)) { + $c=substr(get_resource_type($r), (strpos(get_resource_type($r), '__') ? strpos(get_resource_type($r), '__') + 2 : 3)); + if (class_exists($c)) return new $c($r); + return new ParamList($r); + } + return $r; + } + + function set($key,$x) { + Params_set($this->_cPtr,$key,$x); + } + + function del($key) { + Params_del($this->_cPtr,$key); + } + + function has_key($key) { + return Params_has_key($this->_cPtr,$key); + } + + function is_empty() { + return Params_is_empty($this->_cPtr); + } +} + ?> diff --git a/src/uscxml/Interpreter.h b/src/uscxml/Interpreter.h index d75241e..5d29eb6 100644 --- a/src/uscxml/Interpreter.h +++ b/src/uscxml/Interpreter.h @@ -132,7 +132,7 @@ public: DataModel getDataModel() { return _dataModel; } - void setParentQueue(uscxml::concurrency::BlockingQueue* parentQueue) { + void setParentQueue(uscxml::concurrency::BlockingQueue* parentQueue) { _parentQueue = parentQueue; } std::string getXPathPrefix() { @@ -247,7 +247,7 @@ protected: std::list _internalQueue; uscxml::concurrency::BlockingQueue _externalQueue; - uscxml::concurrency::BlockingQueue* _parentQueue; + uscxml::concurrency::BlockingQueue* _parentQueue; DelayedEventQueue* _sendQueue; Event _currEvent; diff --git a/src/uscxml/Message.h b/src/uscxml/Message.h index c109063..006d515 100644 --- a/src/uscxml/Message.h +++ b/src/uscxml/Message.h @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -39,6 +40,23 @@ public: return ss.str(); } + std::map getCompund() { return compound; } + void setCompound(const std::map& compound) { this->compound = compound; } + + std::list getArray() { return array; } + void setArray(const std::list& array) { this->array = array; } + + std::string getAtom() { return atom; } + void setAtom(const std::string& atom) { this->atom = atom; } + + Type getType() { return type; } + void setType(const Type type) { this->type = type; } + + +#ifdef SWIGIMPORTED +protected: +#endif + std::map compound; std::list array; std::string atom; @@ -66,14 +84,29 @@ public: return this < &other; } - std::string name; - Type type; - std::string origin; - std::string origintype; - Arabica::DOM::Node dom; - std::string sendid; - std::string invokeid; - Data data; + std::string getName() { return name; } + void setName(const std::string& name) { this->name = name; } + + Type getType() { return type; } + void setType(const Type type) { this->type = type; } + + std::string getOrigin() { return origin; } + void setOrigin(const std::string& origin) { this->origin = origin; } + + std::string getOriginType() { return origintype; } + void setOriginType(const std::string& originType) { this->origintype = originType; } + + Arabica::DOM::Node getDOM() { return dom; } + void setDOM(const Arabica::DOM::Node& dom) { this->dom = dom; } + + std::string getSendId() { return sendid; } + void setSendId(const std::string& sendId) { this->sendid = sendId; } + + std::string getInvokeId() { return invokeid; } + void setInvokeId(const std::string& invokeId) { this->invokeid = invokeId; } + + Data getData() { return data; } + void setData(const Data& invokeId) { this->data = data; } static Event fromXML(const std::string& xmlString); Arabica::DOM::Document toDocument(); @@ -83,7 +116,20 @@ public: return ss.str(); } -#ifndef SWIGJAVA +#ifdef SWIGIMPORTED +protected: +#endif + + std::string name; + Type type; + std::string origin; + std::string origintype; + Arabica::DOM::Node dom; + std::string sendid; + std::string invokeid; + Data data; + +#ifndef SWIG friend std::ostream& operator<< (std::ostream& os, const Event& event); #endif }; @@ -92,15 +138,58 @@ class InvokeRequest : public Event { public: InvokeRequest(Event event) : Event(event) {} InvokeRequest() {} - std::string type; - std::string src; - std::map namelist; - typedef std::map namelist_t; - bool autoForward; - std::multimap params; - typedef std::multimap params_t; + + std::string getType() { return type; } + void setType(const std::string& type) { this->type = type; } - std::string content; + std::string getSource() { return src; } + void setSource(const std::string& src) { this->src = src; } + + std::string getContent() { return content; } + void setContent(const std::string& content) { this->content = content; } + + bool isAutoForwarded() { return autoForward; } + void setAutoForwarded(bool autoForward) { this->autoForward = autoForward; } + +#ifdef SWIG + /// TODO: Do we want to set namelist and params as well? + std::map getNameList() { return namelist; } + + virtual const std::vector getNameListKeys() { + std::set keys; + namelist_t::const_iterator nameListIter = namelist.begin(); + while (nameListIter != namelist.end()) { + keys.insert(nameListIter->first); + nameListIter++; + } + return std::vector(keys.begin(), keys.end()); + } + + // substitute multimap by map with vectors for language bindings + std::map > getParams() { + std::map > paramsMap; + params_t::iterator paramIter = params.begin(); + while(paramIter != params.end()) { + paramsMap[paramIter->first].push_back(paramIter->second); + paramIter++; + } + return paramsMap; + } + + const std::vector getParamKeys() { + std::set keys; + params_t::iterator paramIter = params.begin(); + while(paramIter != params.end()) { + keys.insert(paramIter->first); + paramIter++; + } + return std::vector(keys.begin(), keys.end()); + } + +#else + std::map& getNameList() { return namelist; } + std::multimap& getParams() { return params; } +#endif static InvokeRequest fromXML(const std::string& xmlString); Arabica::DOM::Document toDocument(); @@ -110,7 +199,20 @@ public: return ss.str(); } -#ifndef SWIGJAVA +#ifdef SWIGIMPORTED +protected: +#endif + std::string type; + std::string src; + std::string content; + bool autoForward; + std::map namelist; + std::multimap params; + + typedef std::multimap params_t; + typedef std::map namelist_t; + +#ifndef SWIG friend std::ostream& operator<< (std::ostream& os, const InvokeRequest& sendReq); #endif @@ -120,25 +222,83 @@ class SendRequest : public Event { public: SendRequest() {} SendRequest(Event event) : Event(event) {} - std::string target; - std::string type; - uint32_t delayMs; - std::map namelist; - typedef std::map namelist_t; - std::multimap params; - typedef std::multimap params_t; - std::string content; + + std::string getTarget() { return target; } + void setTarget(const std::string& target) { this->target = target; } + + std::string getType() { return type; } + void setType(const std::string& type) { this->type = type; } + + uint32_t getDelayMs() { return delayMs; } + void setDelayMs(uint32_t delayMs) { this->delayMs = delayMs; } + + std::string getContent() { return content; } + void setContent(const std::string& content) { this->content = content; } + +#ifdef SWIG + /// TODO: Do we want to set namelist and params as well? + std::map getNameList() { return namelist; } + + virtual const std::vector getNameListKeys() { + std::set keys; + namelist_t::const_iterator nameListIter = namelist.begin(); + while (nameListIter != namelist.end()) { + keys.insert(nameListIter->first); + nameListIter++; + } + return std::vector(keys.begin(), keys.end()); + } + + // substitute multimap by map with vectors for language bindings + std::map > getParams() { + std::map > paramsMap; + params_t::iterator paramIter = params.begin(); + while(paramIter != params.end()) { + paramsMap[paramIter->first].push_back(paramIter->second); + paramIter++; + } + return paramsMap; + } + + const std::vector getParamKeys() { + std::set keys; + params_t::iterator paramIter = params.begin(); + while(paramIter != params.end()) { + keys.insert(paramIter->first); + paramIter++; + } + return std::vector(keys.begin(), keys.end()); + } + +#else + std::map& getNameList() { return namelist; } + std::multimap& getParams() { return params; } +#endif static SendRequest fromXML(const std::string& xmlString); Arabica::DOM::Document toDocument(); std::string toXMLString() { std::stringstream ss; ss << toDocument(); -// std::cout << ss.str() << std::endl; + // std::cout << ss.str() << std::endl; return ss.str(); } -#ifndef SWIGJAVA +#ifdef SWIGIMPORTED +protected: +#endif + std::string target; + std::string type; + uint32_t delayMs; + std::string content; + + std::map namelist; + std::multimap params; + + typedef std::map namelist_t; + typedef std::multimap params_t; + +#ifndef SWIG friend std::ostream& operator<< (std::ostream& os, const SendRequest& sendReq); #endif diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp index b7d08c4..447c52f 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.cpp @@ -54,8 +54,8 @@ void USCXMLInvoker::invoke(const InvokeRequest& req) { } } -void USCXMLInvoker::push(const Event& event) { - Event copyEvent(event); +void USCXMLInvoker::push(const SendRequest& event) { + SendRequest copyEvent(event); copyEvent.invokeid = _invokeId; _parentInterpreter->receive(copyEvent); } diff --git a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h index aedef32..857ffe2 100644 --- a/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h +++ b/src/uscxml/plugins/invoker/scxml/USCXMLInvoker.h @@ -15,7 +15,7 @@ class Interpreter; class USCXMLInvoker : public InvokerImpl, - public uscxml::concurrency::BlockingQueue, + public uscxml::concurrency::BlockingQueue, public boost::enable_shared_from_this { public: USCXMLInvoker(); @@ -35,7 +35,7 @@ public: virtual void cancel(const std::string sendId); virtual void invoke(const InvokeRequest& req); - virtual void push(const Event& event); + virtual void push(const SendRequest& event); protected: Interpreter* _invokedInterpreter; diff --git a/test/samples/uscxml/test-invoked.scxml b/test/samples/uscxml/test-invoked.scxml index 2781d31..eb9162e 100644 --- a/test/samples/uscxml/test-invoked.scxml +++ b/test/samples/uscxml/test-invoked.scxml @@ -2,8 +2,28 @@ - - + + + + + +This is some content! + + + + + \ No newline at end of file -- cgit v0.12