hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidgetradioserviceclient.cpp
changeset 19 afea38384506
parent 16 f54ebcfc1b80
--- a/hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidgetradioserviceclient.cpp	Mon May 03 12:31:41 2010 +0300
+++ b/hswidgetplugin/fmradiohswidgetplugin/src/fmradiohswidgetradioserviceclient.cpp	Fri May 14 15:52:32 2010 +0300
@@ -29,9 +29,10 @@
  */
 FmRadioHsWidgetRadioServiceClient::FmRadioHsWidgetRadioServiceClient(QObject *parent) :
     QObject(parent),
-    mRadioInformationServiceRequest( 0 ),
-    mRadioControlServiceRequest(0),
-    mDataInitialized( false )
+    mRequestPending(false),
+    mRadioMonitorRequest(0),
+    mRadioControlRequest(0),
+    mDataInitialized(false)
 {
 }
 
@@ -50,73 +51,366 @@
 {
     const bool radioIsRunning = false; //TODO: Find out if radio is running. Use P&S key for now
     if ( radioIsRunning ) {
-        startMonitoring();
+        //startMonitoring();
     }
 }
 
 
 /*!
  Starting of FM Radio.
-
- /param startupState
+ 
+ /param startupState 
  */
+/*
 void FmRadioHsWidgetRadioServiceClient::doStartFmRadio(FmRadioStartupState startupState)
 {
-    createControlServiceRequest();
+    if (!mRadioControlRequest) {
+        createControlServiceRequest();
+    }
 
-    int commandId = 0;
-
+    QVariant commandArgument;
     switch (startupState) {
     case StartForeground:
         // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Foreground*/ 6;
-        break;
+        commandArgument.setValue(*//*RadioServiceCommand::Foreground*/ //6);
+/*        break;
     case StartBackground:
         // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Background*/ 7;
+        commandArgument.setValue(*//*RadioServiceCommand::Background*/ //7);
+/*        break;
+    default:
+        break;
+    }
+    QList<QVariant> arguments;
+    arguments.append(commandArgument);
+    mRadioControlRequest->setArguments(arguments);
+
+    bool res = mRadioControlRequest->send();
+}
+*/
+/*!
+ Bring FM Radio to foreground.
+ 
+ */
+void FmRadioHsWidgetRadioServiceClient::doChangeFmRadioVisibility(FmRadioVisibilty visibility)
+{
+    QVariant commandArgument;
+    switch (visibility) {
+    case ToForeground:
+        commandArgument.setValue((int) RadioServiceCommand::Foreground);
+        break;
+    case ToBackground:
+        commandArgument.setValue((int) RadioServiceCommand::Background);
+    case DoNotChange:
+    default:
+        break;
+    }
+    doSendControlRequest(commandArgument, visibility);
+}
+
+/*!
+ Changing of FM Radio channel.
+ 
+ /param command Command to execute.
+ */
+void FmRadioHsWidgetRadioServiceClient::doChangeFmRadioChannel(
+    FmRadioChannelChangeCommand command)
+{
+    QVariant commandArgument;
+    switch (command) {
+    case PreviousFavouriteChannel:
+        commandArgument.setValue((int) RadioServiceCommand::Previous);
+        break;
+    case NextFavouriteChannel:
+        commandArgument.setValue((int) RadioServiceCommand::Next);
+        break;
+    default:
+        break;
+    }
+    doSendControlRequest(commandArgument, DoNotChange);
+}
+
+/*!
+ Changing of FM Radio channel.
+ 
+ /param command Command to execute.
+ */
+void FmRadioHsWidgetRadioServiceClient::doControlFmRadioAudio(
+    FmRadioAudioControlCommand command)
+{
+    QVariant commandArgument;
+    switch (command) {
+    case Mute:
+        commandArgument.setValue((int) RadioServiceCommand::Pause);
+        break;
+    case Unmute:
+        commandArgument.setValue((int) RadioServiceCommand::Play);
         break;
     default:
         break;
     }
-    
-    QVariant commandArgument;
-    commandArgument.setValue(commandId);
+    doSendControlRequest(commandArgument, DoNotChange);
+}
+
+/*!
+ Start FM Radio information listening.
+ */
+void FmRadioHsWidgetRadioServiceClient::doSendControlRequest(QVariant &argument,
+    FmRadioVisibilty visibility)
+{
+    if (!mRadioControlRequest) {
+        createControlServiceRequest();
+    }
+
     QList<QVariant> arguments;
-    arguments.append(commandArgument);
-    mRadioControlServiceRequest->setArguments(arguments);
+    arguments.append(argument);
+    mRadioControlRequest->setArguments(arguments);
+    
+    prepareRequestInfo(mRadioControlRequest, visibility);
+
+    bool res = mRadioControlRequest->send();
+
+    if (!res) {
+        int error = mRadioControlRequest->lastError();
+        handleRequestError(error);
+    }
+    
+    //stopMonitoring();
+    //startMonitoring();
+}
+
+/*!
+ Start FM Radio information listening.
+ */
+void FmRadioHsWidgetRadioServiceClient::doSendMonitorRequest(FmRadioVisibilty visibility)
+{
+    prepareRequestInfo(mRadioMonitorRequest, visibility);
+    if (!mRequestPending) {
+        //FmRadioHsWidgetRadioServiceSingleton::instance()->sendRequest();
+        mRequestPending = mRadioMonitorRequest->send();
+    }
+}
+
+/*!
+ Handle changes in FM Radio information texts.
+ 
+ /param value
+ */
+void FmRadioHsWidgetRadioServiceClient::handleFmRadioInformationChange(const QVariant& value)
+{
+    mRequestPending = false;
+    if (!mDataInitialized) {
+        mRadioMonitorRequest->setOperation(KRadioServiceMonitorOperation);
+        mDataInitialized = true;
+    }
+    startMonitoring(DoNotChange);
+    if ( value.isValid() && value.canConvert( QVariant::List ) ) {
+        QVariantList notificationList = value.toList();
+        foreach ( const QVariant& variant, notificationList ) {
+            RadioNotificationData notification = variant.value<RadioNotificationData>();
+            const int notificationId = notification.mType;
+            emit radioInformationChanged( notificationId, notification.mData );
+        }
+    }
+}
 
-    bool res = mRadioControlServiceRequest->send();
+/*!
+ Handles request error.
+ 
+ /param int Error value.
+ */
+void FmRadioHsWidgetRadioServiceClient::handleRequestError(int error)
+{
+    QString errorStr;
+    QVariant var(FmRadioHsWidget::NotRunning);
+    switch (error) {
+    case XQService::ENoError:
+        errorStr = "No error";
+        break;
+    case XQService::EConnectionError:
+        errorStr = "(/*!< Error in IPC Connection */";
+        break;
+    case XQService::EConnectionClosed:
+        errorStr = "/*!< IPC Connection is closed */";
+        stopMonitoring();
+        handleFmRadioStateChange(var);
+        break;
+    case XQService::EServerNotFound:
+        errorStr = "/*!< Can not find server */";
+        break;
+    case XQService::EIPCError:
+        errorStr = "/*!< Known IPC error defined by SDK */";
+        break;
+    case XQService::EUnknownError:
+        errorStr = "/*!< Unknown IPC error */";
+        break;
+    case XQService::ERequestPending:
+        errorStr = "/*!< Already pending request */";
+        break;
+    default:
+        break;
+    }
+}
+
+/*!
+ Handle changes in FM Radio state.
+ 
+ /param value New state of FM Radio.
+ */
+void FmRadioHsWidgetRadioServiceClient::handleFmRadioStateChange(QVariant& value)
+{
+    if (value.isValid()) {
+        emit radioStateChanged(value);
+    }
+}
+
+/*!
+ Handle request completion.
+ 
+ /param value
+ */
+void FmRadioHsWidgetRadioServiceClient::requestCompleted(const QVariant& value)
+{
+    if (value.isValid()) {
+    }
 }
 
 /*!
- Bring FM Radio to foreground.
+ Handle error.
  
+ /param errorCode
+ /param errorMessage
  */
-void FmRadioHsWidgetRadioServiceClient::doBringFmRadioToForeground(bool toForeground)
+void FmRadioHsWidgetRadioServiceClient::handleError(int errorCode, const QString& errorMessage)
+{
+    int e = errorCode;
+    QString em = errorMessage;
+    handleRequestError(e);
+}
+
+/*!
+ Creates control service request object.
+ */
+void FmRadioHsWidgetRadioServiceClient::createControlServiceRequest()
 {
-    createControlServiceRequest();
-    QVariant commandArgument;
-    if (toForeground) {
-        // TODO: Include header and remove comment.
-        commandArgument.setValue(/*RadioServiceCommand::Foreground*/ 6);
-    } else {
-        // TODO: Include header and remove comment.
-        commandArgument.setValue(/*RadioServiceCommand::Background*/ 7);
+    if (!mRadioControlRequest) {
+        QString fullInterfaceName = /*KRadioServiceName +"."+*/ KRadioServiceControlInterfaceName;
+        mRadioControlRequest = mApplicationManager.create(fullInterfaceName,
+            KRadioServiceControlOperation, false);
+
+        if (mRadioControlRequest) {
+            mRadioControlRequest->setEmbedded(false);
+            mRadioControlRequest->setSynchronous(true);
+            //TODO: Do backgound set through XQRequestInfo in MCL wk14.
+            //mRadioControlRequest->setBackground(true);
+
+            /*
+            bool b = connect(mRadioControlRequest, SIGNAL(requestOk(const QVariant&)), this,
+                SLOT(requestCompleted(const QVariant&)));
+            bool t = connect(mRadioControlRequest, SIGNAL(requestError(int,const QString&)), this,
+                SLOT(handleError(int,const QString&)));
+            */
+        }
     }
-    QList<QVariant> arguments;
-    arguments.append(commandArgument);
-    mRadioControlServiceRequest->setArguments(arguments);
-    QList<QVariant> args = mRadioControlServiceRequest->arguments();
+}
 
-    bool res = mRadioControlServiceRequest->send();
+/*!
+ Creates monitor service request object.
+ */
+void FmRadioHsWidgetRadioServiceClient::createMonitorServiceRequest()
+{
+    if (!mRadioMonitorRequest) {
+		QString operation = mDataInitialized ? KRadioServiceMonitorOperation
+            : KRadioServiceRefreshOperation;
+        QString fullInterfaceName = /*KRadioServiceName +"."+*/ KRadioServiceMonitorInterfaceName;
+        
+        /*
+        QList<XQAiwInterfaceDescriptor> list;
+        list = mApplicationManager.list(KRadioServiceName, fullInterfaceName, "");
+        XQAiwInterfaceDescriptor interfaceDescriptor;
+        foreach (XQAiwInterfaceDescriptor d, list)
+            {
+                QString in = d.interfaceName();
+                QString sn = d.serviceName();
+                if (sn == KRadioServiceName && in == fullInterfaceName) {
+                    interfaceDescriptor = d;
+                }
+            }
+        */
+        
+        /*
+        mRadioMonitorRequest = mApplicationManager.create(interfaceDescriptor,
+            KRadioServiceMonitorOperation, false);
+        */
+
+        mRadioMonitorRequest = mApplicationManager.create(
+            fullInterfaceName, operation, false);
+
+        if (mRadioMonitorRequest) {
+            connect(mRadioMonitorRequest, SIGNAL(requestOk(const QVariant&)),
+                this, SLOT(handleFmRadioInformationChange(const QVariant&)));
+            connect(mRadioMonitorRequest,
+                SIGNAL(requestError(int,const QString&)), this,
+                SLOT(handleError(int,const QString&)));
+
+            mRadioMonitorRequest->setSynchronous(false);
+            mRadioMonitorRequest->setEmbedded(false);
+        }
+    }
+}
 
-    if (!res) {
-        int error = mRadioControlServiceRequest->latestError();
-        handleRequestError(error);
-        // TODO: Handle error
+/*!
+ Start radio monitoring.
+ */
+void FmRadioHsWidgetRadioServiceClient::startMonitoring(FmRadioVisibilty visibility)
+{
+    //FmRadioHsWidgetRadioServiceSingleton::instance(this)->requestNotifications(this);
+
+    if (!mRadioMonitorRequest) {
+        createMonitorServiceRequest();
+    }
+    doSendMonitorRequest(visibility);
+}
+
+/*!
+ Stops radio monitoring.
+ */
+void FmRadioHsWidgetRadioServiceClient::stopMonitoring()
+{
+    //FmRadioHsWidgetRadioServiceSingleton::instance(this)->cancelNotifications(this);
+
+    if (mRadioMonitorRequest) {
+        delete mRadioMonitorRequest;
+        mRadioMonitorRequest = NULL;
     }
-    stopMonitoring();
-    startMonitoring();
+    mRequestPending = false;
+    mDataInitialized = false;
+}
+
+/*!
+ Prepares the visibility of the request.
+ */
+void FmRadioHsWidgetRadioServiceClient::prepareRequestInfo(XQAiwRequest *request,
+    FmRadioVisibilty visibility)
+{
+    XQRequestInfo info;
+    switch (visibility) {
+    case ToForeground:
+        //info.setForeground(true);
+        break;
+    case ToBackground:
+        info.setBackground(true);
+        break;
+    case DoNotChange:
+    default:
+        break;
+    }
+    if (request) {
+        request->setInfo(info);
+        bool a = request->isBackground();
+    }
+    //bool f = info.isForeground();
+    bool b = info.isBackground();
 }
 
 void FmRadioHsWidgetRadioServiceClient::test()
@@ -154,10 +448,15 @@
 
     /*req = mApplicationManager.create(KRadioServiceMonitorInterfaceName, KRadioServiceMonitorOperation,
         false);*/
+
+/* ///
+    if (!mRadioMonitorRequest) {
+        createMonitorServiceRequest();
+    }
+    bool res = mRadioMonitorRequest->send();
+///
+*/
     
-    createMonitorServiceRequest();
-    bool res = mRadioInformationServiceRequest->send();
-
     /*if (req) {*/
 /*
         // Connect signals once
@@ -183,7 +482,7 @@
         /*bool res = req->send();*/
 
         /*if (res) {
-            //QTimer::singleShot(40000, this, SLOT(doGetFmRadioInformation()));
+            //QTimer::singleShot(40000, this, SLOT(doSendMonitorRequest()));
         }
         else {
             // Request failed.
@@ -196,303 +495,3 @@
         r = 5;
     }*/
 }
-
-/*!
- Changing of FM Radio channel.
- 
- /param command Command to execute.
- */
-void FmRadioHsWidgetRadioServiceClient::doChangeFmRadioChannel(
-    FmRadioChannelChangeCommand command)
-{
-    createControlServiceRequest();
-    int commandId;
-    
-    switch (command) {
-    case PreviousFavouriteChannel:
-        // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Previous*/ 2;
-        break;
-    case NextFavouriteChannel:
-        // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Next*/ 3;
-        break;
-    default:
-        break;
-    }
-    
-    QVariant commandArgument;
-    commandArgument.setValue(commandId);
-    QList<QVariant> arguments;
-    arguments.append(commandArgument);
-    mRadioControlServiceRequest->setArguments(arguments);
-
-    bool res = mRadioControlServiceRequest->send();
-
-    if (!res) {
-        int error = mRadioControlServiceRequest->latestError();
-        handleRequestError(error);
-    }
-    
-    stopMonitoring();
-    startMonitoring();
-}
-
-/*!
- Changing of FM Radio channel.
- 
- /param command Command to execute.
- */
-void FmRadioHsWidgetRadioServiceClient::doControlFmRadioAudio(
-    FmRadioAudioControlCommand command)
-{
-    createControlServiceRequest();
-
-    int commandId;
-
-    switch (command) {
-    case Mute:
-        // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Pause*/ 1;
-        break;
-    case Unmute:
-        // TODO: Include header and remove comment.
-        commandId = /*RadioServiceCommand::Play*/ 0;
-        break;
-    default:
-        break;
-    }
-    
-    QVariant commandArgument;
-    commandArgument.setValue(commandId);
-    QList<QVariant> arguments;
-    arguments.append(commandArgument);
-    mRadioControlServiceRequest->setArguments(arguments);
-
-    bool res = mRadioControlServiceRequest->send();
-    stopMonitoring();
-    startMonitoring();
-}
-
-/*!
- Start FM Radio information listening.
- */
-void FmRadioHsWidgetRadioServiceClient::doGetFmRadioInformation()
-{
-    mRadioInformationServiceRequest->send();
-}
-
-/*!
- Handle changes in FM Radio information texts.
- 
- /param value
- */
-void FmRadioHsWidgetRadioServiceClient::handleFmRadioInformationChange(const QVariant& value)
-{
-    if ( !mDataInitialized ) {
-        mRadioInformationServiceRequest->setMessage( KRadioServiceMonitorOperation );
-        mDataInitialized = true;
-    }
-
-    startMonitoring();
-    if ( value.isValid() && value.canConvert( QVariant::List ) ) {
-        QVariantList notificationList = value.toList();
-        foreach ( const QVariant& variant, notificationList ) {
-            RadioNotificationData notification = variant.value<RadioNotificationData>();
-            const int notificationId = notification.mType;
-            emit radioInformationChanged( notificationId, notification.mData );
-        }
-    }
-}
-
-/*!
- Handle control command completion of FM Radio.
- 
- /param value
- */
-void FmRadioHsWidgetRadioServiceClient::handleFmRadioControlRequestComplete(const QVariant& value)
-{
-    if (value.isValid() && value.canConvert(QVariant::String)) {
-        QString str = value.toString();
-    }
-    startMonitoring();
-}
-
-/*!
- Handles request error.
- 
- /param int Error value.
- */
-void FmRadioHsWidgetRadioServiceClient::handleRequestError(int error)
-{
-    QString errorStr;
-    QVariant var(FmRadioHsWidget::NotRunning);
-    switch (error) {
-    case XQService::ENoError:
-        errorStr = "No error";
-        break;
-    case XQService::EConnectionError:
-        // TODO close connection gracefully. Maybe try to esblish it again.
-        errorStr = "(/*!< Error in IPC Connection */";
-        break;
-    case XQService::EConnectionClosed:
-        // TODO close connection gracefully. Maybe try to esblish it again.
-        errorStr = "/*!< IPC Connection is closed */";
-        stopMonitoring();
-        handleFmRadioStateChange(var);
-        break;
-    case XQService::EServerNotFound:
-        errorStr = "/*!< Can not find server */";
-        break;
-    case XQService::EIPCError:
-        errorStr = "/*!< Known IPC error defined by SDK */";
-        break;
-    case XQService::EUnknownError:
-        errorStr = "/*!< Unknown IPC error */";
-        break;
-    case XQService::ERequestPending:
-        errorStr = "/*!< Already pending request */";
-        stopMonitoring();
-        startMonitoring();
-        break;
-    default:
-        break;
-    }
-}
-
-/*!
- Handles request error.
- 
- /param int Error value.
- */
-void FmRadioHsWidgetRadioServiceClient::handleRequestError2(int error)
-{
-    QString errorStr;
-    switch (error) {
-    case XQService::ENoError:
-        errorStr = "No error";
-        break;
-    case XQService::EConnectionError:
-        // TODO close connection gracefully. Maybe try to esblish it again.
-        errorStr = "(/*!< Error in IPC Connection */";
-        break;
-    case XQService::EConnectionClosed:
-        errorStr = "/*!< IPC Connection is closed */";
-        stopMonitoring();
-        startMonitoring();
-        break;
-    case XQService::EServerNotFound:
-        errorStr = "/*!< Can not find server */";
-        break;
-    case XQService::EIPCError:
-        errorStr = "/*!< Known IPC error defined by SDK */";
-        break;
-    case XQService::EUnknownError:
-        errorStr = "/*!< Unknown IPC error */";
-        break;
-    case XQService::ERequestPending:
-        errorStr = "/*!< Already pending request */";
-        stopMonitoring();
-        startMonitoring();
-        break;
-    default:
-        break;
-    }
-}
-
-/*!
- Handle changes in FM Radio state.
- 
- /param value New state of FM Radio.
- */
-void FmRadioHsWidgetRadioServiceClient::handleFmRadioStateChange(QVariant& value)
-{
-    if (value.isValid()) {
-        emit radioStateChanged(value);
-    }
-}
-
-/*!
- Handle request completion.
- 
- /param value
- */
-void FmRadioHsWidgetRadioServiceClient::requestCompleted(const QVariant& value)
-{
-    if (value.isValid()) {
-    }
-}
-
-/*!
- Handle ok.
- 
- /param result
- */
-void FmRadioHsWidgetRadioServiceClient::handleOk(const QVariant& result)
-{
-    if (!result.isNull() && result.isValid() && result.toBool()) {
-    }
-}
-
-/*!
- Handle error.
- 
- /param errorCode
- /param errorMessage
- */
-void FmRadioHsWidgetRadioServiceClient::handleError(int /*errorCode*/, const QString& /*errorMessage*/)
-{
-    //int e = errorCode;
-    //QString em = errorMessage;
-}
-
-/*!
- Creates control service request object.
- */
-void FmRadioHsWidgetRadioServiceClient::createControlServiceRequest()
-{
-    if (!mRadioControlServiceRequest) {
-        QString fullServiceName = KRadioServiceName + "." + KRadioServiceControlInterfaceName;
-        mRadioControlServiceRequest = new XQServiceRequest(fullServiceName,
-            KRadioServiceControlOperation, false);
-
-        bool a = connect(mRadioControlServiceRequest, SIGNAL(requestCompleted(QVariant)), this,
-            SLOT(requestCompleted(QVariant)));
-        bool b = connect(mRadioControlServiceRequest, SIGNAL(requestError(int)), this,
-            SLOT(handleRequestError2(int)));
-    }
-}
-
-/*!
- Creates monitor service request object.
- */
-void FmRadioHsWidgetRadioServiceClient::createMonitorServiceRequest()
-{
-    if (!mRadioInformationServiceRequest) {
-        QString operation = mDataInitialized ? KRadioServiceMonitorOperation : KRadioServiceRefreshOperation;
-        QString fullServiceName = KRadioServiceName + "." + KRadioServiceMonitorInterfaceName;
-        mRadioInformationServiceRequest = new XQServiceRequest(fullServiceName, operation, false);
-        bool a = connect( mRadioInformationServiceRequest, SIGNAL(requestCompleted(QVariant)),
-                          this,                            SLOT(handleFmRadioInformationChange(QVariant)));
-        bool b = connect( mRadioInformationServiceRequest, SIGNAL(requestError(int)),
-                         this,                             SLOT(handleRequestError(int)));
-    }
-}
-
-/*!
- Start radio monitoring.
- */
-void FmRadioHsWidgetRadioServiceClient::startMonitoring()
-{
-    createMonitorServiceRequest();
-    doGetFmRadioInformation();
-}
-
-/*!
- Stops radio monitoring.
- */
-void FmRadioHsWidgetRadioServiceClient::stopMonitoring()
-{
-    delete mRadioInformationServiceRequest;
-    delete mRadioControlServiceRequest;
-}