utilities/serviceipcclient/serviceipcclient.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/**
hgs
parents:
diff changeset
     2
   This file is part of CWRT package **
hgs
parents:
diff changeset
     3
hgs
parents:
diff changeset
     4
   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). **
hgs
parents:
diff changeset
     5
hgs
parents:
diff changeset
     6
   This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     7
   it under the terms of the GNU (Lesser) General Public License as
hgs
parents:
diff changeset
     8
   published by the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     9
   This program is distributed in the hope that it will be useful, but
hgs
parents:
diff changeset
    10
   WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
hgs
parents:
diff changeset
    12
   (Lesser) General Public License for more details. You should have
hgs
parents:
diff changeset
    13
   received a copy of the GNU (Lesser) General Public License along
hgs
parents:
diff changeset
    14
   with this program. If not, see <http://www.gnu.org/licenses/>.
hgs
parents:
diff changeset
    15
*/
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
 
hgs
parents:
diff changeset
    18
#include "serviceipcclient.h"
hgs
parents:
diff changeset
    19
#include "serviceipc.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
namespace WRT
hgs
parents:
diff changeset
    22
{
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
/*!
hgs
parents:
diff changeset
    25
 \class ServiceIPCClient
hgs
parents:
diff changeset
    26
  This class is an extension to the current ServiceIPCClient interface
hgs
parents:
diff changeset
    27
  with the additional functionality of receiving messages from the server 
hgs
parents:
diff changeset
    28
 */
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
/*!
hgs
parents:
diff changeset
    31
 Destructor
hgs
parents:
diff changeset
    32
 */
hgs
parents:
diff changeset
    33
ServiceIPCClient::~ServiceIPCClient()
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    delete m_syncIPC;
hgs
parents:
diff changeset
    36
    delete m_asyncIPC;
hgs
parents:
diff changeset
    37
    delete m_broadcastIPC;
hgs
parents:
diff changeset
    38
}
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
/*!
hgs
parents:
diff changeset
    41
 Constructor 
hgs
parents:
diff changeset
    42
 @param aBackend IPC backend to use
hgs
parents:
diff changeset
    43
 @param aParent Parent to this QObject
hgs
parents:
diff changeset
    44
 */
hgs
parents:
diff changeset
    45
ServiceIPCClient::ServiceIPCClient(QObject* aParent, TServiceIPCBackends aBackend) :
hgs
parents:
diff changeset
    46
                                   QObject(aParent)
hgs
parents:
diff changeset
    47
{  
hgs
parents:
diff changeset
    48
    m_syncIPC = new ServiceFwIPC(aParent, aBackend);
hgs
parents:
diff changeset
    49
    m_asyncIPC = new ServiceFwIPC(aParent, aBackend);
hgs
parents:
diff changeset
    50
    m_broadcastIPC = new ServiceFwIPC(aParent, aBackend);
hgs
parents:
diff changeset
    51
    
hgs
parents:
diff changeset
    52
    QObject::connect(m_asyncIPC, SIGNAL(readyRead()), this, SLOT(handleAsyncMsg()));
hgs
parents:
diff changeset
    53
    QObject::connect(m_broadcastIPC, SIGNAL(readyRead()), this, SLOT(handleBroadcastMsg()));
hgs
parents:
diff changeset
    54
}
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
/*!
hgs
parents:
diff changeset
    57
 Connect to the server
hgs
parents:
diff changeset
    58
 @param aServerName name of the server to connect to
hgs
parents:
diff changeset
    59
 @return true if connected, false if not
hgs
parents:
diff changeset
    60
 */
hgs
parents:
diff changeset
    61
bool ServiceIPCClient::connect(const QString& aServerName)
hgs
parents:
diff changeset
    62
{
hgs
parents:
diff changeset
    63
    bool ret;
hgs
parents:
diff changeset
    64
    ret = m_syncIPC->connect(aServerName);
hgs
parents:
diff changeset
    65
    if (ret) {
hgs
parents:
diff changeset
    66
        int sessionId;
hgs
parents:
diff changeset
    67
        ret = m_syncIPC->getSessionId(sessionId);
hgs
parents:
diff changeset
    68
        if (ret) {
hgs
parents:
diff changeset
    69
            m_sessionId = sessionId;
hgs
parents:
diff changeset
    70
            ret = m_asyncIPC->connect(aServerName);
hgs
parents:
diff changeset
    71
            if (ret) {
hgs
parents:
diff changeset
    72
                ret = m_asyncIPC->setSessionId(sessionId);
hgs
parents:
diff changeset
    73
                if (ret) {
hgs
parents:
diff changeset
    74
                    ret = m_broadcastIPC->connect(aServerName);
hgs
parents:
diff changeset
    75
                    if (ret) {
hgs
parents:
diff changeset
    76
                        ret = m_broadcastIPC->setSessionId(sessionId);
hgs
parents:
diff changeset
    77
                        if (!ret) {
hgs
parents:
diff changeset
    78
                            //async. IPC set session ID fail, disconnect broadcast IPC
hgs
parents:
diff changeset
    79
                            m_broadcastIPC->disconnect();
hgs
parents:
diff changeset
    80
                        }
hgs
parents:
diff changeset
    81
                        else {
hgs
parents:
diff changeset
    82
                            subscribeBroadcastMsg();
hgs
parents:
diff changeset
    83
                        }
hgs
parents:
diff changeset
    84
                    }
hgs
parents:
diff changeset
    85
                }
hgs
parents:
diff changeset
    86
                if (!ret)  {
hgs
parents:
diff changeset
    87
                    //async. IPC set session ID fail or broadcast IPC connect fail, disconnect async IPC
hgs
parents:
diff changeset
    88
                    m_asyncIPC->disconnect();
hgs
parents:
diff changeset
    89
                }
hgs
parents:
diff changeset
    90
            }
hgs
parents:
diff changeset
    91
        }
hgs
parents:
diff changeset
    92
        if (!ret) {
hgs
parents:
diff changeset
    93
            m_syncIPC->disconnect(); //get sessionId failed or async. IPC connect fail, disconnect sync IPC
hgs
parents:
diff changeset
    94
        }
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
    return ret;
hgs
parents:
diff changeset
    97
}
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
/*!
hgs
parents:
diff changeset
   100
 Disconnect from the server
hgs
parents:
diff changeset
   101
 @return void
hgs
parents:
diff changeset
   102
 */
hgs
parents:
diff changeset
   103
void ServiceIPCClient::disconnect()
hgs
parents:
diff changeset
   104
{
hgs
parents:
diff changeset
   105
    m_syncIPC->disconnect();
hgs
parents:
diff changeset
   106
    m_asyncIPC->disconnect();
hgs
parents:
diff changeset
   107
    m_broadcastIPC->disconnect();
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
/*!
hgs
parents:
diff changeset
   111
 Starts the service
hgs
parents:
diff changeset
   112
 @param aServerName name of the server
hgs
parents:
diff changeset
   113
 @param aExeName executable of the server
hgs
parents:
diff changeset
   114
 @return true if connected
hgs
parents:
diff changeset
   115
 */
hgs
parents:
diff changeset
   116
bool ServiceIPCClient::startServer(const QString& aServerName,
hgs
parents:
diff changeset
   117
                                   const QString& aExeName)
hgs
parents:
diff changeset
   118
{
hgs
parents:
diff changeset
   119
    return m_syncIPC->startServer(aServerName, aExeName);
hgs
parents:
diff changeset
   120
}
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
/*!
hgs
parents:
diff changeset
   123
 Send a request synchronously
hgs
parents:
diff changeset
   124
 @param aRequestType name of the request
hgs
parents:
diff changeset
   125
 @param aData data to send
hgs
parents:
diff changeset
   126
 @return true if sent successful, otherwise false
hgs
parents:
diff changeset
   127
 */
hgs
parents:
diff changeset
   128
bool ServiceIPCClient::sendSync(const QString& aRequestType,
hgs
parents:
diff changeset
   129
                                const QByteArray& aData)
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
    return m_syncIPC->sendSync(aRequestType, aData);
hgs
parents:
diff changeset
   132
}
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
/*!
hgs
parents:
diff changeset
   135
 Send a request asynchronously
hgs
parents:
diff changeset
   136
 @param aRequestType name of the request
hgs
parents:
diff changeset
   137
 @param aData data to send
hgs
parents:
diff changeset
   138
 @note Errors will be emitted via errors() signal
hgs
parents:
diff changeset
   139
 @return void                                              
hgs
parents:
diff changeset
   140
 */
hgs
parents:
diff changeset
   141
void ServiceIPCClient::sendAsync(const QString& aRequestType,
hgs
parents:
diff changeset
   142
                                 const QByteArray& aData)
hgs
parents:
diff changeset
   143
{
hgs
parents:
diff changeset
   144
    m_asyncIPC->sendAsync(aRequestType, aData);
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
/*!
hgs
parents:
diff changeset
   148
 Reads all data pending in the buffer.\n
hgs
parents:
diff changeset
   149
 For Sync version this will wait until all of the data is available.\n
hgs
parents:
diff changeset
   150
 @return QByteArray of results
hgs
parents:
diff changeset
   151
 */
hgs
parents:
diff changeset
   152
QByteArray ServiceIPCClient::readAll()
hgs
parents:
diff changeset
   153
{
hgs
parents:
diff changeset
   154
    return m_syncIPC->readAll();
hgs
parents:
diff changeset
   155
}
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
/*!
hgs
parents:
diff changeset
   158
 Check if an async request is already pending
hgs
parents:
diff changeset
   159
 @return true if an async request is pending
hgs
parents:
diff changeset
   160
 false otherwise
hgs
parents:
diff changeset
   161
 */
hgs
parents:
diff changeset
   162
/*bool ServiceIPCClient::requestPending()
hgs
parents:
diff changeset
   163
{
hgs
parents:
diff changeset
   164
    return m_asyncIPC->requestPending();
hgs
parents:
diff changeset
   165
}*/
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
/*!
hgs
parents:
diff changeset
   168
 Reads all data pending in the buffer.\n
hgs
parents:
diff changeset
   169
 For Async version it will return the currently read buffer.\n
hgs
parents:
diff changeset
   170
 Use only after readyRead() signal is emitted. However partial data can be read
hgs
parents:
diff changeset
   171
 */
hgs
parents:
diff changeset
   172
void ServiceIPCClient::handleAsyncMsg()
hgs
parents:
diff changeset
   173
{
hgs
parents:
diff changeset
   174
    // Read the results
hgs
parents:
diff changeset
   175
    QByteArray ipcResult(m_asyncIPC->readAll());
hgs
parents:
diff changeset
   176
    
hgs
parents:
diff changeset
   177
    if (!ipcResult.isEmpty()) {
hgs
parents:
diff changeset
   178
        emit readAsync(ipcResult);  
hgs
parents:
diff changeset
   179
    }
hgs
parents:
diff changeset
   180
}
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
/*!
hgs
parents:
diff changeset
   183
 Client side interface to subscribe broadcast message
hgs
parents:
diff changeset
   184
 */
hgs
parents:
diff changeset
   185
void ServiceIPCClient::subscribeBroadcastMsg() 
hgs
parents:
diff changeset
   186
{
hgs
parents:
diff changeset
   187
    QString null;
hgs
parents:
diff changeset
   188
    m_broadcastIPC->sendAsync(SUBSCRIBEBROADCASTMSG, null.toAscii());
hgs
parents:
diff changeset
   189
}
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
/*!
hgs
parents:
diff changeset
   192
 Reads all data pending in the buffer.\n
hgs
parents:
diff changeset
   193
 For broadcast version it will return the currently read buffer.\n
hgs
parents:
diff changeset
   194
 Use only after readyRead() signal is emitted. However partial data can be read
hgs
parents:
diff changeset
   195
 */
hgs
parents:
diff changeset
   196
void ServiceIPCClient::handleBroadcastMsg()
hgs
parents:
diff changeset
   197
{
hgs
parents:
diff changeset
   198
    // Read the results
hgs
parents:
diff changeset
   199
    QByteArray ipcResult(m_broadcastIPC->readAll());
hgs
parents:
diff changeset
   200
    
hgs
parents:
diff changeset
   201
    if (!ipcResult.isEmpty()) {
hgs
parents:
diff changeset
   202
        emit handleMessage(ipcResult);  
hgs
parents:
diff changeset
   203
        subscribeBroadcastMsg(); 
hgs
parents:
diff changeset
   204
    }
hgs
parents:
diff changeset
   205
}
hgs
parents:
diff changeset
   206
hgs
parents:
diff changeset
   207
}
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
/*!
hgs
parents:
diff changeset
   211
 \fn WRT::ServiceIPCClient::error( int aError )
hgs
parents:
diff changeset
   212
 
hgs
parents:
diff changeset
   213
 Signal emitted to handle any errors
hgs
parents:
diff changeset
   214
 @param aError error code
hgs
parents:
diff changeset
   215
 @note: For local socket implementation, the error can be interpreted 
hgs
parents:
diff changeset
   216
 as QLocalSocket::LocalSocketError
hgs
parents:
diff changeset
   217
 @return void
hgs
parents:
diff changeset
   218
 */
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
/*!
hgs
parents:
diff changeset
   221
 \fn WRT::ServiceIPCClient::readyRead()
hgs
parents:
diff changeset
   222
hgs
parents:
diff changeset
   223
 Handle when a reply has been received for async requests\n
hgs
parents:
diff changeset
   224
 Emitted when the entire data packet has been received
hgs
parents:
diff changeset
   225
 @return void
hgs
parents:
diff changeset
   226
 */
hgs
parents:
diff changeset
   227
// END OF FILE