123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*
- * ctkNetworkConnectorQtSoap.cpp
- * ctkEventBus
- *
- * Created by Daniele Giunchi on 14/07/10.
- * Copyright 2009 B3C. All rights reserved.
- *
- * See Licence at: http://tiny.cc/QXJ4D
- *
- */
- #include "ctkNetworkConnectorQtSoap.h"
- #include "ctkEventBusManager.h"
- #include <service/event/ctkEvent.h>
- using namespace ctkEventBus;
- ctkNetworkConnectorQtSoap::ctkNetworkConnectorQtSoap() : ctkNetworkConnector(), m_Http(NULL), m_WSDLUrl(""),m_Response(NULL) {
- m_Protocol = "SOAP";
- }
- ctkNetworkConnectorQtSoap::~ctkNetworkConnectorQtSoap() {
- if(m_Http) {
- delete m_Http;
- }
- }
- ctkNetworkConnector *ctkNetworkConnectorQtSoap::clone() {
- ctkNetworkConnectorQtSoap *copy = new ctkNetworkConnectorQtSoap();
- return copy;
- }
- void ctkNetworkConnectorQtSoap::initializeForEventBus() {
- ctkRegisterRemoteSignal("ctk/remote/eventBus/comunication/soap", this, "remoteCommunication(const QString, ctkEventArgumentsList *)");
- ctkRegisterRemoteCallback("ctk/remote/eventBus/comunication/soap", this, "send(const QString, ctkEventArgumentsList *)");
- }
- void ctkNetworkConnectorQtSoap::registerServerMethod(QString methodName, QList<QVariant::Type> types) {
- m_RegisterMethodsMap.insert(methodName, types);
- }
- void ctkNetworkConnectorQtSoap::createClient(const QString hostName, const unsigned int port) {
- if(m_Http == NULL) {
- m_Http = new QtSoapHttpTransport();
- QObject::connect(m_Http, SIGNAL(responseReady()), this, SLOT(retrieveRemoteResponse()));
- }
- //maf3 service registration
- QList<QVariant::Type> parametersForRegisterteredFunction;
- parametersForRegisterteredFunction.append(QVariant::String); //return argument
- parametersForRegisterteredFunction.append(QVariant::List); //parameters to send, event control parameters
- parametersForRegisterteredFunction.append(QVariant::List); //parameters to send, data parameters
- //registration of the method REMOTE_COMMUNICATION_SOAP at Soap level
- // this method need to reflect the name of the action of the service while QVariant::List are list of
- // strings, in which each string represent the correct name of the parameter in the sevice function.
- registerServerMethod("testArray", parametersForRegisterteredFunction);
- //
- // Construct a method request message.
- //ARRAY TEST
- //QtSoapArray arr(QtSoapQName("arr", ""), QtSoapType::String, 2);
- //arr.insert(0, new QtSoapSimpleType(QtSoapQName("name"), "First"));
- //arr.insert(1, new QtSoapSimpleType(QtSoapQName("surName"), "Second"));
- //exp
- /*QtSoapArray arrEvent(QtSoapQName("arrEvent", ""), QtSoapType::String, 2);
- arrEvent.insert(0, new QtSoapSimpleType(QtSoapQName("n1"), "eventA1"));
- arrEvent.insert(1, new QtSoapSimpleType(QtSoapQName("n2"), "eventA2"));
- QtSoapArray arrData(QtSoapQName("arrData", ""), QtSoapType::String, 2);
- arrData.insert(0, new QtSoapSimpleType(QtSoapQName("d1"), "dataA1"));
- arrData.insert(1, new QtSoapSimpleType(QtSoapQName("d2"), "dataA2"));*/
- //end exp
- m_Http->setHost(hostName, false, port);
- //ARRAY TEST
- // Set the method and add one argument.
- /*request.setMethod("algorithmSIBA");
- request.addMethodArgument("input", "", "input.aim");
- request.addMethodArgument("output", "", "output.aim");
-
- request.addMethodArgument("gaussian", "", "0.42");
- request.addMethodArgument("load", "", "8");
- request.addMethodArgument("iteration", "", "40");
-
- qDebug() << request.toXmlString();
- // Submit the request the the web service.
- m_Http->setHost("localhost", false, 7889);
- m_Http->setAction("algorithmSIBA");*/
- //m_Http->submitRequest(m_Request, "http://localhost:7889/HelloWordService?wsdl");
- // Set the method and add one argument.
- /*request.setMethod("getPopulation", "http://www.abundanttech.com/WebServices/Population");
- request.addMethodArgument("strCountry", "", "Italy");
- // Submit the request the the web service.
- m_Http->setHost("www.abundanttech.com");
- m_Http->setAction("http://www.abundanttech.com/WebServices/Population/getPopulation");
- m_Http->submitRequest(request, "/WebServices/Population/population.asmx");*/
- qDebug("retrieve value...");
-
- }
- void ctkNetworkConnectorQtSoap::createServer(const unsigned int port) {
- Q_UNUSED(port);
- qDebug() << tr("QtSoap doesn't support server side implementation.").toLatin1();
- }
- void ctkNetworkConnectorQtSoap::stopServer() {
- qDebug() << tr("QtSoap doesn't support server side implementation.").toLatin1();
- }
- void ctkNetworkConnectorQtSoap::startListen() {
- qDebug() << tr("QtSoap doesn't support server side implementation.").toLatin1();
- }
- QtSoapType *ctkNetworkConnectorQtSoap::marshall(const QString name, const QVariant ¶meter) {
- QtSoapType *returnValue = NULL;
- switch( parameter.type() ){
- case QVariant::Int:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), QString::number(parameter.toInt()));
- break;
- case QVariant::UInt:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), QString::number(parameter.toUInt()));
- break;
- case QVariant::LongLong:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), QString::number(parameter.toLongLong()));
- break;
- case QVariant::ULongLong:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), QString::number(parameter.toULongLong()));
- break;
- case QVariant::Double:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), QString::number(parameter.toDouble()));
- break;
- case QVariant::Bool:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toBool()?"True":"False");
- break;
- case QVariant::Date:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toDate().toString());
- break;
- case QVariant::DateTime:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toDateTime().toString());
- break;
- case QVariant::Time:
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toTime().toString());
- break;
- case QVariant::StringList:
- case QVariant::List: {
- QtSoapArray *arr = new QtSoapArray(QtSoapQName(name, ""), QtSoapType::String, parameter.toList().size());
- int index = 0;
- foreach( QVariant item, parameter.toList() ) {
- arr->insert(index, marshall(QString("Elem_").append(QString::number(index)), item ));
- index++;
- }
- returnValue = arr;
- break;
- }
- case QVariant::Map: {
- QMap<QString, QVariant> map = parameter.toMap();
- QMap<QString, QVariant>::ConstIterator iter = map.begin();
- QtSoapArray *arr = new QtSoapArray(QtSoapQName(name, ""), QtSoapType::String, parameter.toMap().size());
- int index = 0;
- while( iter != map.end() ) {
- arr->insert(index, marshall(iter.key(), *iter));
- ++iter;
- index++;
- }
- returnValue = arr;
- break;
- }
- case QVariant::Hash: {
- QHash<QString, QVariant> hash = parameter.toHash();
- QHash<QString, QVariant>::ConstIterator iter = hash.begin();
- QtSoapArray *arr = new QtSoapArray(QtSoapQName(name, ""), QtSoapType::String, parameter.toHash().size());
- int index = 0;
- while( iter != hash.end() ) {
- arr->insert(index, marshall(iter.key(), *iter));
- ++iter;
- index++;
- }
- returnValue = arr;
- break;
- }
- case QVariant::ByteArray: {
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toByteArray().data());
- break;
- }
- default: {
- if( parameter.canConvert(QVariant::String) ) {
- returnValue = new QtSoapSimpleType(QtSoapQName(name), parameter.toString());
- }
- else {
- //self representation?
- }
- break;
- }
- }
- //ENSURE(returnValue != NULL);
- return returnValue;
- }
- void ctkNetworkConnectorQtSoap::send(const QString methodName, ctkEventArgumentsList *argList) {
- //REQUIRE(!params->at(0).isNull());
- //REQUIRE(params->at(0).canConvert(QVariant::Hash) == true);
- QString type = argList->at(0).name();
- if(argList == NULL || type != "ctkEventHash") {
- qDebug() << "NULL or invalid argument, nothing to send!";
- return;
- }
- m_Request.clear();
- m_Request.setMethod(methodName);
- ctkEventHash *values;
- values = reinterpret_cast<ctkEventHash *> (argList->at(0).data());
- int i = 0, size = values->size();
- for(;i<size;i++) {
- m_Request.addMethodArgument(marshall(values->keys().at(i), values->values().at(i)));
- }
- qDebug() << m_Request.toXmlString();
- // Submit the request the the web service.
- m_Http->setAction(m_Action);
- m_Http->submitRequest(m_Request, m_Path);
- }
- void ctkNetworkConnectorQtSoap::retrieveRemoteResponse()
- {
- // Get a reference to the response message.
- const QtSoapMessage &message = m_Http->getResponse();
- qDebug() << message.toXmlString();
- // Check if the response is a SOAP Fault message
- if (message.isFault()) {
- qDebug("Error: %s", message.faultString().value().toString().toLatin1().constData());
- m_Response = NULL;
- }
- else {
- // Get the return value, and print the result.
- m_Response = const_cast<QtSoapType *>( &(message.returnValue()));
- }
- }
- /*
- void ctkNetworkConnectorQtSoap::processReturnValue( int requestId, QVariant value ) {
- Q_UNUSED( requestId );
- Q_ASSERT( value.canConvert( QVariant::String ) );
- qDebug("%s", value.toString().toLatin1().data());
- ctkEventBusManager::instance()->notifyEvent("ctk/local/eventBus/remoteCommunicationDone", ctkEventTypeLocal);
- }
- void ctkNetworkConnectorQtSoap::processFault( int requestId, int errorCode, QString errorString ) {
- // Log the error.
- qDebug("%s", tr("Process Fault for requestID %1 with error %2 - %3").arg(QString::number(requestId), QString::number(errorCode), errorString).toLatin1().data());
- ctkEventBusManager::instance()->notifyEvent("ctk/local/eventBus/remoteCommunicationFailed", ctkEventTypeLocal);
- }
- void ctkNetworkConnectorQtSoap::processRequest( int requestId, QString methodName, QList<xmlrpc::Variant> parameters ) {
- Q_UNUSED( methodName );
- REQUIRE(parameters.count() >= 2);
- //first parameter is ctkEventBus message
- enum {
- EVENT_PARAMETERS,
- DATA_PARAMETERS,
- };
- enum {
- EVENT_ID,
- EVENT_ITEM_TYPE,
- EVENT_SIGNATURE_TYPE,
- EVENT_METHOD_SIGNATURE,
- };
- if(parameters.at(EVENT_PARAMETERS).toList().count() == 0) {
- m_Server->sendReturnValue( requestId, QString("No Command to Execute, command list is empty") );
- }
- //here eventually can be used a filter for events
- //first argument regards local signal to be called.
- QString id_name = parameters.at(EVENT_PARAMETERS).toList().at(EVENT_ID).toString();
- int size = parameters.count();
- ctkEventArgumentsList *argList = NULL;
- mafList<QVariant> *p = & (parameters.at(1).value< mafList<QVariant> >());
- if(size > 1 && p->count() != 0) {
- argList = new ctkEventArgumentsList();
- argList->push_back(Q_ARG(mafList<QVariant>, *p));
- }
- if ( ctkEventBusManager::instance()->isLocalSignalPresent(id_name) ) {
- ctkBusEvent dictionary;
- mafCore::mafId id = mafCore::mafIdProvider::instance()->idValue(id_name);
- dictionary.setEventId(id);
- dictionary.setEventType(ctkEventTypeLocal);
- ctkEventBusManager::instance()->notifyEvent(dictionary, argList);
- m_Server->sendReturnValue( requestId, QString("OK") );
- } else {
- m_Server->sendReturnValue( requestId, QString("FAIL") );
- }
- mafDEL(argList);
- }*/
|