contentstorage/caclient/s60/src/caclientsession.cpp
author hgs
Fri, 14 May 2010 17:24:44 +0300
changeset 94 dbb8300717f7
parent 85 7feec50967db
permissions -rw-r--r--
201019
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
85
7feec50967db 201003_02
hgs
parents:
diff changeset
     1
/*
7feec50967db 201003_02
hgs
parents:
diff changeset
     2
 * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
7feec50967db 201003_02
hgs
parents:
diff changeset
     3
 * All rights reserved.
7feec50967db 201003_02
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
7feec50967db 201003_02
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
7feec50967db 201003_02
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
7feec50967db 201003_02
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
7feec50967db 201003_02
hgs
parents:
diff changeset
     8
 *
7feec50967db 201003_02
hgs
parents:
diff changeset
     9
 * Initial Contributors:
7feec50967db 201003_02
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
7feec50967db 201003_02
hgs
parents:
diff changeset
    11
 *
7feec50967db 201003_02
hgs
parents:
diff changeset
    12
 * Contributors:
7feec50967db 201003_02
hgs
parents:
diff changeset
    13
 *
7feec50967db 201003_02
hgs
parents:
diff changeset
    14
 * Description:
7feec50967db 201003_02
hgs
parents:
diff changeset
    15
 *
7feec50967db 201003_02
hgs
parents:
diff changeset
    16
 */
7feec50967db 201003_02
hgs
parents:
diff changeset
    17
7feec50967db 201003_02
hgs
parents:
diff changeset
    18
#include "cautils.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    19
#include "caclientsession.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    20
#include "caclientsubsession.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    21
#include "caclientproxy.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    22
#include "cainnerentry.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    23
#include "cainnerquery.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    24
#include "caidsarray.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    25
#include "caentriesarray.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    26
#include "caclientnotifierproxy.h"
7feec50967db 201003_02
hgs
parents:
diff changeset
    27
7feec50967db 201003_02
hgs
parents:
diff changeset
    28
const TInt KInnerEntryExpandSize = 1024;
7feec50967db 201003_02
hgs
parents:
diff changeset
    29
7feec50967db 201003_02
hgs
parents:
diff changeset
    30
// Function prototypes
7feec50967db 201003_02
hgs
parents:
diff changeset
    31
static TInt StartServer();
7feec50967db 201003_02
hgs
parents:
diff changeset
    32
static TInt CreateServerProcess();
7feec50967db 201003_02
hgs
parents:
diff changeset
    33
7feec50967db 201003_02
hgs
parents:
diff changeset
    34
// ======== MEMBER FUNCTIONS ========
7feec50967db 201003_02
hgs
parents:
diff changeset
    35
7feec50967db 201003_02
hgs
parents:
diff changeset
    36
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    37
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    38
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    39
RCaClientSession::RCaClientSession() :
7feec50967db 201003_02
hgs
parents:
diff changeset
    40
    RSessionBase()
7feec50967db 201003_02
hgs
parents:
diff changeset
    41
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    42
    // No implementation required
7feec50967db 201003_02
hgs
parents:
diff changeset
    43
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    44
7feec50967db 201003_02
hgs
parents:
diff changeset
    45
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    46
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    47
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    48
TInt RCaClientSession::Connect()
7feec50967db 201003_02
hgs
parents:
diff changeset
    49
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    50
    TInt error =
7feec50967db 201003_02
hgs
parents:
diff changeset
    51
            CreateSession( KCaSrvName, Version() );
7feec50967db 201003_02
hgs
parents:
diff changeset
    52
    if( error == KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
    53
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
    54
        ShareAuto();
7feec50967db 201003_02
hgs
parents:
diff changeset
    55
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
    56
    return error;
7feec50967db 201003_02
hgs
parents:
diff changeset
    57
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    58
7feec50967db 201003_02
hgs
parents:
diff changeset
    59
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    60
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    61
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    62
TInt RCaClientSession::StartServer()
7feec50967db 201003_02
hgs
parents:
diff changeset
    63
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    64
    return ::StartServer();
7feec50967db 201003_02
hgs
parents:
diff changeset
    65
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    66
7feec50967db 201003_02
hgs
parents:
diff changeset
    67
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    68
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    69
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    70
void RCaClientSession::Close()
7feec50967db 201003_02
hgs
parents:
diff changeset
    71
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    72
    RSessionBase::Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
    73
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    74
7feec50967db 201003_02
hgs
parents:
diff changeset
    75
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    76
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    77
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    78
TVersion RCaClientSession::Version() const
7feec50967db 201003_02
hgs
parents:
diff changeset
    79
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    80
    return ( TVersion( KCaMajorVersion, KCaMinorVersion, KCaBuild ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
    81
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
    82
7feec50967db 201003_02
hgs
parents:
diff changeset
    83
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    84
//
7feec50967db 201003_02
hgs
parents:
diff changeset
    85
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
    86
void RCaClientSession::GetListL( const CCaInnerQuery& aQuery,
7feec50967db 201003_02
hgs
parents:
diff changeset
    87
        RCaEntriesArray& aResult )
7feec50967db 201003_02
hgs
parents:
diff changeset
    88
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
    89
    TInt resultSize(0);
7feec50967db 201003_02
hgs
parents:
diff changeset
    90
    TInt error = GetSizeL( aQuery, EContentArsenalGetList_GetSize,
7feec50967db 201003_02
hgs
parents:
diff changeset
    91
        resultSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
    92
7feec50967db 201003_02
hgs
parents:
diff changeset
    93
    if( error == KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
    94
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
    95
        error = GetResultL( resultSize, EContentArsenalGetList_GetData,
7feec50967db 201003_02
hgs
parents:
diff changeset
    96
                aResult );
7feec50967db 201003_02
hgs
parents:
diff changeset
    97
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
    98
7feec50967db 201003_02
hgs
parents:
diff changeset
    99
    User::LeaveIfError( error );
7feec50967db 201003_02
hgs
parents:
diff changeset
   100
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   101
7feec50967db 201003_02
hgs
parents:
diff changeset
   102
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   103
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   104
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   105
void RCaClientSession::GetEntryIdsL( const CCaInnerQuery& aQuery,
7feec50967db 201003_02
hgs
parents:
diff changeset
   106
        RCaIdsArray& aResult )
7feec50967db 201003_02
hgs
parents:
diff changeset
   107
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   108
    TInt resultSize( 0 );
7feec50967db 201003_02
hgs
parents:
diff changeset
   109
    TInt error = GetSizeL( aQuery, EContentArsenalGetIds_GetSize,
7feec50967db 201003_02
hgs
parents:
diff changeset
   110
            resultSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
   111
7feec50967db 201003_02
hgs
parents:
diff changeset
   112
    if( error == KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
   113
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   114
        error = GetResultL( resultSize, EContentArsenalGetIds_GetData,
7feec50967db 201003_02
hgs
parents:
diff changeset
   115
                aResult );
7feec50967db 201003_02
hgs
parents:
diff changeset
   116
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   117
7feec50967db 201003_02
hgs
parents:
diff changeset
   118
    User::LeaveIfError( error );
7feec50967db 201003_02
hgs
parents:
diff changeset
   119
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   120
7feec50967db 201003_02
hgs
parents:
diff changeset
   121
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   122
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   123
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   124
TInt RCaClientSession::GetSizeL( const CCaInnerQuery& aQuery,
7feec50967db 201003_02
hgs
parents:
diff changeset
   125
        const TCaServerRequests aServerRequest, TInt& aResultSize )
7feec50967db 201003_02
hgs
parents:
diff changeset
   126
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   127
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   128
    HBufC8* serializedQuery = MenuUtils::MarshalDataL( aQuery, 128 );
7feec50967db 201003_02
hgs
parents:
diff changeset
   129
    CleanupStack::PushL( serializedQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   130
    args.Set( KInputPosition1, serializedQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   131
    TPckg<TInt> sizeDes( aResultSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
   132
    args.Set( KOutputPosition, &sizeDes );
7feec50967db 201003_02
hgs
parents:
diff changeset
   133
    TInt error = SendReceive( aServerRequest, args );
7feec50967db 201003_02
hgs
parents:
diff changeset
   134
    CleanupStack::PopAndDestroy( serializedQuery );
7feec50967db 201003_02
hgs
parents:
diff changeset
   135
    return error;
7feec50967db 201003_02
hgs
parents:
diff changeset
   136
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   137
7feec50967db 201003_02
hgs
parents:
diff changeset
   138
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   139
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   140
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   141
void RCaClientSession::AddL( CCaInnerEntry& aEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
   142
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   143
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   144
    HBufC8* serializedEntry = MenuUtils::MarshalDataL( aEntry, KInnerEntryExpandSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
   145
    CleanupStack::PushL( serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   146
    args.Set( KInputPosition1, serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   147
    TInt id( 0 );
7feec50967db 201003_02
hgs
parents:
diff changeset
   148
    TPckg<TInt> resultId( id );
7feec50967db 201003_02
hgs
parents:
diff changeset
   149
    args.Set( KOutputPosition, &resultId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   150
7feec50967db 201003_02
hgs
parents:
diff changeset
   151
    TInt error = SendReceive( EContentArsenalAdd, args );
7feec50967db 201003_02
hgs
parents:
diff changeset
   152
    User::LeaveIfError( error );
7feec50967db 201003_02
hgs
parents:
diff changeset
   153
    aEntry.SetId( id );
7feec50967db 201003_02
hgs
parents:
diff changeset
   154
7feec50967db 201003_02
hgs
parents:
diff changeset
   155
    CleanupStack::PopAndDestroy( serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   156
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   157
7feec50967db 201003_02
hgs
parents:
diff changeset
   158
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   159
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   160
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   161
void RCaClientSession::RemoveL( const RCaIdsArray& aEntries )
7feec50967db 201003_02
hgs
parents:
diff changeset
   162
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   163
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   164
    HBufC8* inbuf = aEntries.MarshalDataLC();
7feec50967db 201003_02
hgs
parents:
diff changeset
   165
    args.Set( KInputPosition1, inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   166
    User::LeaveIfError( SendReceive( EContentArsenalRemove, args ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   167
    CleanupStack::PopAndDestroy( inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   168
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   169
7feec50967db 201003_02
hgs
parents:
diff changeset
   170
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   171
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   172
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   173
void RCaClientSession::OrganizeL( const RCaIdsArray& aEntries,
7feec50967db 201003_02
hgs
parents:
diff changeset
   174
        TCaOperationParams aParams )
7feec50967db 201003_02
hgs
parents:
diff changeset
   175
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   176
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   177
    HBufC8* inbuf = aEntries.MarshalDataLC();
7feec50967db 201003_02
hgs
parents:
diff changeset
   178
    args.Set( KInputPosition1, inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   179
    TPckg<TCaOperationParams> data( aParams );
7feec50967db 201003_02
hgs
parents:
diff changeset
   180
    args.Set( KInputPosition2, &data );
7feec50967db 201003_02
hgs
parents:
diff changeset
   181
    User::LeaveIfError( SendReceive( EContentArsenalOrganize, args ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   182
    CleanupStack::PopAndDestroy( inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   183
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   184
7feec50967db 201003_02
hgs
parents:
diff changeset
   185
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   186
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   187
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   188
void RCaClientSession::TouchL( const CCaInnerEntry& aEntry )
7feec50967db 201003_02
hgs
parents:
diff changeset
   189
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   190
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   191
    HBufC8* serializedEntry = MenuUtils::MarshalDataL( aEntry, KInnerEntryExpandSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
   192
    CleanupStack::PushL( serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   193
    args.Set( KInputPosition1, serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   194
    
7feec50967db 201003_02
hgs
parents:
diff changeset
   195
    User::LeaveIfError( SendReceive( EContentArsenalTouch, args ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   196
	
7feec50967db 201003_02
hgs
parents:
diff changeset
   197
    CleanupStack::PopAndDestroy( serializedEntry );
7feec50967db 201003_02
hgs
parents:
diff changeset
   198
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   199
7feec50967db 201003_02
hgs
parents:
diff changeset
   200
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   201
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   202
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   203
void RCaClientSession::CustomSortL( const RCaIdsArray& aEntries,
7feec50967db 201003_02
hgs
parents:
diff changeset
   204
        const TInt aGroupId )
7feec50967db 201003_02
hgs
parents:
diff changeset
   205
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   206
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   207
    HBufC8* inbuf = aEntries.MarshalDataLC();
7feec50967db 201003_02
hgs
parents:
diff changeset
   208
    args.Set( KInputPosition1, inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   209
    TPckg<TInt> groupId( aGroupId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   210
    args.Set( KInputPosition2, &groupId );
7feec50967db 201003_02
hgs
parents:
diff changeset
   211
    User::LeaveIfError( SendReceive( EContentArsenalCustomSort, args ) );
7feec50967db 201003_02
hgs
parents:
diff changeset
   212
    CleanupStack::PopAndDestroy( inbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   213
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   214
7feec50967db 201003_02
hgs
parents:
diff changeset
   215
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   216
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   217
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   218
template<typename SerializableObject>
7feec50967db 201003_02
hgs
parents:
diff changeset
   219
TInt RCaClientSession::GetResultL( TInt aSize, TCaServerRequests aRequest,
7feec50967db 201003_02
hgs
parents:
diff changeset
   220
        SerializableObject& aObject )
7feec50967db 201003_02
hgs
parents:
diff changeset
   221
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   222
    TIpcArgs args;
7feec50967db 201003_02
hgs
parents:
diff changeset
   223
    RBuf8 outbuf;
7feec50967db 201003_02
hgs
parents:
diff changeset
   224
    outbuf.CleanupClosePushL();
7feec50967db 201003_02
hgs
parents:
diff changeset
   225
    outbuf.CreateL( aSize );
7feec50967db 201003_02
hgs
parents:
diff changeset
   226
    args.Set( KOutputPosition, &outbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   227
    TInt error = SendReceive( aRequest, args );
7feec50967db 201003_02
hgs
parents:
diff changeset
   228
    if( error == KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
   229
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   230
        RDesReadStream stream( outbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   231
        CleanupClosePushL( stream );
7feec50967db 201003_02
hgs
parents:
diff changeset
   232
        aObject.InternalizeL( stream );
7feec50967db 201003_02
hgs
parents:
diff changeset
   233
        CleanupStack::PopAndDestroy( &stream );
7feec50967db 201003_02
hgs
parents:
diff changeset
   234
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   235
    CleanupStack::PopAndDestroy( &outbuf );
7feec50967db 201003_02
hgs
parents:
diff changeset
   236
    return error;
7feec50967db 201003_02
hgs
parents:
diff changeset
   237
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   238
7feec50967db 201003_02
hgs
parents:
diff changeset
   239
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   240
// StartServer
7feec50967db 201003_02
hgs
parents:
diff changeset
   241
// Static function to start the server.
7feec50967db 201003_02
hgs
parents:
diff changeset
   242
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   243
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   244
static TInt StartServer()
7feec50967db 201003_02
hgs
parents:
diff changeset
   245
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   246
    TInt result;
7feec50967db 201003_02
hgs
parents:
diff changeset
   247
7feec50967db 201003_02
hgs
parents:
diff changeset
   248
    TFindServer findServer( KCaSrvName );
7feec50967db 201003_02
hgs
parents:
diff changeset
   249
    TFullName name;
7feec50967db 201003_02
hgs
parents:
diff changeset
   250
7feec50967db 201003_02
hgs
parents:
diff changeset
   251
    result = findServer.Next( name );
7feec50967db 201003_02
hgs
parents:
diff changeset
   252
    if( result != KErrNone )
7feec50967db 201003_02
hgs
parents:
diff changeset
   253
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   254
        // Server not running
7feec50967db 201003_02
hgs
parents:
diff changeset
   255
        result = CreateServerProcess();
7feec50967db 201003_02
hgs
parents:
diff changeset
   256
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   257
    return result;
7feec50967db 201003_02
hgs
parents:
diff changeset
   258
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   259
7feec50967db 201003_02
hgs
parents:
diff changeset
   260
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   261
// CreateServerProcess
7feec50967db 201003_02
hgs
parents:
diff changeset
   262
// Static function to create the server process.
7feec50967db 201003_02
hgs
parents:
diff changeset
   263
// -----------------------------------------------------------------------------
7feec50967db 201003_02
hgs
parents:
diff changeset
   264
//
7feec50967db 201003_02
hgs
parents:
diff changeset
   265
static TInt CreateServerProcess()
7feec50967db 201003_02
hgs
parents:
diff changeset
   266
    {
7feec50967db 201003_02
hgs
parents:
diff changeset
   267
    TInt err( KErrNone );
7feec50967db 201003_02
hgs
parents:
diff changeset
   268
    RProcess server;
7feec50967db 201003_02
hgs
parents:
diff changeset
   269
    err = server.Create( KCaSrvExe, KNullDesC, EOwnerThread );
7feec50967db 201003_02
hgs
parents:
diff changeset
   270
    if( !err )
7feec50967db 201003_02
hgs
parents:
diff changeset
   271
        {
7feec50967db 201003_02
hgs
parents:
diff changeset
   272
        TRequestStatus status;
7feec50967db 201003_02
hgs
parents:
diff changeset
   273
        server.Rendezvous( status );
7feec50967db 201003_02
hgs
parents:
diff changeset
   274
        if( status != KRequestPending )
7feec50967db 201003_02
hgs
parents:
diff changeset
   275
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   276
            server.Kill( 0 ); // Abort startup.
7feec50967db 201003_02
hgs
parents:
diff changeset
   277
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   278
        else
7feec50967db 201003_02
hgs
parents:
diff changeset
   279
            {
7feec50967db 201003_02
hgs
parents:
diff changeset
   280
            server.Resume(); // Logon OK - start the server.
7feec50967db 201003_02
hgs
parents:
diff changeset
   281
            }
7feec50967db 201003_02
hgs
parents:
diff changeset
   282
        User::WaitForRequest( status ); // Wait for start or death.
7feec50967db 201003_02
hgs
parents:
diff changeset
   283
        // We can't use the 'exit reason' if the server panicked as this
7feec50967db 201003_02
hgs
parents:
diff changeset
   284
        // is the panic 'reason' and may be '0' which cannot be distinguished
7feec50967db 201003_02
hgs
parents:
diff changeset
   285
        // from KErrNone.
7feec50967db 201003_02
hgs
parents:
diff changeset
   286
        err = ( server.ExitType() == EExitPanic ) ? KErrGeneral
7feec50967db 201003_02
hgs
parents:
diff changeset
   287
                : status.Int();
7feec50967db 201003_02
hgs
parents:
diff changeset
   288
        server.Close();
7feec50967db 201003_02
hgs
parents:
diff changeset
   289
        }
7feec50967db 201003_02
hgs
parents:
diff changeset
   290
    return err;
7feec50967db 201003_02
hgs
parents:
diff changeset
   291
    }
7feec50967db 201003_02
hgs
parents:
diff changeset
   292