From bd394cdb9f78715cf92ddaaef026b6b00d3d2bd9 Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Wed, 17 Apr 2013 22:43:59 +0200 Subject: Fixed setConfiguration and started MMI arch --- CMakeLists.txt | 20 +- docs/CentOS.md | 21 +- src/uscxml/Factory.cpp | 4 +- src/uscxml/interpreter/InterpreterDraft6.cpp | 2 +- src/uscxml/plugins/invoker/miles/SpatialAudio.cpp | 197 +++++++++ src/uscxml/plugins/invoker/miles/SpatialAudio.h | 55 +++ .../plugins/invoker/modality/MMIComponent.cpp | 42 -- src/uscxml/plugins/invoker/modality/MMIComponent.h | 109 ----- .../plugins/invoker/modality/UmundoComponent.cpp | 49 --- .../plugins/invoker/modality/UmundoComponent.h | 30 -- .../invoker/modality/miles/SpatialAudio.cpp | 197 --------- .../plugins/invoker/modality/miles/SpatialAudio.h | 58 --- .../plugins/ioprocessor/modality/MMIComponent.cpp | 30 ++ .../plugins/ioprocessor/modality/MMIComponent.h | 51 +++ .../plugins/ioprocessor/modality/MMIMessages.cpp | 338 +++++++++++++++ .../plugins/ioprocessor/modality/MMIMessages.h | 280 ++++++++++++ test/CMakeLists.txt | 5 + test/src/test-mmi.cpp | 475 +++++++++++++++++++++ test/src/test-url.cpp | 15 +- 19 files changed, 1469 insertions(+), 509 deletions(-) create mode 100644 src/uscxml/plugins/invoker/miles/SpatialAudio.cpp create mode 100644 src/uscxml/plugins/invoker/miles/SpatialAudio.h delete mode 100644 src/uscxml/plugins/invoker/modality/MMIComponent.cpp delete mode 100644 src/uscxml/plugins/invoker/modality/MMIComponent.h delete mode 100644 src/uscxml/plugins/invoker/modality/UmundoComponent.cpp delete mode 100644 src/uscxml/plugins/invoker/modality/UmundoComponent.h delete mode 100644 src/uscxml/plugins/invoker/modality/miles/SpatialAudio.cpp delete mode 100644 src/uscxml/plugins/invoker/modality/miles/SpatialAudio.h create mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIComponent.cpp create mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIComponent.h create mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp create mode 100644 src/uscxml/plugins/ioprocessor/modality/MMIMessages.h create mode 100644 test/src/test-mmi.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 62c865d..8abbe26 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -503,6 +503,24 @@ else() endif() +# mmi ioprocessor + +file(GLOB_RECURSE MMI_IOPROCESSOR + src/uscxml/plugins/ioprocessor/modality/*.cpp + src/uscxml/plugins/ioprocessor/modality/*.h +) +source_group("IOProcessor\\modality" FILES ${MMI_IOPROCESSOR}) +if (BUILD_AS_PLUGINS) + add_library( + ioprocessor_mmi SHARED + ${MMI_IOPROCESSOR}) + target_link_libraries(ioprocessor_mmi uscxml) + set_target_properties(ioprocessor_mmi PROPERTIES FOLDER "Plugin IOProcessor") +else() + list (APPEND USCXML_FILES ${MMI_IOPROCESSOR}) +endif() + + # Fetch element file(GLOB_RECURSE FETCH_ELEMENT @@ -923,7 +941,7 @@ endif() # MILES modality components find_package(MILES) -if (MILES_FOUND) +if (MILES_FOUND AND OFF) include_directories(${MILES_INCLUDE_DIR}) # openal is only needed for miles diff --git a/docs/CentOS.md b/docs/CentOS.md index cb2045f..8a3424e 100644 --- a/docs/CentOS.md +++ b/docs/CentOS.md @@ -8,23 +8,16 @@ $ wget http://sourceforge.net/projects/boost/files/latest/download $ tar xvjf boost* $ cd boost* $ ./bootstrap.sh -$ ./b2 --layout=tagged install - -sudo yum install libtool-ltdl-devel -sudo yum install libxml2-devel -sudo yum install libpng-devel -sudo yum install libjpeg-devel -sudo yum install libtiff-devel -sudo yum install libcurl-devel -sudo yum install mesa-libGL-devel -sudo yum install pcre-devel +$ sudo ./b2 --layout=tagged install + +sudo yum install libtool-ltdl-devel libxml2-devel libpng-devel libjpeg-devel libtiff-devel libcurl-devel mesa-libGL-devel pcre-devel sudo yum remove swig $ wget http://sourceforge.net/projects/openvrml/files/latest/download $ tar xvjf openvrml* $ cd openvrml* $ ./configure --disable-render-text-node --disable-script-node-javascript --disable-script-node-java --disable-gl-renderer --disable-xembed --disable-player --disable-examples --disable-mozilla-plugin -$ make install +$ sudo make install $ wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz $ tar xvzf cmake-2.8.10.2.tar.gz @@ -36,10 +29,10 @@ $ svn co http://www.openscenegraph.org/svn/osg/OpenSceneGraph/tags/OpenSceneGrap $ cd OpenSceneGraph $ mkdir build && cd build $ cmake .. -$ make -$ make install +$ make -j4 +$ sudo make install -$ wget http://sourceforge.net/projects/boost/files/latest/download +$ wget http://sourceforge.net/projects/swig/files/latest/download $ tar xvjf swig* $ cd swig* $ ./configure diff --git a/src/uscxml/Factory.cpp b/src/uscxml/Factory.cpp index 76da139..5c9b206 100644 --- a/src/uscxml/Factory.cpp +++ b/src/uscxml/Factory.cpp @@ -104,8 +104,8 @@ Factory::Factory() { #ifdef MILES_FOUND { - MilesSessionInvoker* invoker = new MilesSessionInvoker(); - registerInvoker(invoker); +// MilesSessionInvoker* invoker = new MilesSessionInvoker(); +// registerInvoker(invoker); } #endif diff --git a/src/uscxml/interpreter/InterpreterDraft6.cpp b/src/uscxml/interpreter/InterpreterDraft6.cpp index ef40362..a15e9a4 100644 --- a/src/uscxml/interpreter/InterpreterDraft6.cpp +++ b/src/uscxml/interpreter/InterpreterDraft6.cpp @@ -81,7 +81,7 @@ void InterpreterDraft6::interpret() { Arabica::XPath::NodeSet initialStates; if (_userDefinedStartConfiguration.size() > 0) { // otherwise use user supplied config - initialTransitions = getStates(_userDefinedStartConfiguration); + initialStates = getStates(_userDefinedStartConfiguration); } else { // or fetch per draft initialStates = getInitialStates(); diff --git a/src/uscxml/plugins/invoker/miles/SpatialAudio.cpp b/src/uscxml/plugins/invoker/miles/SpatialAudio.cpp new file mode 100644 index 0000000..acc5c4b --- /dev/null +++ b/src/uscxml/plugins/invoker/miles/SpatialAudio.cpp @@ -0,0 +1,197 @@ +#include "uscxml/Common.h" +#include "SpatialAudio.h" +#include "uscxml/Interpreter.h" +#include "uscxml/URL.h" + +#include + +#ifdef _WIN32 +#define _USE_MATH_DEFINES +#endif +#include + +namespace uscxml { + +#ifdef BUILD_AS_PLUGINS +PLUMA_CONNECTOR +bool connect(pluma::Host& host) { + host.add( new SpatialAudioProvider() ); + return true; +} +#endif + +SpatialAudio::SpatialAudio() { + _audioDevOpen = false; + _audioDev = NULL; + _audioDevIndex = -1; + _pos = new float[3]; + _pos[0] = _pos[1] = _pos[2] = 0.0; + _listener = new float[3]; + _listener[0] = _listener[1] = _listener[2] = 0.0; +} + + +SpatialAudio::~SpatialAudio() { +}; + +Invoker* SpatialAudio::create(Interpreter* interpreter) { + SpatialAudio* invoker = new SpatialAudio(); + invoker->_interpreter = interpreter; + return invoker; +} + +Data SpatialAudio::getDataModelVariables() { + Data data; +// data.compound["foo"] = Data("32"); + return data; +} + +void SpatialAudio::send(SendRequest& req) { + if (!_audioDevOpen) { + _audioDev = miles_audio_device_open(_audioDevIndex, 0, 22050, 2, 1, 0); + if (_audioDev != NULL) { + _audioDevOpen = true; + float rolloffFactor = 0.2; + miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_ROLLOFF_FACTOR, &rolloffFactor); + } + } + + if (boost::iequals(req.name, "play")) { + if (_audioDevOpen) { + getPosFromParams(req.params, _pos); + +// std::cout << "Source: "; +// for (int i = 0; i < 3; i++) { +// std::cout << _pos[i] << " "; +// } +// std::cout << std::endl; + + miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_POSITION, _pos); + + char* buffer = (char*)malloc(_audioDev->chunk_size); + // skip wav header + _dataStream.seekg(44); + + while(_dataStream.readsome(buffer, _audioDev->chunk_size) != 0) { + miles_audio_device_write(_audioDev, buffer, _audioDev->chunk_size); + } + free(buffer); + } + } else if (boost::iequals(req.name, "move.listener")) { + if (_audioDevOpen) { + getPosFromParams(req.params, _listener); + + std::cout << "Listener: "; + for (int i = 0; i < 3; i++) { + std::cout << _listener[i] << " "; + } + std::cout << std::endl; + + miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_LISTENER_POS, _listener); + + } + } +} + +void SpatialAudio::cancel(const std::string sendId) { + assert(false); +} + +void SpatialAudio::sendToParent(SendRequest& req) { + req.invokeid = _invokeId; + assert(false); +} + +void SpatialAudio::invoke(InvokeRequest& req) { + _invokeId = req.invokeid; + + if (req.src.length() > 0) { + Arabica::io::URI url(req.src); + if (!_interpreter->makeAbsolute(url)) { + LOG(ERROR) << "Source attribute for audio invoker has relative URI " << req.src << " with no base URI set for interpreter"; + return; + } + + URL scriptUrl(url.as_string()); + _dataStream << scriptUrl; + } + + getPosFromParams(req.params, _pos); + + struct miles_audio_device_description *devices; + int ndevs; + + ndevs = miles_audio_device_get_supported_devices(&devices); + + for (int i = 0; i < ndevs; i++) { + if ((devices[i].capabilities & MILES_AUDIO_DEVICE_CAPABILITY_SPATIAL) && + (devices[i].capabilities & MILES_AUDIO_DEVICE_CAPABILITY_OUTPUT)) { + _audioDevIndex = i; + break; + } + } +} + +void SpatialAudio::getPosFromParams(std::map >& params, float* position) { + // vector explicitly given + try { + if (params.find("x") != params.end()) + position[0] = boost::lexical_cast(params["x"].front()); + if (params.find("y") != params.end()) + position[1] = boost::lexical_cast(params["y"].front()); + if (params.find("z") != params.end()) + position[2] = boost::lexical_cast(params["z"].front()); + } catch (boost::bad_lexical_cast& e) { + LOG(ERROR) << "Cannot interpret x, y or z as float value in params: " << e.what(); + } + + try { + // right is an alias for x + if (params.find("right") != params.end()) + position[0] = boost::lexical_cast(params["right"].front()); + // height is an alias for y + if (params.find("height") != params.end()) + position[1] = boost::lexical_cast(params["height"].front()); + // front is an alias for z + if (params.find("front") != params.end()) + position[2] = boost::lexical_cast(params["front"].front()); + } catch (boost::bad_lexical_cast& e) { + LOG(ERROR) << "Cannot interpret right, height or front as float value in params: " << e.what(); + } + + // do we have a position on a circle? + try { + if (params.find("circle") != params.end()) { + float rad = posToRadian(params["circle"].front()); + position[0] = cosf(rad); + position[2] = -1 * sinf(rad); // z axis increases to front + } + } catch (boost::bad_lexical_cast& e) { + LOG(ERROR) << "Cannot interpret circle as float value in params: " << e.what(); + } +// std::cout << _pos[0] << ":" << _pos[1] << ":" << _pos[2] << std::endl; + +} + +float SpatialAudio::posToRadian(std::string& position) { + boost::trim(position); + float rad = 0; + + if (position.size() > 3 && boost::iequals("deg", position.substr(position.length() - 3, 3))) { + rad = boost::lexical_cast(position.substr(0, position.size() - 3)); + rad = fmodf(rad, 360); // into range [0-360] + rad /= 180; // into range [0-2] + rad *= M_PI; // into range [0-2PI] + rad -= M_PI_2; // 0 to top; + rad *= -1; // make clockwise + rad += 2 * M_PI; // make positive + } else if (position.size() > 3 && boost::iequals("rad", position.substr(position.length() - 3, 3))) { + rad = boost::lexical_cast(position.substr(0, position.size() - 3)); + rad = fmodf(rad, M_PI * 2); // into range [0-2*PI] + } else { + LOG(ERROR) << "Cannot make sense of position value " << position << ": does not end in 'deg', 'rad'"; + } + return rad; +} + +} \ No newline at end of file diff --git a/src/uscxml/plugins/invoker/miles/SpatialAudio.h b/src/uscxml/plugins/invoker/miles/SpatialAudio.h new file mode 100644 index 0000000..bb0886f --- /dev/null +++ b/src/uscxml/plugins/invoker/miles/SpatialAudio.h @@ -0,0 +1,55 @@ +#ifndef SPATIALAUDIO_H_EH11SAQC +#define SPATIALAUDIO_H_EH11SAQC + +#include +#include + +extern "C" { +# include "miles/audio.h" +# include "miles/audio_codec.h" +# include "miles/audio_device.h" +} + +namespace uscxml { + +class SpatialAudio : public InvokerImpl { +public: + SpatialAudio(); + virtual ~SpatialAudio(); + virtual Invoker* create(Interpreter* interpreter); + + virtual std::set getNames() { + std::set names; + names.insert("spatial-audio"); + names.insert("audio"); + names.insert("http://www.smartvortex.eu/mmi/spatial-audio"); + names.insert("http://www.smartvortex.eu/mmi/spatial-audio/"); + return names; + } + + virtual Data getDataModelVariables(); + virtual void send(SendRequest& req); + virtual void cancel(const std::string sendId); + virtual void invoke(InvokeRequest& req); + virtual void sendToParent(SendRequest& req); + + void getPosFromParams(std::map >& params, float* position); + static float posToRadian(std::string& position); + +protected: + std::string _invokeId; + Interpreter* _invokedInterpreter; + + std::stringstream _dataStream; + + float* _pos; + float* _listener; + bool _audioDevOpen; + int _audioDevIndex; + struct miles_audio_device* _audioDev; + +}; + +} + +#endif /* end of include guard: SPATIALAUDIO_H_EH11SAQC */ diff --git a/src/uscxml/plugins/invoker/modality/MMIComponent.cpp b/src/uscxml/plugins/invoker/modality/MMIComponent.cpp deleted file mode 100644 index 170f4bc..0000000 --- a/src/uscxml/plugins/invoker/modality/MMIComponent.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "MMIComponent.h" -#include "uscxml/Interpreter.h" - -namespace uscxml { - -MMIComponent::MMIComponent() { -} - - -MMIComponent::~MMIComponent() { -}; - -Invoker* MMIComponent::create(Interpreter* interpreter) { - MMIComponent* invoker = new MMIComponent(); - invoker->_interpreter = interpreter; - return invoker; -} - -Data MMIComponent::getDataModelVariables() { - Data data; - return data; -} - -void MMIComponent::send(SendRequest& req) { - -} - -void MMIComponent::cancel(const std::string sendId) { - assert(false); -} - -void MMIComponent::sendToParent(SendRequest& req) { - req.invokeid = _invokeId; - assert(false); -} - -void MMIComponent::invoke(InvokeRequest& req) { - _invokeId = req.invokeid; - -} - -} \ No newline at end of file diff --git a/src/uscxml/plugins/invoker/modality/MMIComponent.h b/src/uscxml/plugins/invoker/modality/MMIComponent.h deleted file mode 100644 index 96d796b..0000000 --- a/src/uscxml/plugins/invoker/modality/MMIComponent.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef MMICOMPONENT_H_MZ1I550N -#define MMICOMPONENT_H_MZ1I550N - -#include "uscxml/Factory.h" - -namespace uscxml { - -class Interpreter; - -class MMIComponent : public Invoker { -public: - - enum State { - PAUSED, - RUNNING, - IDLE, - TERMINATED - }; - - MMIComponent(); - virtual ~MMIComponent(); - virtual Invoker* create(Interpreter* interpreter); - - virtual Data getDataModelVariables(); - virtual void send(SendRequest& req); - virtual void cancel(const std::string sendId); - virtual void invoke(InvokeRequest& req); - virtual void sendToParent(SendRequest& req); - -protected: - std::string _invokeId; - Interpreter* _interpreter; - - State _state; -}; - - -/** Base classes for MMI messages */ - -class MMICoreMessage { -public: - std::string source; - std::string target; - std::string data; - std::string requestId; -}; - -class MMICtxMessage : public MMICoreMessage { -public: - std::string context; -}; - -class MMIStartMessage : public MMICtxMessage { -public: - std::string content; - std::string contentURL; -}; - -class MMISimpleStatusMessage : public MMICtxMessage { -public: - std::string status; -}; - -class MMIStatusMessage : public MMISimpleStatusMessage { -public: - std::string statusInfo; -}; - -/** Concrete MMI messages */ - -class MMINewContextRequest : public MMICoreMessage {}; - -/***/ - -class MMIPauseRequest : public MMICtxMessage {}; -class MMIResumeRequest : public MMICtxMessage {}; -class MMICancelRequest : public MMICtxMessage {}; -class MMIClearContextRequest : public MMICtxMessage {}; -class MMIStatusRequest : public MMICtxMessage {}; - -/***/ - -class MMIStartRequest : public MMIStartMessage {}; -class MMIPrepareRequest : public MMIStartMessage {}; - -/***/ - -class MMIExtensionNotification : public MMICtxMessage { - std::string name; -}; - -/***/ - -class MMIStatusResponse : public MMISimpleStatusMessage {}; - -/***/ - -class MMIStartResponse : public MMIStatusMessage {}; -class MMIPrepareRespnse : public MMIStatusMessage {}; -class MMIPauseResponse : public MMIStatusMessage {}; -class MMIResumeResponse : public MMIStatusMessage {}; -class MMICancelResponse : public MMIStatusMessage {}; -class MMIDoneNotification : public MMIStatusMessage {}; -class MMINewContextResponse : public MMIStatusMessage {}; -class MMIClearContextResponse : public MMIStatusMessage {}; - -} - -#endif /* end of include guard: MMICOMPONENT_H_MZ1I550N */ diff --git a/src/uscxml/plugins/invoker/modality/UmundoComponent.cpp b/src/uscxml/plugins/invoker/modality/UmundoComponent.cpp deleted file mode 100644 index 10f23d4..0000000 --- a/src/uscxml/plugins/invoker/modality/UmundoComponent.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "UmundoComponent.h" -#include "uscxml/Interpreter.h" - -namespace uscxml { - -UmundoComponent::UmundoComponent() { -} - - -UmundoComponent::~UmundoComponent() { - delete _invokedInterpreter; -}; - -Invoker* UmundoComponent::create(Interpreter* interpreter) { - UmundoComponent* invoker = new UmundoComponent(); - invoker->_parentInterpreter = interpreter; - return invoker; -} - -Data UmundoComponent::getDataModelVariables() { - Data data; - return data; -} - -void UmundoComponent::send(SendRequest& req) { - assert(false); -} - -void UmundoComponent::cancel(const std::string sendId) { - assert(false); -} - -void UmundoComponent::sendToParent(SendRequest& req) { - req.invokeid = _invokeId; - _parentInterpreter->receive(req); -} - -void UmundoComponent::invoke(InvokeRequest& req) { - _invokeId = req.invokeid; - _invokedInterpreter = Interpreter::fromURI(req.src); - DataModel* dataModel = _invokedInterpreter->getDataModel(); - if (dataModel != NULL) { - - } - _invokedInterpreter->setInvoker(this); - _invokedInterpreter->start(); -} - -} \ No newline at end of file diff --git a/src/uscxml/plugins/invoker/modality/UmundoComponent.h b/src/uscxml/plugins/invoker/modality/UmundoComponent.h deleted file mode 100644 index 69b3961..0000000 --- a/src/uscxml/plugins/invoker/modality/UmundoComponent.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef UMUNDOCOMPONENT_H_VMW54W1R -#define UMUNDOCOMPONENT_H_VMW54W1R - -#include "MMIComponent.h" - -namespace uscxml { - -class Interpreter; - -class UmundoComponent : public MMIComponent { -public: - UmundoComponent(); - virtual ~UmundoComponent(); - virtual Invoker* create(Interpreter* interpreter); - - virtual Data getDataModelVariables(); - virtual void send(SendRequest& req); - virtual void cancel(const std::string sendId); - virtual void invoke(InvokeRequest& req); - virtual void sendToParent(SendRequest& req); - -protected: - std::string _invokeId; - Interpreter* _invokedInterpreter; - Interpreter* _parentInterpreter; -}; - -} - -#endif /* end of include guard: UMUNDOCOMPONENT_H_VMW54W1R */ diff --git a/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.cpp b/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.cpp deleted file mode 100644 index acc5c4b..0000000 --- a/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.cpp +++ /dev/null @@ -1,197 +0,0 @@ -#include "uscxml/Common.h" -#include "SpatialAudio.h" -#include "uscxml/Interpreter.h" -#include "uscxml/URL.h" - -#include - -#ifdef _WIN32 -#define _USE_MATH_DEFINES -#endif -#include - -namespace uscxml { - -#ifdef BUILD_AS_PLUGINS -PLUMA_CONNECTOR -bool connect(pluma::Host& host) { - host.add( new SpatialAudioProvider() ); - return true; -} -#endif - -SpatialAudio::SpatialAudio() { - _audioDevOpen = false; - _audioDev = NULL; - _audioDevIndex = -1; - _pos = new float[3]; - _pos[0] = _pos[1] = _pos[2] = 0.0; - _listener = new float[3]; - _listener[0] = _listener[1] = _listener[2] = 0.0; -} - - -SpatialAudio::~SpatialAudio() { -}; - -Invoker* SpatialAudio::create(Interpreter* interpreter) { - SpatialAudio* invoker = new SpatialAudio(); - invoker->_interpreter = interpreter; - return invoker; -} - -Data SpatialAudio::getDataModelVariables() { - Data data; -// data.compound["foo"] = Data("32"); - return data; -} - -void SpatialAudio::send(SendRequest& req) { - if (!_audioDevOpen) { - _audioDev = miles_audio_device_open(_audioDevIndex, 0, 22050, 2, 1, 0); - if (_audioDev != NULL) { - _audioDevOpen = true; - float rolloffFactor = 0.2; - miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_ROLLOFF_FACTOR, &rolloffFactor); - } - } - - if (boost::iequals(req.name, "play")) { - if (_audioDevOpen) { - getPosFromParams(req.params, _pos); - -// std::cout << "Source: "; -// for (int i = 0; i < 3; i++) { -// std::cout << _pos[i] << " "; -// } -// std::cout << std::endl; - - miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_POSITION, _pos); - - char* buffer = (char*)malloc(_audioDev->chunk_size); - // skip wav header - _dataStream.seekg(44); - - while(_dataStream.readsome(buffer, _audioDev->chunk_size) != 0) { - miles_audio_device_write(_audioDev, buffer, _audioDev->chunk_size); - } - free(buffer); - } - } else if (boost::iequals(req.name, "move.listener")) { - if (_audioDevOpen) { - getPosFromParams(req.params, _listener); - - std::cout << "Listener: "; - for (int i = 0; i < 3; i++) { - std::cout << _listener[i] << " "; - } - std::cout << std::endl; - - miles_audio_device_control(_audioDev, MILES_AUDIO_DEVICE_CTRL_SET_LISTENER_POS, _listener); - - } - } -} - -void SpatialAudio::cancel(const std::string sendId) { - assert(false); -} - -void SpatialAudio::sendToParent(SendRequest& req) { - req.invokeid = _invokeId; - assert(false); -} - -void SpatialAudio::invoke(InvokeRequest& req) { - _invokeId = req.invokeid; - - if (req.src.length() > 0) { - Arabica::io::URI url(req.src); - if (!_interpreter->makeAbsolute(url)) { - LOG(ERROR) << "Source attribute for audio invoker has relative URI " << req.src << " with no base URI set for interpreter"; - return; - } - - URL scriptUrl(url.as_string()); - _dataStream << scriptUrl; - } - - getPosFromParams(req.params, _pos); - - struct miles_audio_device_description *devices; - int ndevs; - - ndevs = miles_audio_device_get_supported_devices(&devices); - - for (int i = 0; i < ndevs; i++) { - if ((devices[i].capabilities & MILES_AUDIO_DEVICE_CAPABILITY_SPATIAL) && - (devices[i].capabilities & MILES_AUDIO_DEVICE_CAPABILITY_OUTPUT)) { - _audioDevIndex = i; - break; - } - } -} - -void SpatialAudio::getPosFromParams(std::map >& params, float* position) { - // vector explicitly given - try { - if (params.find("x") != params.end()) - position[0] = boost::lexical_cast(params["x"].front()); - if (params.find("y") != params.end()) - position[1] = boost::lexical_cast(params["y"].front()); - if (params.find("z") != params.end()) - position[2] = boost::lexical_cast(params["z"].front()); - } catch (boost::bad_lexical_cast& e) { - LOG(ERROR) << "Cannot interpret x, y or z as float value in params: " << e.what(); - } - - try { - // right is an alias for x - if (params.find("right") != params.end()) - position[0] = boost::lexical_cast(params["right"].front()); - // height is an alias for y - if (params.find("height") != params.end()) - position[1] = boost::lexical_cast(params["height"].front()); - // front is an alias for z - if (params.find("front") != params.end()) - position[2] = boost::lexical_cast(params["front"].front()); - } catch (boost::bad_lexical_cast& e) { - LOG(ERROR) << "Cannot interpret right, height or front as float value in params: " << e.what(); - } - - // do we have a position on a circle? - try { - if (params.find("circle") != params.end()) { - float rad = posToRadian(params["circle"].front()); - position[0] = cosf(rad); - position[2] = -1 * sinf(rad); // z axis increases to front - } - } catch (boost::bad_lexical_cast& e) { - LOG(ERROR) << "Cannot interpret circle as float value in params: " << e.what(); - } -// std::cout << _pos[0] << ":" << _pos[1] << ":" << _pos[2] << std::endl; - -} - -float SpatialAudio::posToRadian(std::string& position) { - boost::trim(position); - float rad = 0; - - if (position.size() > 3 && boost::iequals("deg", position.substr(position.length() - 3, 3))) { - rad = boost::lexical_cast(position.substr(0, position.size() - 3)); - rad = fmodf(rad, 360); // into range [0-360] - rad /= 180; // into range [0-2] - rad *= M_PI; // into range [0-2PI] - rad -= M_PI_2; // 0 to top; - rad *= -1; // make clockwise - rad += 2 * M_PI; // make positive - } else if (position.size() > 3 && boost::iequals("rad", position.substr(position.length() - 3, 3))) { - rad = boost::lexical_cast(position.substr(0, position.size() - 3)); - rad = fmodf(rad, M_PI * 2); // into range [0-2*PI] - } else { - LOG(ERROR) << "Cannot make sense of position value " << position << ": does not end in 'deg', 'rad'"; - } - return rad; -} - -} \ No newline at end of file diff --git a/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.h b/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.h deleted file mode 100644 index 7632f52..0000000 --- a/src/uscxml/plugins/invoker/modality/miles/SpatialAudio.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef SPATIALAUDIO_H_EH11SAQC -#define SPATIALAUDIO_H_EH11SAQC - -#include - -#include "../MMIComponent.h" - -extern "C" { -# include "miles/audio.h" -# include "miles/audio_codec.h" -# include "miles/audio_device.h" -} - -namespace uscxml { - -class Interpreter; - -class SpatialAudio : public MMIComponent { -public: - SpatialAudio(); - virtual ~SpatialAudio(); - virtual Invoker* create(Interpreter* interpreter); - - virtual std::set getNames() { - std::set names; - names.insert("spatial-audio"); - names.insert("audio"); - names.insert("http://www.smartvortex.eu/mmi/spatial-audio"); - names.insert("http://www.smartvortex.eu/mmi/spatial-audio/"); - return names; - } - - virtual Data getDataModelVariables(); - virtual void send(SendRequest& req); - virtual void cancel(const std::string sendId); - virtual void invoke(InvokeRequest& req); - virtual void sendToParent(SendRequest& req); - - void getPosFromParams(std::map >& params, float* position); - static float posToRadian(std::string& position); - -protected: - std::string _invokeId; - Interpreter* _invokedInterpreter; - - std::stringstream _dataStream; - - float* _pos; - float* _listener; - bool _audioDevOpen; - int _audioDevIndex; - struct miles_audio_device* _audioDev; - -}; - -} - -#endif /* end of include guard: SPATIALAUDIO_H_EH11SAQC */ diff --git a/src/uscxml/plugins/ioprocessor/modality/MMIComponent.cpp b/src/uscxml/plugins/ioprocessor/modality/MMIComponent.cpp new file mode 100644 index 0000000..a38e275 --- /dev/null +++ b/src/uscxml/plugins/ioprocessor/modality/MMIComponent.cpp @@ -0,0 +1,30 @@ +#include "MMIComponent.h" +//#include + +#ifdef BUILD_AS_PLUGINS +#include +#endif + +namespace uscxml { + +MMIIOProcessor::MMIIOProcessor() { +} + +MMIIOProcessor::~MMIIOProcessor() { +} + +boost::shared_ptr MMIIOProcessor::create(InterpreterImpl* interpreter) { + boost::shared_ptr invoker = boost::shared_ptr(new MMIIOProcessor()); + invoker->_interpreter = interpreter; + return invoker; +} + +Data MMIIOProcessor::getDataModelVariables() { + Data data; + return data; +} + +void MMIIOProcessor::send(const SendRequest& req) { +} + +} \ No newline at end of file diff --git a/src/uscxml/plugins/ioprocessor/modality/MMIComponent.h b/src/uscxml/plugins/ioprocessor/modality/MMIComponent.h new file mode 100644 index 0000000..bee568b --- /dev/null +++ b/src/uscxml/plugins/ioprocessor/modality/MMIComponent.h @@ -0,0 +1,51 @@ +#ifndef MMIIOPROCESSOR_H_W09J90F0 +#define MMIIOPROCESSOR_H_W09J90F0 + +#include +#include "MMIMessages.h" + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + +namespace uscxml { + +class MMIIOProcessor : public IOProcessorImpl { +public: + MMIIOProcessor(); + virtual ~MMIIOProcessor(); + virtual boost::shared_ptr create(InterpreterImpl* interpreter); + + virtual std::set getNames() { + return std::set(); + }; + + virtual Data getDataModelVariables(); + virtual void send(const SendRequest& req); + + /** Modality component */ + virtual PrepareResponse prepare(const PrepareRequest&); + virtual StartResponse start(const StartRequest&); + virtual CancelResponse cancel(const CancelRequest&); + virtual PauseResponse pause(const PauseRequest&); + virtual ResumeResponse resume(const ResumeRequest&); + virtual ExtensionNotification extension(const ExtensionNotification&); + virtual ClearContextRequest clearContext(const ClearContextRequest&); + virtual StatusResponse status(const StatusRequest&); + + /** Interaction Manager */ + virtual NewContextResponse newContext(const NewContextRequest&); + virtual DoneNotification done(const DoneNotification&); +// virtual ExtensionNotification extension(const ExtensionNotification&); + + +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(MMIIOProcessor, IOProcessorImpl); +#endif + +} + + +#endif /* end of include guard: MMIIOPROCESSOR_H_W09J90F0 */ diff --git a/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp b/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp new file mode 100644 index 0000000..ed92fac --- /dev/null +++ b/src/uscxml/plugins/ioprocessor/modality/MMIMessages.cpp @@ -0,0 +1,338 @@ +#include "MMIMessages.h" + +#include +#include +#include +#include + +#include + +namespace uscxml { + +using namespace Arabica::DOM; + +std::string MMIMessage::nameSpace = "http://www.w3.org/2008/04/mmi-arch"; + +Arabica::DOM::Document MMIMessage::toXML() { + Arabica::DOM::DOMImplementation domFactory = Arabica::SimpleDOM::DOMImplementation::getDOMImplementation(); + Document doc = domFactory.createDocument(nameSpace, "", 0); + Element mmiElem = doc.createElementNS(nameSpace, "mmi"); + 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); + + Arabica::SAX2DOM::Parser 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); + } + + mmiElem.appendChild(msgElem); + doc.appendChild(mmiElem); + std::cout << doc; + return doc; +} + +Arabica::DOM::Document ContextualizedRequest::toXML() { + Document doc = MMIMessage::toXML(); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + msgElem.setAttributeNS(nameSpace, "Context", context); + return doc; +} + +Arabica::DOM::Document ContentRequest::toXML() { + Document doc = ContextualizedRequest::toXML(); + 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() { + Document doc = ContextualizedRequest::toXML(); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + msgElem.setAttributeNS(nameSpace, "Name", name); + return doc; +} + +Arabica::DOM::Document StatusResponse::toXML() { + Document doc = ContextualizedRequest::toXML(); + 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() { + Document doc = StatusResponse::toXML(); + 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() { + Document doc = ContextualizedRequest::toXML(); + Element msgElem = Element(doc.getDocumentElement().getFirstChild()); + + if (automaticUpdate) { + msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "true"); + } else { + msgElem.setAttributeNS(nameSpace, "RequestAutomaticUpdate", "false"); + } + + return doc; +} + +MMIMessage MMIMessage::fromXML(const Arabica::DOM::Document& doc) { + MMIMessage msg; + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + Element msgElem(node); + msg.source = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Source"); + msg.target = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Target"); +// msg.data = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Data"); + msg.requestId = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "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(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) { + ss << node; + break; + } + node = node.getNextSibling(); + } + msg.data = ss.str(); + } + + return msg; +} + +ContextualizedRequest ContextualizedRequest::fromXML(const Arabica::DOM::Document& doc) { + ContextualizedRequest msg(NewContextRequest::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + Element msgElem(node); + msg.context = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Context"); + return msg; +} + +ContentRequest ContentRequest::fromXML(const Arabica::DOM::Document& doc) { + ContentRequest msg(ContextualizedRequest::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + 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 = contentElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "href"); + msg.contentURL.maxAge = contentElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "max-age"); + msg.contentURL.fetchTimeout = contentElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "fetchtimeout"); + } + } + + //msg.content = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Context"); + return msg; +} + +ExtensionNotification ExtensionNotification::fromXML(const Arabica::DOM::Document& doc) { + ExtensionNotification msg(ContextualizedRequest::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + Element msgElem(node); + msg.name = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "Name"); + return msg; +} + +StatusResponse StatusResponse::fromXML(const Arabica::DOM::Document& doc) { + StatusResponse msg(ContextualizedRequest::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + Element msgElem(node); + std::string status = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "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; + } + return msg; +} + +StatusInfoResponse StatusInfoResponse::fromXML(const Arabica::DOM::Document& doc) { + StatusInfoResponse msg(StatusResponse::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + 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(const Arabica::DOM::Document& doc) { + StatusRequest msg(ContextualizedRequest::fromXML(doc)); + Node node = doc.getDocumentElement().getFirstChild(); + while (node) { + if (node.getNodeType() == Node_base::ELEMENT_NODE) + break; + node = node.getNextSibling(); + } + Element msgElem(node); + std::string autoUpdate = msgElem.getAttributeNS("http://www.w3.org/2008/04/mmi-arch", "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; + } + 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 new file mode 100644 index 0000000..af31efe --- /dev/null +++ b/src/uscxml/plugins/ioprocessor/modality/MMIMessages.h @@ -0,0 +1,280 @@ +#ifndef MMIMESSAGES_H_OS0SE7H5 +#define MMIMESSAGES_H_OS0SE7H5 + +#include +#include + +namespace uscxml { + +class MMIMessage { +public: + virtual Arabica::DOM::Document toXML(); + static MMIMessage fromXML(const Arabica::DOM::Document& doc); + + std::string source; + std::string target; + std::string data; + std::string requestId; + std::string tagName; + + static std::string nameSpace; + +protected: + MMIMessage() {} +}; + +class NewContextRequest : public MMIMessage { +public: + NewContextRequest() { + tagName = "NewContextRequest"; + } + NewContextRequest(const MMIMessage& father) : MMIMessage(father) {} + static NewContextRequest fromXML(const Arabica::DOM::Document& doc) { + return MMIMessage::fromXML(doc); + } + +}; + +class ContextualizedRequest : public NewContextRequest { +public: + virtual Arabica::DOM::Document toXML(); + static ContextualizedRequest fromXML(const Arabica::DOM::Document& doc); + + std::string context; +protected: + ContextualizedRequest() {} + ContextualizedRequest(const NewContextRequest& father) : NewContextRequest(father) {} +}; + +class PauseRequest : public ContextualizedRequest { +public: + PauseRequest() { + tagName = "PauseRequest"; + } + PauseRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static PauseRequest fromXML(const Arabica::DOM::Document& doc) { + return ContextualizedRequest::fromXML(doc); + } +}; +class ResumeRequest : public ContextualizedRequest { +public: + ResumeRequest() { + tagName = "ResumeRequest"; + } + ResumeRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static ResumeRequest fromXML(const Arabica::DOM::Document& doc) { + return ContextualizedRequest::fromXML(doc); + } + +}; +class CancelRequest : public ContextualizedRequest { +public: + CancelRequest() { + tagName = "CancelRequest"; + } + CancelRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static CancelRequest fromXML(const Arabica::DOM::Document& doc) { + return ContextualizedRequest::fromXML(doc); + } + +}; +class ClearContextRequest : public ContextualizedRequest { +public: + ClearContextRequest() { + tagName = "ClearContextRequest"; + } + ClearContextRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + static ClearContextRequest fromXML(const Arabica::DOM::Document& doc) { + return ContextualizedRequest::fromXML(doc); + } + +}; +class StatusRequest : public ContextualizedRequest { +public: + StatusRequest() { + tagName = "StatusRequest"; + } + virtual Arabica::DOM::Document toXML(); + static StatusRequest fromXML(const Arabica::DOM::Document& doc); + + 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(); + static ContentRequest fromXML(const Arabica::DOM::Document& doc); + std::string content; + ContentURL contentURL; +protected: + ContentRequest() {} + ContentRequest(const ContextualizedRequest& father) : ContextualizedRequest(father) {} +}; + +class PrepareRequest : public ContentRequest { +public: + PrepareRequest() { + tagName = "PrepareRequest"; + } + PrepareRequest(const ContentRequest& father) : ContentRequest(father) {} + static PrepareRequest fromXML(const Arabica::DOM::Document& doc) { + return ContentRequest::fromXML(doc); + } +}; + +class StartRequest : public ContentRequest { +public: + StartRequest() { + tagName = "StartRequest"; + } + StartRequest(const ContentRequest& father) : ContentRequest(father) {} + static StartRequest fromXML(const Arabica::DOM::Document& doc) { + return ContentRequest::fromXML(doc); + } + +}; + +class ExtensionNotification : public ContextualizedRequest { +public: + ExtensionNotification() { + tagName = "ExtensionNotification"; + } + virtual Arabica::DOM::Document toXML(); + static ExtensionNotification fromXML(const Arabica::DOM::Document& doc); + + 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"; + } + virtual Arabica::DOM::Document toXML(); + static StatusResponse fromXML(const Arabica::DOM::Document& doc); + Status status; +protected: + StatusResponse(const ContextualizedRequest& father) : ContextualizedRequest(father) {} + +}; + +class StatusInfoResponse : public StatusResponse { +public: + virtual Arabica::DOM::Document toXML(); + static StatusInfoResponse fromXML(const Arabica::DOM::Document& doc); + std::string statusInfo; +protected: + StatusInfoResponse() {} + StatusInfoResponse(const StatusResponse& father) : StatusResponse(father) {} +}; + +class PrepareResponse : public StatusInfoResponse { +public: + PrepareResponse() { + tagName = "PrepareResponse"; + } + PrepareResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static PrepareResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class StartResponse : public StatusInfoResponse { +public: + StartResponse() { + tagName = "StartResponse"; + } + StartResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static StartResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class CancelResponse : public StatusInfoResponse { +public: + CancelResponse() { + tagName = "CancelResponse"; + } + CancelResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static CancelResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class PauseResponse : public StatusInfoResponse { +public: + PauseResponse() { + tagName = "PauseResponse"; + } + PauseResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static PauseResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class ResumeResponse : public StatusInfoResponse { +public: + ResumeResponse() { + tagName = "ResumeResponse"; + } + ResumeResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static ResumeResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class ClearContextResponse : public StatusInfoResponse { +public: + ClearContextResponse() { + tagName = "ClearContextResponse"; + } + ClearContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static ClearContextResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +class NewContextResponse : public StatusInfoResponse { +public: + NewContextResponse() { + tagName = "NewContextResponse"; + } + NewContextResponse(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static NewContextResponse fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } + +}; + +class DoneNotification : public StatusInfoResponse { +public: + DoneNotification() { + tagName = "DoneNotification"; + } + DoneNotification(const StatusInfoResponse& father) : StatusInfoResponse(father) {} + static DoneNotification fromXML(const Arabica::DOM::Document& doc) { + return StatusInfoResponse::fromXML(doc); + } +}; + +} + +#endif /* end of include guard: MMIMESSAGES_H_OS0SE7H5 */ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7439abc..0bf8065 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -58,6 +58,11 @@ target_link_libraries(test-url uscxml) add_test(test-url ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-url) set_target_properties(test-url PROPERTIES FOLDER "Tests") +add_executable(test-mmi src/test-mmi.cpp) +target_link_libraries(test-mmi uscxml) +add_test(test-url ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-mmi) +set_target_properties(test-mmi PROPERTIES FOLDER "Tests") + add_executable(scxml-test-framework-client src/scxml-test-framework-client.cpp) target_link_libraries(scxml-test-framework-client uscxml) diff --git a/test/src/test-mmi.cpp b/test/src/test-mmi.cpp new file mode 100644 index 0000000..1b5702b --- /dev/null +++ b/test/src/test-mmi.cpp @@ -0,0 +1,475 @@ +#include "uscxml/plugins/ioprocessor/modality/MMIMessages.h" + +#include +#include +#include + +#include +#include +#include + +using namespace uscxml; +using namespace boost; + +Arabica::DOM::Document xmlToDoc(const std::string& xml) { + std::stringstream* ss = new std::stringstream(); + (*ss) << xml; + std::auto_ptr ssPtr(ss); + Arabica::SAX::InputSource inputSource; + inputSource.setByteStream(ssPtr); + + Arabica::SAX2DOM::Parser parser; + parser.parse(inputSource); + return parser.getDocument(); +} + +int main(int argc, char** argv) { + { // --- NewContextRequest + std::stringstream ss; + ss << ""; + NewContextRequest msg = NewContextRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "NewContextRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.data, "")); + + NewContextRequest msg2 = NewContextRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "NewContextRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.data, "")); + } + + { // --- NewContextResponse + std::stringstream ss; + ss << " "; + NewContextResponse msg = NewContextResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "NewContextResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(msg.status == StatusResponse::SUCCESS); + assert(boost::iequals(msg.statusInfo, "")); + assert(boost::iequals(msg.context, "URI-1")); + assert(boost::iequals(msg.data, "")); + + NewContextResponse msg2 = NewContextResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "NewContextResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(msg2.status == StatusResponse::SUCCESS); + assert(boost::iequals(msg2.statusInfo, "")); + assert(boost::iequals(msg2.context, "URI-1")); + assert(boost::iequals(msg2.data, "")); + + } + + { // --- PrepareRequest + std::stringstream ss; + ss << " "; + PrepareRequest msg = PrepareRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PrepareRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "URI-1")); + assert(boost::iequals(msg.data, "")); + assert(boost::iequals(msg.content, "")); + assert(boost::iequals(msg.contentURL.href, "someContentURI")); + assert(boost::iequals(msg.contentURL.maxAge, "")); + assert(boost::iequals(msg.contentURL.fetchTimeout, "1s")); + + PrepareRequest msg2 = PrepareRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PrepareRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "URI-1")); + assert(boost::iequals(msg2.data, "")); + assert(boost::iequals(msg2.content, "")); + assert(boost::iequals(msg2.contentURL.href, "someContentURI")); + assert(boost::iequals(msg2.contentURL.maxAge, "")); + assert(boost::iequals(msg2.contentURL.fetchTimeout, "1s")); + + } + + { // --- PrepareRequest + std::stringstream ss; + ss << " Hello World! "; + PrepareRequest msg = PrepareRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PrepareRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "URI-1")); + assert(msg.content.size() > 0); + + PrepareRequest msg2 = PrepareRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PrepareRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "URI-1")); + assert(msg2.content.size() > 0); + + } + + { // --- PrepareResponse + std::stringstream ss; + ss << " "; + PrepareResponse msg = PrepareResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PrepareResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.status == StatusResponse::SUCCESS); + + PrepareResponse msg2 = PrepareResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PrepareResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- PrepareResponse + std::stringstream ss; + ss << " NotAuthorized "; + PrepareResponse msg = PrepareResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PrepareResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(boost::iequals(msg.statusInfo, " NotAuthorized ")); + assert(msg.status == StatusResponse::FAILURE); + + PrepareResponse msg2 = PrepareResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PrepareResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(boost::iequals(msg2.statusInfo, " NotAuthorized ")); + assert(msg2.status == StatusResponse::FAILURE); + + } + + { // --- StartRequest + std::stringstream ss; + ss << " "; + StartRequest msg = StartRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "StartRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "URI-1")); + + StartRequest msg2 = StartRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "StartRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "URI-1")); + + } + + { // --- StartResponse + std::stringstream ss; + ss << " NotAuthorized "; + StartResponse msg = StartResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "StartResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(boost::iequals(msg.statusInfo, " NotAuthorized ")); + assert(msg.status == StatusResponse::FAILURE); + + StartResponse msg2 = StartResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "StartResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(boost::iequals(msg2.statusInfo, " NotAuthorized ")); + assert(msg2.status == StatusResponse::FAILURE); + + } + + { // --- DoneNotification + std::stringstream ss; + ss << " Boston Denver "; + DoneNotification msg = DoneNotification::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "DoneNotification")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.data.size() > 0); + assert(msg.status == StatusResponse::SUCCESS); + + DoneNotification msg2 = DoneNotification::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "DoneNotification")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.data.size() > 0); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- DoneNotification + std::stringstream ss; + ss << " "; + DoneNotification msg = DoneNotification::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "DoneNotification")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.data.size() > 0); + assert(msg.status == StatusResponse::SUCCESS); + + DoneNotification msg2 = DoneNotification::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "DoneNotification")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.data.size() > 0); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- CancelRequest + std::stringstream ss; + ss << " "; + CancelRequest msg = CancelRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "CancelRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + + CancelRequest msg2 = CancelRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "CancelRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + + } + + { // --- CancelResponse + std::stringstream ss; + ss << " "; + CancelResponse msg = CancelResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "CancelResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.status == StatusResponse::SUCCESS); + + CancelResponse msg2 = CancelResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "CancelResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- PauseRequest + std::stringstream ss; + ss << " "; + PauseRequest msg = PauseRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PauseRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + + PauseRequest msg2 = PauseRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PauseRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + + } + + { // --- PauseResponse + std::stringstream ss; + ss << " "; + PauseResponse msg = PauseResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "PauseResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.status == StatusResponse::SUCCESS); + + PauseResponse msg2 = PauseResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "PauseResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- ResumeRequest + std::stringstream ss; + ss << " "; + ResumeRequest msg = ResumeRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "ResumeRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + + ResumeRequest msg2 = ResumeRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "ResumeRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + + } + + { // --- ResumeResponse + std::stringstream ss; + ss << " "; + ResumeResponse msg = ResumeResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "ResumeResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.status == StatusResponse::SUCCESS); + + ResumeResponse msg2 = ResumeResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "ResumeResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- ExtensionNotification + std::stringstream ss; + ss << " "; + ExtensionNotification msg = ExtensionNotification::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "ExtensionNotification")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-1")); + assert(boost::iequals(msg.context, "someURI")); + assert(boost::iequals(msg.name, "appEvent")); + + ExtensionNotification msg2 = ExtensionNotification::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "ExtensionNotification")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-1")); + assert(boost::iequals(msg2.context, "someURI")); + assert(boost::iequals(msg2.name, "appEvent")); + + } + + { // --- ClearContextRequest + std::stringstream ss; + ss << " "; + ClearContextRequest msg = ClearContextRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "ClearContextRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-2")); + assert(boost::iequals(msg.context, "someURI")); + + ClearContextRequest msg2 = ClearContextRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "ClearContextRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-2")); + assert(boost::iequals(msg2.context, "someURI")); + + } + + { // --- ClearContextResponse + std::stringstream ss; + ss << " "; + ClearContextResponse msg = ClearContextResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "ClearContextResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-2")); + assert(boost::iequals(msg.context, "someURI")); + assert(msg.status == StatusResponse::SUCCESS); + + ClearContextResponse msg2 = ClearContextResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "ClearContextResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-2")); + assert(boost::iequals(msg2.context, "someURI")); + assert(msg2.status == StatusResponse::SUCCESS); + + } + + { // --- StatusRequest + std::stringstream ss; + ss << " "; + StatusRequest msg = StatusRequest::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "StatusRequest")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-3")); + assert(boost::iequals(msg.context, "aToken")); + assert(msg.automaticUpdate); + + StatusRequest msg2 = StatusRequest::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "StatusRequest")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-3")); + assert(boost::iequals(msg2.context, "aToken")); + assert(msg2.automaticUpdate); + + } + + { // --- StatusResponse + std::stringstream ss; + ss << " "; + StatusResponse msg = StatusResponse::fromXML(xmlToDoc(ss.str())); + assert(boost::iequals(msg.tagName, "StatusResponse")); + assert(boost::iequals(msg.source, "someURI")); + assert(boost::iequals(msg.target, "someOtherURI")); + assert(boost::iequals(msg.requestId, "request-3")); + assert(boost::iequals(msg.context, "aToken")); + assert(msg.status == StatusResponse::ALIVE); + + StatusResponse msg2 = StatusResponse::fromXML(msg.toXML()); + assert(boost::iequals(msg2.tagName, "StatusResponse")); + assert(boost::iequals(msg2.source, "someURI")); + assert(boost::iequals(msg2.target, "someOtherURI")); + assert(boost::iequals(msg2.requestId, "request-3")); + assert(boost::iequals(msg2.context, "aToken")); + assert(msg2.status == StatusResponse::ALIVE); + + } + +} \ No newline at end of file diff --git a/test/src/test-url.cpp b/test/src/test-url.cpp index c889f86..cd11ac5 100644 --- a/test/src/test-url.cpp +++ b/test/src/test-url.cpp @@ -46,6 +46,15 @@ int main(int argc, char** argv) { exeName = exeName.substr(exeName.find_last_of("\\/") + 1); { + Interpreter interpreter = Interpreter::fromURI("/Users/sradomski/Desktop/application_small.scxml"); + assert(interpreter); + std::vector states; + states.push_back("b"); + interpreter.setConfiguration(states); + interpreter.interpret(); + } + + { URL url(argv[0]); assert(canResolve(argv[0])); assert(canResolve(url.asString())); @@ -55,12 +64,6 @@ int main(int argc, char** argv) { exeUrl.toAbsolute(baseUrl); assert(canResolve(exeUrl.asString())); } - - { -// Interpreter interpreter = Interpreter::fromURI("https://raw.github.com/tklab-tud/uscxml/master/test/samples/uscxml/test-execution.scxml"); -// assert(interpreter); -// interpreter.interpret(); - } { TestServlet* testServlet1 = new TestServlet(false); -- cgit v0.12