utilities/serviceipcclient/platform/s60/serviceipcsymbian.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 <e32base.h>
hgs
parents:
diff changeset
    19
#include <e32cmn.h>
hgs
parents:
diff changeset
    20
#include "serviceipcsymbian_p.h"
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
namespace WRT
hgs
parents:
diff changeset
    23
{
hgs
parents:
diff changeset
    24
const TInt KIPCOperation = 0;
hgs
parents:
diff changeset
    25
const TInt KIPCGetBuffer = 1;
hgs
parents:
diff changeset
    26
const TInt KServerMajorVersionNumber = 1;
hgs
parents:
diff changeset
    27
const TInt KServerMinorVersionNumber = 0;
hgs
parents:
diff changeset
    28
const TInt KServerBuildVersionNumber = 0;
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
/*!
hgs
parents:
diff changeset
    32
 \class CServiceSymbianIPC
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
 Symbian Client backend for the service IPC
hgs
parents:
diff changeset
    35
 */
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
/*!
hgs
parents:
diff changeset
    38
 Constructor
hgs
parents:
diff changeset
    39
 */
hgs
parents:
diff changeset
    40
CServiceSymbianIPC::CServiceSymbianIPC() :
hgs
parents:
diff changeset
    41
    CActive(CActive::EPriorityStandard), iDataSize(0)
hgs
parents:
diff changeset
    42
{
hgs
parents:
diff changeset
    43
    CActiveScheduler::Add(this);
hgs
parents:
diff changeset
    44
}
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
/*!
hgs
parents:
diff changeset
    47
 Destructor 
hgs
parents:
diff changeset
    48
 */
hgs
parents:
diff changeset
    49
CServiceSymbianIPC::~CServiceSymbianIPC()
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    Cancel();
hgs
parents:
diff changeset
    52
    if (iSession.Handle()) {
hgs
parents:
diff changeset
    53
        iSession.Close();
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
    delete iAsyncData;
hgs
parents:
diff changeset
    56
    delete iRequestData;
hgs
parents:
diff changeset
    57
}
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
/*!
hgs
parents:
diff changeset
    60
 2nd phased constructor
hgs
parents:
diff changeset
    61
 */
hgs
parents:
diff changeset
    62
void CServiceSymbianIPC::ConstructL()
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
/*!
hgs
parents:
diff changeset
    67
 Two Phased Constructor
hgs
parents:
diff changeset
    68
 */
hgs
parents:
diff changeset
    69
CServiceSymbianIPC* CServiceSymbianIPC::NewL()
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    CServiceSymbianIPC* self = new (ELeave) CServiceSymbianIPC();
hgs
parents:
diff changeset
    72
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    73
    self->ConstructL();
hgs
parents:
diff changeset
    74
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    75
    return self;
hgs
parents:
diff changeset
    76
}
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
/*!
hgs
parents:
diff changeset
    79
 Connect to the server
hgs
parents:
diff changeset
    80
 @param aServerName name of the server to connect to
hgs
parents:
diff changeset
    81
 @return true if connected, false if not
hgs
parents:
diff changeset
    82
 */
hgs
parents:
diff changeset
    83
bool CServiceSymbianIPC::connect(const QString& aServerName)
hgs
parents:
diff changeset
    84
{
hgs
parents:
diff changeset
    85
    // Version informaton
hgs
parents:
diff changeset
    86
    TVersion version(KServerMajorVersionNumber, 
hgs
parents:
diff changeset
    87
                     KServerMinorVersionNumber, 
hgs
parents:
diff changeset
    88
                     KServerBuildVersionNumber);
hgs
parents:
diff changeset
    89
    TPtrC serverName(reinterpret_cast<const TUint16*> (aServerName.utf16()));
hgs
parents:
diff changeset
    90
    TInt err = iSession.Connect(serverName, version);
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    return (err == KErrNone);
hgs
parents:
diff changeset
    93
}
hgs
parents:
diff changeset
    94
hgs
parents:
diff changeset
    95
/*!
hgs
parents:
diff changeset
    96
 Disconnect from the server
hgs
parents:
diff changeset
    97
 */
hgs
parents:
diff changeset
    98
void CServiceSymbianIPC::disconnect()
hgs
parents:
diff changeset
    99
{
hgs
parents:
diff changeset
   100
    iSession.Close();
hgs
parents:
diff changeset
   101
}
hgs
parents:
diff changeset
   102
hgs
parents:
diff changeset
   103
/*!
hgs
parents:
diff changeset
   104
 Starts the service
hgs
parents:
diff changeset
   105
 @param aServerName server name
hgs
parents:
diff changeset
   106
 @param aExeName server executable name
hgs
parents:
diff changeset
   107
 */
hgs
parents:
diff changeset
   108
bool CServiceSymbianIPC::startServer(const QString& /*aServerName*/,
hgs
parents:
diff changeset
   109
                                     const QString& aExeName)
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
    TPtrC serverName(reinterpret_cast<const TUint16*> (aExeName.utf16()));
hgs
parents:
diff changeset
   112
    TInt err = iSession.StartServer(serverName);
hgs
parents:
diff changeset
   113
    return (err == KErrNone);
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
/*!
hgs
parents:
diff changeset
   117
 Send a request synchronously
hgs
parents:
diff changeset
   118
 @param aRequestType type of request to send to the server
hgs
parents:
diff changeset
   119
 @param aData data to send to the server
hgs
parents:
diff changeset
   120
 */
hgs
parents:
diff changeset
   121
bool CServiceSymbianIPC::sendSync(const QString& aRequestType,
hgs
parents:
diff changeset
   122
                                  const QByteArray& aData)
hgs
parents:
diff changeset
   123
{
hgs
parents:
diff changeset
   124
    // Convert from QString to TPtr
hgs
parents:
diff changeset
   125
    TPtrC request(reinterpret_cast<const TUint16*> (aRequestType.utf16()));
hgs
parents:
diff changeset
   126
    TPtrC8 data(reinterpret_cast<const TUint8*> (aData.constData()), aData.length());
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
    // Send data, 0 is new op
hgs
parents:
diff changeset
   129
    TInt err;
hgs
parents:
diff changeset
   130
    TInt dataSize = 0;
hgs
parents:
diff changeset
   131
    TIpcArgs args(&request, &data);
hgs
parents:
diff changeset
   132
    TRAP( err, dataSize = iSession.SendReceiveL(KIPCOperation,args) );
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    // map return value
hgs
parents:
diff changeset
   135
    if (err == KErrNone) {
hgs
parents:
diff changeset
   136
        iDataSize = dataSize;
hgs
parents:
diff changeset
   137
    }
hgs
parents:
diff changeset
   138
    return (err == KErrNone);
hgs
parents:
diff changeset
   139
}
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
/*!
hgs
parents:
diff changeset
   142
 Send a request asynchronously
hgs
parents:
diff changeset
   143
 @param aRequestType type of request to send to the server
hgs
parents:
diff changeset
   144
 @param aData data to send to the server
hgs
parents:
diff changeset
   145
 */
hgs
parents:
diff changeset
   146
void CServiceSymbianIPC::sendAsync(const QString& aRequestType,
hgs
parents:
diff changeset
   147
                                   const QByteArray& aData)
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
    delete iRequestData;
hgs
parents:
diff changeset
   150
    iRequestData = NULL;
hgs
parents:
diff changeset
   151
    TPtrC request(reinterpret_cast<const TUint16*> (aRequestType.utf16()));
hgs
parents:
diff changeset
   152
    iRequestData = request.Alloc();
hgs
parents:
diff changeset
   153
    delete iAsyncData;
hgs
parents:
diff changeset
   154
    iAsyncData = NULL;
hgs
parents:
diff changeset
   155
    TPtrC8 data(reinterpret_cast<const TUint8*> (aData.constData()), aData.length());
hgs
parents:
diff changeset
   156
    iAsyncData = data.Alloc();
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
    // Send data
hgs
parents:
diff changeset
   159
    iRequestDataPtr.Set(*iRequestData);
hgs
parents:
diff changeset
   160
    iAsyncDataPtr.Set(*iAsyncData);
hgs
parents:
diff changeset
   161
    TIpcArgs args(&iRequestDataPtr, &iAsyncDataPtr);
hgs
parents:
diff changeset
   162
    iSession.SendReceive(KIPCOperation, args, iStatus);
hgs
parents:
diff changeset
   163
    SetActive();
hgs
parents:
diff changeset
   164
}
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
/*!
hgs
parents:
diff changeset
   167
 Reads all data pending in the buffer
hgs
parents:
diff changeset
   168
 @return QByteArray containing the result data
hgs
parents:
diff changeset
   169
 */
hgs
parents:
diff changeset
   170
QByteArray CServiceSymbianIPC::readAll()
hgs
parents:
diff changeset
   171
{
hgs
parents:
diff changeset
   172
    QByteArray rtn;
hgs
parents:
diff changeset
   173
    TRAP_IGNORE( rtn = doReadAllL() );
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
    return rtn;
hgs
parents:
diff changeset
   176
}
hgs
parents:
diff changeset
   177
hgs
parents:
diff changeset
   178
/*!
hgs
parents:
diff changeset
   179
 Reads all data pending in the buffer, leaves if an error occurred
hgs
parents:
diff changeset
   180
 @return QByteArray containing the result data
hgs
parents:
diff changeset
   181
 */
hgs
parents:
diff changeset
   182
QByteArray CServiceSymbianIPC::doReadAllL()
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
    // Read the data via IPC
hgs
parents:
diff changeset
   185
    //
hgs
parents:
diff changeset
   186
    CBufBase* buf = CBufFlat::NewL(iDataSize);
hgs
parents:
diff changeset
   187
    CleanupStack::PushL(buf);
hgs
parents:
diff changeset
   188
    buf->ResizeL(iDataSize);
hgs
parents:
diff changeset
   189
    TPtr8 ptr(buf->Ptr(0));
hgs
parents:
diff changeset
   190
    iSession.SendReceiveL(KIPCGetBuffer, TIpcArgs(&ptr));
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
    QByteArray convert((char *)ptr.Ptr(), ptr.Length());
hgs
parents:
diff changeset
   193
hgs
parents:
diff changeset
   194
    CleanupStack::PopAndDestroy(buf);
hgs
parents:
diff changeset
   195
hgs
parents:
diff changeset
   196
    // Deep copy, return variable is implicitly shared
hgs
parents:
diff changeset
   197
    return convert;
hgs
parents:
diff changeset
   198
}
hgs
parents:
diff changeset
   199
hgs
parents:
diff changeset
   200
/*!
hgs
parents:
diff changeset
   201
 Maps error codes from Symbian error codes to Service IPC error codes
hgs
parents:
diff changeset
   202
 @param aError Symbian error code
hgs
parents:
diff changeset
   203
 @return mapped error code
hgs
parents:
diff changeset
   204
 */
hgs
parents:
diff changeset
   205
int CServiceSymbianIPC::doMapErrors(TInt aError)
hgs
parents:
diff changeset
   206
{
hgs
parents:
diff changeset
   207
    int error(0);
hgs
parents:
diff changeset
   208
    switch (aError) {
hgs
parents:
diff changeset
   209
    case KErrNone: {
hgs
parents:
diff changeset
   210
        error = 0;
hgs
parents:
diff changeset
   211
        break;
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
    case KErrPermissionDenied:
hgs
parents:
diff changeset
   214
    case KErrServerTerminated: {
hgs
parents:
diff changeset
   215
        error = ServiceFwIPC::EConnectionClosed;
hgs
parents:
diff changeset
   216
        break;
hgs
parents:
diff changeset
   217
    }
hgs
parents:
diff changeset
   218
    case KErrServerBusy: {
hgs
parents:
diff changeset
   219
        error = ServiceFwIPC::EConnectionError;
hgs
parents:
diff changeset
   220
        break;
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
    case KErrArgument:
hgs
parents:
diff changeset
   223
    case KErrNoMemory: {
hgs
parents:
diff changeset
   224
        error = ServiceFwIPC::EIPCError;
hgs
parents:
diff changeset
   225
        break;
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
    default: {
hgs
parents:
diff changeset
   228
        error = ServiceFwIPC::EUnknownError;
hgs
parents:
diff changeset
   229
        break;
hgs
parents:
diff changeset
   230
    }
hgs
parents:
diff changeset
   231
    }
hgs
parents:
diff changeset
   232
    return error;
hgs
parents:
diff changeset
   233
}
hgs
parents:
diff changeset
   234
/*!
hgs
parents:
diff changeset
   235
 Waits until data is available for reading 
hgs
parents:
diff changeset
   236
 @return bool always true, no need to wait
hgs
parents:
diff changeset
   237
 */
hgs
parents:
diff changeset
   238
bool CServiceSymbianIPC::waitForRead()
hgs
parents:
diff changeset
   239
{
hgs
parents:
diff changeset
   240
    // Symbian Client-server is blocking, so no need to wait for read
hgs
parents:
diff changeset
   241
    return true;
hgs
parents:
diff changeset
   242
}
hgs
parents:
diff changeset
   243
hgs
parents:
diff changeset
   244
/*!
hgs
parents:
diff changeset
   245
 Active object callback
hgs
parents:
diff changeset
   246
 */
hgs
parents:
diff changeset
   247
void CServiceSymbianIPC::RunL()
hgs
parents:
diff changeset
   248
{
hgs
parents:
diff changeset
   249
    TInt err = iStatus.Int();
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
    // Callback to observers
hgs
parents:
diff changeset
   252
    //
hgs
parents:
diff changeset
   253
    if (err >= KErrNone) {
hgs
parents:
diff changeset
   254
        iDataSize = err;
hgs
parents:
diff changeset
   255
        emitReadyRead();
hgs
parents:
diff changeset
   256
    } else {
hgs
parents:
diff changeset
   257
        emitError(doMapErrors(err));
hgs
parents:
diff changeset
   258
    }
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
    // Cleanup async request, no need to delete if client re-requested an async op
hgs
parents:
diff changeset
   261
    if( !asyncPending() ) {
hgs
parents:
diff changeset
   262
        delete iRequestData;
hgs
parents:
diff changeset
   263
        iRequestData = NULL;
hgs
parents:
diff changeset
   264
        delete iAsyncData;
hgs
parents:
diff changeset
   265
        iAsyncData = NULL;
hgs
parents:
diff changeset
   266
        iRequestDataPtr.Set(KNullDesC);
hgs
parents:
diff changeset
   267
        iAsyncDataPtr.Set(KNullDesC8);
hgs
parents:
diff changeset
   268
    }
hgs
parents:
diff changeset
   269
}
hgs
parents:
diff changeset
   270
hgs
parents:
diff changeset
   271
/*!
hgs
parents:
diff changeset
   272
 Active object cancel
hgs
parents:
diff changeset
   273
 */
hgs
parents:
diff changeset
   274
void CServiceSymbianIPC::DoCancel()
hgs
parents:
diff changeset
   275
{
hgs
parents:
diff changeset
   276
    // We can't cancel in the IPC design.
hgs
parents:
diff changeset
   277
    TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   278
    User::RequestComplete(status, KErrCancel);
hgs
parents:
diff changeset
   279
}
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
}
hgs
parents:
diff changeset
   282
// END OF FILE