utilities/serviceipcclient/serviceipc.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 "serviceipc.h"
hgs
parents:
diff changeset
    19
#include "serviceipc_p.h"
hgs
parents:
diff changeset
    20
#include "serviceipcfactory.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
namespace WRT
hgs
parents:
diff changeset
    23
{
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/*!
hgs
parents:
diff changeset
    26
 \class ServiceFwIPC
hgs
parents:
diff changeset
    27
 Public interface class for IPC operations
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
ServiceFwIPC::~ServiceFwIPC()
hgs
parents:
diff changeset
    34
{
hgs
parents:
diff changeset
    35
    delete d;
hgs
parents:
diff changeset
    36
}
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
/*!
hgs
parents:
diff changeset
    39
 Constructor
hgs
parents:
diff changeset
    40
 @param aBackend IPC backend to use
hgs
parents:
diff changeset
    41
 @param aParent Parent to this QObject
hgs
parents:
diff changeset
    42
 */
hgs
parents:
diff changeset
    43
ServiceFwIPC::ServiceFwIPC(QObject* aParent, TServiceIPCBackends aBackend)
hgs
parents:
diff changeset
    44
    : QObject(aParent)
hgs
parents:
diff changeset
    45
    , m_AsyncRequestPending(false)
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
    // Private implementation pattern
hgs
parents:
diff changeset
    48
    //
hgs
parents:
diff changeset
    49
    d = ServiceFwIPCFactory::createBackend(aBackend);
hgs
parents:
diff changeset
    50
    d->q = this;
hgs
parents:
diff changeset
    51
}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
/*!
hgs
parents:
diff changeset
    54
 Connect to the server
hgs
parents:
diff changeset
    55
 @param aServerName name of the server to connect to
hgs
parents:
diff changeset
    56
 @return true if connected, false if not
hgs
parents:
diff changeset
    57
 */
hgs
parents:
diff changeset
    58
bool ServiceFwIPC::connect(const QString& aServerName)
hgs
parents:
diff changeset
    59
{
hgs
parents:
diff changeset
    60
    return d->connect(aServerName);
hgs
parents:
diff changeset
    61
}
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
/*!
hgs
parents:
diff changeset
    64
 Disconnect from the server
hgs
parents:
diff changeset
    65
 @return void
hgs
parents:
diff changeset
    66
 */
hgs
parents:
diff changeset
    67
void ServiceFwIPC::disconnect()
hgs
parents:
diff changeset
    68
{
hgs
parents:
diff changeset
    69
    d->disconnect();
hgs
parents:
diff changeset
    70
}
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
/*!
hgs
parents:
diff changeset
    73
 Starts the service
hgs
parents:
diff changeset
    74
 @param aServerName name of the server
hgs
parents:
diff changeset
    75
 @param aExeName executable of the server
hgs
parents:
diff changeset
    76
 @return true if connected
hgs
parents:
diff changeset
    77
 */
hgs
parents:
diff changeset
    78
bool ServiceFwIPC::startServer(const QString& aServerName,
hgs
parents:
diff changeset
    79
                               const QString& aExeName)
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    return d->startServer(aServerName, aExeName);
hgs
parents:
diff changeset
    82
}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
/*!
hgs
parents:
diff changeset
    85
 Send a request synchronously
hgs
parents:
diff changeset
    86
 @param aRequestType name of the request
hgs
parents:
diff changeset
    87
 @param aData data to send
hgs
parents:
diff changeset
    88
 @return true if sent successful, otherwise false
hgs
parents:
diff changeset
    89
 */
hgs
parents:
diff changeset
    90
bool ServiceFwIPC::sendSync(const QString& aRequestType,
hgs
parents:
diff changeset
    91
                            const QByteArray& aData)
hgs
parents:
diff changeset
    92
{
hgs
parents:
diff changeset
    93
#ifdef _DEBUG
hgs
parents:
diff changeset
    94
    Q_ASSERT_X( aRequestType.contains(";") == false, "", "aRequestType cannot contain semicolons!" );
hgs
parents:
diff changeset
    95
#endif // _DEBUG
hgs
parents:
diff changeset
    96
    bool sent = d->sendSync(aRequestType, aData);
hgs
parents:
diff changeset
    97
    if (sent) {
hgs
parents:
diff changeset
    98
        sent = waitForRead();
hgs
parents:
diff changeset
    99
    }
hgs
parents:
diff changeset
   100
    return sent;
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
/*!
hgs
parents:
diff changeset
   104
 Send a request asynchronously
hgs
parents:
diff changeset
   105
 @param aRequestType name of the request
hgs
parents:
diff changeset
   106
 @param aData data to send
hgs
parents:
diff changeset
   107
 @note Errors will be emitted via errors() signal
hgs
parents:
diff changeset
   108
 @return void
hgs
parents:
diff changeset
   109
 */
hgs
parents:
diff changeset
   110
void ServiceFwIPC::sendAsync(const QString& aRequestType,
hgs
parents:
diff changeset
   111
                             const QByteArray& aData)
hgs
parents:
diff changeset
   112
{
hgs
parents:
diff changeset
   113
#ifdef _DEBUG
hgs
parents:
diff changeset
   114
    Q_ASSERT_X( aRequestType.contains(";") == false, "", "aRequestType cannot contain semicolons!" );
hgs
parents:
diff changeset
   115
#endif // _DEBUG
hgs
parents:
diff changeset
   116
    d->sendAsync(aRequestType, aData);
hgs
parents:
diff changeset
   117
    m_AsyncRequestPending = true;
hgs
parents:
diff changeset
   118
}
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
/*!
hgs
parents:
diff changeset
   121
 Reads all data pending in the buffer.\n
hgs
parents:
diff changeset
   122
 For Sync version this will wait until all of the data is available.\n
hgs
parents:
diff changeset
   123
 For Async version it will return the currently read buffer.\n
hgs
parents:
diff changeset
   124
 Use only after readyRead() signal is emitted. However partial data can be read
hgs
parents:
diff changeset
   125
 @return QByteArray of results
hgs
parents:
diff changeset
   126
 */
hgs
parents:
diff changeset
   127
QByteArray ServiceFwIPC::readAll()
hgs
parents:
diff changeset
   128
{
hgs
parents:
diff changeset
   129
    return d->readAll();
hgs
parents:
diff changeset
   130
}
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
/*!
hgs
parents:
diff changeset
   133
 Waits until data is available for reading
hgs
parents:
diff changeset
   134
 @return true if data is available for reading
hgs
parents:
diff changeset
   135
 */
hgs
parents:
diff changeset
   136
bool ServiceFwIPC::waitForRead()
hgs
parents:
diff changeset
   137
{
hgs
parents:
diff changeset
   138
    return d->waitForRead();
hgs
parents:
diff changeset
   139
}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
/*!
hgs
parents:
diff changeset
   142
 Check if an async request is already pending
hgs
parents:
diff changeset
   143
 @return true if an async request is pending
hgs
parents:
diff changeset
   144
 false otherwise
hgs
parents:
diff changeset
   145
 */
hgs
parents:
diff changeset
   146
bool ServiceFwIPC::requestPending()
hgs
parents:
diff changeset
   147
{
hgs
parents:
diff changeset
   148
    return m_AsyncRequestPending;
hgs
parents:
diff changeset
   149
}
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
/*!
hgs
parents:
diff changeset
   152
 Retrieve the session id synchronously
hgs
parents:
diff changeset
   153
 @param aSessionId name of the request
hgs
parents:
diff changeset
   154
 @return true if retrieved successfully, otherwise false
hgs
parents:
diff changeset
   155
 */
hgs
parents:
diff changeset
   156
bool ServiceFwIPC::getSessionId(int& aSessionId)
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    QByteArray data;
hgs
parents:
diff changeset
   159
    bool ret(sendSync(GETSESSIONID, data));
hgs
parents:
diff changeset
   160
    if (ret)
hgs
parents:
diff changeset
   161
        data = d->readAll();
hgs
parents:
diff changeset
   162
    aSessionId = data.toInt();
hgs
parents:
diff changeset
   163
    return ret;
hgs
parents:
diff changeset
   164
}
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
/*!
hgs
parents:
diff changeset
   167
 Set the session id synchronously
hgs
parents:
diff changeset
   168
 @param aSessionId name of the request
hgs
parents:
diff changeset
   169
 @return true if set successfully, otherwise false
hgs
parents:
diff changeset
   170
 */
hgs
parents:
diff changeset
   171
bool ServiceFwIPC::setSessionId(int aSessionId)
hgs
parents:
diff changeset
   172
{
hgs
parents:
diff changeset
   173
    bool ret(sendSync(SETSESSIONINFO, QByteArray::number(aSessionId)));
hgs
parents:
diff changeset
   174
    if (ret)
hgs
parents:
diff changeset
   175
        d->readAll(); //clean buffer
hgs
parents:
diff changeset
   176
    return ret;
hgs
parents:
diff changeset
   177
}
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
} // end of namespace
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
/*!
hgs
parents:
diff changeset
   182
 \fn WRT::ServiceFwIPC::error( int aError )
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
 Signal emitted to handle any errors
hgs
parents:
diff changeset
   185
 @param aError error code
hgs
parents:
diff changeset
   186
 @note: For local socket implementation, the error can be interpreted
hgs
parents:
diff changeset
   187
 as QLocalSocket::LocalSocketError
hgs
parents:
diff changeset
   188
 @return void
hgs
parents:
diff changeset
   189
 */
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
/*!
hgs
parents:
diff changeset
   192
 \fn WRT::ServiceFwIPC::readyRead()
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
 Handle when a reply has been received for async requests\n
hgs
parents:
diff changeset
   195
 Emitted when the entire data packet has been received
hgs
parents:
diff changeset
   196
 @return void
hgs
parents:
diff changeset
   197
 */
hgs
parents:
diff changeset
   198
// END OF FILE