connectivitymodules/SeCon/servers/syncserver/src/sconasynchandler.cpp
author hgs
Tue, 12 Oct 2010 17:42:13 +0530
changeset 64 a62b67d1f67c
parent 40 b63e67867dcd
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
40
hgs
parents:
diff changeset
     1
/*
64
hgs
parents: 40
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
40
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  CSconAsyncHandler implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
#include "sconasynchandler.h"
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include <ecom/ecom.h>
hgs
parents:
diff changeset
    22
#include <SmlDataProvider.h>
hgs
parents:
diff changeset
    23
#include <s32mem.h>
hgs
parents:
diff changeset
    24
#include <nsmlchangefinder.h>
hgs
parents:
diff changeset
    25
#include <e32cmn.h>
hgs
parents:
diff changeset
    26
#include <ecom/ImplementationInformation.h>
hgs
parents:
diff changeset
    27
#include <mmf/common/mmfcontrollerpluginresolver.h>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
#include "sconsyncclientserver.h"
hgs
parents:
diff changeset
    30
#include "sconsyncrelationship.h"
hgs
parents:
diff changeset
    31
#include "scondataproviderinfo.h"
hgs
parents:
diff changeset
    32
#include "debug.h"
hgs
parents:
diff changeset
    33
#include "logdatastoreformat.h"
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// Data Store interface implementation Uid.
hgs
parents:
diff changeset
    36
// Load all plugins with this uid.
hgs
parents:
diff changeset
    37
const TUid KDSEcomIFUid = {0x101F4D3A};
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
const TInt KDefaultExpandSize = 1024;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// one store per computer, max store count.
hgs
parents:
diff changeset
    42
const TInt KMaxStoresCount = 10;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
const TInt KDefaultTimeOutInMicroSeconds = 30 * 1000000; // 30 seconds
64
hgs
parents: 40
diff changeset
    45
const TInt KDeleteAllTimeOutInMicroSeconds = 540 * 1000000; // 9 minutes
hgs
parents: 40
diff changeset
    46
const TInt KOpenStoreTimeOutInMicroSeconds = 540 * 1000000; //  9 minutes
hgs
parents: 40
diff changeset
    47
const TInt KResetChangeInfoTimeOutInMicroSeconds = 540 * 1000000; // 9 minutes
40
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
CSconAsyncHandler::~CSconAsyncHandler()
hgs
parents:
diff changeset
    50
    {
hgs
parents:
diff changeset
    51
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
    52
    Cancel();
hgs
parents:
diff changeset
    53
    DoCloseStore();
hgs
parents:
diff changeset
    54
    delete iItems;
hgs
parents:
diff changeset
    55
    delete iWriteData;
hgs
parents:
diff changeset
    56
    delete iDataStore;
hgs
parents:
diff changeset
    57
    delete iDataProvider;
hgs
parents:
diff changeset
    58
    delete iContext;
hgs
parents:
diff changeset
    59
    delete iStoreFormat;
hgs
parents:
diff changeset
    60
    iStringPool.Close();
hgs
parents:
diff changeset
    61
    iFs.Close();
hgs
parents:
diff changeset
    62
    REComSession::FinalClose();
hgs
parents:
diff changeset
    63
    iChunk.Close();
hgs
parents:
diff changeset
    64
    delete iTimeOut;
hgs
parents:
diff changeset
    65
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
    66
    }
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
CSconAsyncHandler::CSconAsyncHandler(): CActive( EPriorityStandard )
hgs
parents:
diff changeset
    69
    {
hgs
parents:
diff changeset
    70
    TRACE_FUNC;
hgs
parents:
diff changeset
    71
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
    72
    }
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
CSconAsyncHandler* CSconAsyncHandler::NewL()
hgs
parents:
diff changeset
    75
    {
hgs
parents:
diff changeset
    76
    TRACE_FUNC;
hgs
parents:
diff changeset
    77
    CSconAsyncHandler* self = new(ELeave) CSconAsyncHandler();
hgs
parents:
diff changeset
    78
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    79
    self->ConstructL();
hgs
parents:
diff changeset
    80
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    81
    return self;
hgs
parents:
diff changeset
    82
    }
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
void CSconAsyncHandler::ConstructL()
hgs
parents:
diff changeset
    85
    {
hgs
parents:
diff changeset
    86
    TRACE_FUNC;
hgs
parents:
diff changeset
    87
    User::LeaveIfError( iFs.Connect() );
hgs
parents:
diff changeset
    88
    TInt err = iFs.CreatePrivatePath( EDriveC );
hgs
parents:
diff changeset
    89
    LOGGER_WRITE_1("CreatePrivatePath err: %d", err);
hgs
parents:
diff changeset
    90
    iStringPool.OpenL();
hgs
parents:
diff changeset
    91
    iTimeOut = CCSconTimeOut::NewL( *this );
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
// CSconAsyncHandler::HandleServiceL()
hgs
parents:
diff changeset
    96
// Handles the client request
hgs
parents:
diff changeset
    97
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    98
//
hgs
parents:
diff changeset
    99
void CSconAsyncHandler::HandleServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
   100
    {
hgs
parents:
diff changeset
   101
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   102
    if ( aMessage.Function() == ECancelRequest )
hgs
parents:
diff changeset
   103
        {
hgs
parents:
diff changeset
   104
        LOGGER_WRITE("ECancelRequest");
hgs
parents:
diff changeset
   105
        if ( IsActive() )
hgs
parents:
diff changeset
   106
            {
hgs
parents:
diff changeset
   107
            Cancel();
hgs
parents:
diff changeset
   108
            LOGGER_WRITE("iMessage.Complete( KErrCancel )");
hgs
parents:
diff changeset
   109
            CompleteRequest( KErrCancel );
hgs
parents:
diff changeset
   110
            }
hgs
parents:
diff changeset
   111
        
hgs
parents:
diff changeset
   112
        LOGGER_WRITE("aMessage.Complete( KErrNone )");
hgs
parents:
diff changeset
   113
        aMessage.Complete( KErrNone );
hgs
parents:
diff changeset
   114
        TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   115
        return;
hgs
parents:
diff changeset
   116
        }
hgs
parents:
diff changeset
   117
    
hgs
parents:
diff changeset
   118
    iTimeOut->Start( KDefaultTimeOutInMicroSeconds );
hgs
parents:
diff changeset
   119
    
hgs
parents:
diff changeset
   120
    iMessage = aMessage;
hgs
parents:
diff changeset
   121
    switch ( aMessage.Function() )
hgs
parents:
diff changeset
   122
        {
hgs
parents:
diff changeset
   123
        case ESendChunkHandle:
hgs
parents:
diff changeset
   124
            LOGGER_WRITE( "CSconSyncSession::ServiceL() : ESendChunkHandle" );
hgs
parents:
diff changeset
   125
            HandleChunkMessage();
hgs
parents:
diff changeset
   126
            break;
hgs
parents:
diff changeset
   127
            
hgs
parents:
diff changeset
   128
        case EListImplementations:
hgs
parents:
diff changeset
   129
            LOGGER_WRITE( "CSconSyncSession::ServiceL() : EListImplementations" );
hgs
parents:
diff changeset
   130
            ListAllImplementationsL();
hgs
parents:
diff changeset
   131
            break;
hgs
parents:
diff changeset
   132
            
hgs
parents:
diff changeset
   133
        case EOpenStore:
hgs
parents:
diff changeset
   134
            LOGGER_WRITE( "CSconSyncSession::ServiceL() : EOpenStore" );
hgs
parents:
diff changeset
   135
            iTimeOut->Start( KOpenStoreTimeOutInMicroSeconds );
hgs
parents:
diff changeset
   136
            OpenStoreL();
hgs
parents:
diff changeset
   137
            break;
hgs
parents:
diff changeset
   138
            
hgs
parents:
diff changeset
   139
        case EOpenItem:
hgs
parents:
diff changeset
   140
            OpenItemL();
hgs
parents:
diff changeset
   141
            break;
hgs
parents:
diff changeset
   142
        case ECreateItem:
hgs
parents:
diff changeset
   143
            CreateItemL();
hgs
parents:
diff changeset
   144
            break;
hgs
parents:
diff changeset
   145
        case EReplaceItem:
hgs
parents:
diff changeset
   146
            ReplaceItemL();
hgs
parents:
diff changeset
   147
            break;
hgs
parents:
diff changeset
   148
        case EMoveItem:
hgs
parents:
diff changeset
   149
            MoveItemL();
hgs
parents:
diff changeset
   150
            break;
hgs
parents:
diff changeset
   151
        case EDeleteItem:
hgs
parents:
diff changeset
   152
            DeleteItemL();
hgs
parents:
diff changeset
   153
            break;
hgs
parents:
diff changeset
   154
        case ESoftDeleteItem:
hgs
parents:
diff changeset
   155
            SoftDeleteItemL();
hgs
parents:
diff changeset
   156
            break;
hgs
parents:
diff changeset
   157
        case EDeleteAllItems:
hgs
parents:
diff changeset
   158
            iTimeOut->Start( KDeleteAllTimeOutInMicroSeconds );
hgs
parents:
diff changeset
   159
            DeleteAllItemsL();
hgs
parents:
diff changeset
   160
            break;
hgs
parents:
diff changeset
   161
        case EReadParent:
hgs
parents:
diff changeset
   162
            ReadParentL();
hgs
parents:
diff changeset
   163
            break;
hgs
parents:
diff changeset
   164
            
hgs
parents:
diff changeset
   165
        case EHasHistory:
hgs
parents:
diff changeset
   166
            HasHistoryL();
hgs
parents:
diff changeset
   167
            break;
hgs
parents:
diff changeset
   168
        case EAddedItems:
hgs
parents:
diff changeset
   169
            AddedItemsL();
hgs
parents:
diff changeset
   170
            break;
hgs
parents:
diff changeset
   171
        case EDeletedItems:
hgs
parents:
diff changeset
   172
            DeletedItemsL();
hgs
parents:
diff changeset
   173
            break;
hgs
parents:
diff changeset
   174
        case ESoftDeletedItems:
hgs
parents:
diff changeset
   175
            SoftDeletedItemsL();
hgs
parents:
diff changeset
   176
            break;
hgs
parents:
diff changeset
   177
        case EModifiedItems:
hgs
parents:
diff changeset
   178
            ModifiedItemsL();
hgs
parents:
diff changeset
   179
            break;
hgs
parents:
diff changeset
   180
        case EMovedItems:
hgs
parents:
diff changeset
   181
            MovedItemsL();
hgs
parents:
diff changeset
   182
            break;
hgs
parents:
diff changeset
   183
        case EResetChangeInfo:
64
hgs
parents: 40
diff changeset
   184
            iTimeOut->Start( KResetChangeInfoTimeOutInMicroSeconds );
40
hgs
parents:
diff changeset
   185
            ResetChangeInfoL();
hgs
parents:
diff changeset
   186
            break;
hgs
parents:
diff changeset
   187
        case ECommitChangeInfo:
hgs
parents:
diff changeset
   188
            CommitChangeInfoL();
hgs
parents:
diff changeset
   189
            break;
hgs
parents:
diff changeset
   190
        case ECloseStore:
hgs
parents:
diff changeset
   191
            CloseStore();
hgs
parents:
diff changeset
   192
            break;
hgs
parents:
diff changeset
   193
        case ESetSyncTimeStamp:
hgs
parents:
diff changeset
   194
            SetSyncTimeStampL();
hgs
parents:
diff changeset
   195
            break;
hgs
parents:
diff changeset
   196
        case EGetSyncTimeStamp:
hgs
parents:
diff changeset
   197
            GetSyncTimeStampL();
hgs
parents:
diff changeset
   198
            break;
hgs
parents:
diff changeset
   199
        case EExportStoreFormat:
hgs
parents:
diff changeset
   200
            ExportStoreFormatL();
hgs
parents:
diff changeset
   201
            break;
hgs
parents:
diff changeset
   202
        case ESetRemoteStoreFormat:
hgs
parents:
diff changeset
   203
            SetRemoteStoreFormatL();
hgs
parents:
diff changeset
   204
            break;
hgs
parents:
diff changeset
   205
            
hgs
parents:
diff changeset
   206
        default:
hgs
parents:
diff changeset
   207
            aMessage.Complete(KErrNotSupported);
hgs
parents:
diff changeset
   208
            break;
hgs
parents:
diff changeset
   209
        }
hgs
parents:
diff changeset
   210
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
void CSconAsyncHandler::RunL()
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   217
    LOGGER_WRITE_1("iStatus.Int(): %d", iStatus.Int());
hgs
parents:
diff changeset
   218
    switch ( iMessage.Function() )
hgs
parents:
diff changeset
   219
        {
hgs
parents:
diff changeset
   220
        case EOpenStore:
hgs
parents:
diff changeset
   221
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EOpenStore" );
hgs
parents:
diff changeset
   222
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   223
            break;
hgs
parents:
diff changeset
   224
            
hgs
parents:
diff changeset
   225
        case EOpenItem:
hgs
parents:
diff changeset
   226
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EOpenItem" );
hgs
parents:
diff changeset
   227
            OpenItemCompletedL( iStatus.Int() );
hgs
parents:
diff changeset
   228
            break;
hgs
parents:
diff changeset
   229
            
hgs
parents:
diff changeset
   230
        case ECreateItem:
hgs
parents:
diff changeset
   231
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECreateItem" );
hgs
parents:
diff changeset
   232
            if (!iCommitInProgress)
hgs
parents:
diff changeset
   233
                {
hgs
parents:
diff changeset
   234
                // Write data to item
hgs
parents:
diff changeset
   235
                CreateItemCompletedL( iStatus.Int() );
hgs
parents:
diff changeset
   236
                }
hgs
parents:
diff changeset
   237
            else
hgs
parents:
diff changeset
   238
                {
hgs
parents:
diff changeset
   239
                // commit is done, all ready
hgs
parents:
diff changeset
   240
                LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECreateItem, commit done" );
hgs
parents:
diff changeset
   241
                TPckg<TSmlDbItemUid> pckg(iNewItem);
hgs
parents:
diff changeset
   242
                iMessage.WriteL( 0, pckg, 0);
hgs
parents:
diff changeset
   243
                CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   244
                }
hgs
parents:
diff changeset
   245
            break;
hgs
parents:
diff changeset
   246
            
hgs
parents:
diff changeset
   247
        case EReplaceItem:
hgs
parents:
diff changeset
   248
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReplaceItem" );
hgs
parents:
diff changeset
   249
            if (!iCommitInProgress)
hgs
parents:
diff changeset
   250
                {
hgs
parents:
diff changeset
   251
                // Write data to item
hgs
parents:
diff changeset
   252
                ReplaceItemCompletedL( iStatus.Int() );
hgs
parents:
diff changeset
   253
                }
hgs
parents:
diff changeset
   254
            else
hgs
parents:
diff changeset
   255
                {
hgs
parents:
diff changeset
   256
                // commit is done, all ready
hgs
parents:
diff changeset
   257
                LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReplaceItem, commit done" );
hgs
parents:
diff changeset
   258
                CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   259
                }
hgs
parents:
diff changeset
   260
            break;
hgs
parents:
diff changeset
   261
            
hgs
parents:
diff changeset
   262
        case EMoveItem:
hgs
parents:
diff changeset
   263
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EMoveItem" );
hgs
parents:
diff changeset
   264
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   265
            break;
hgs
parents:
diff changeset
   266
            
hgs
parents:
diff changeset
   267
        case EDeleteItem:
hgs
parents:
diff changeset
   268
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EDeleteItem" );
hgs
parents:
diff changeset
   269
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   270
            break;
hgs
parents:
diff changeset
   271
            
hgs
parents:
diff changeset
   272
        case ESoftDeleteItem:
hgs
parents:
diff changeset
   273
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : ESoftDeleteItem" );
hgs
parents:
diff changeset
   274
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   275
            break;
hgs
parents:
diff changeset
   276
            
hgs
parents:
diff changeset
   277
        case EDeleteAllItems:
hgs
parents:
diff changeset
   278
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EDeleteAllItems" );
hgs
parents:
diff changeset
   279
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   280
            break;
hgs
parents:
diff changeset
   281
            
hgs
parents:
diff changeset
   282
        case EReadParent:
hgs
parents:
diff changeset
   283
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EReadParent" );
hgs
parents:
diff changeset
   284
            ReadParentCompletedL( iStatus.Int() );
hgs
parents:
diff changeset
   285
            break;
hgs
parents:
diff changeset
   286
            
hgs
parents:
diff changeset
   287
        case EResetChangeInfo:
hgs
parents:
diff changeset
   288
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : EResetChangeInfo" );
hgs
parents:
diff changeset
   289
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   290
            break;
hgs
parents:
diff changeset
   291
            
hgs
parents:
diff changeset
   292
        case ECommitChangeInfo:
hgs
parents:
diff changeset
   293
            LOGGER_WRITE( "CSconAsyncHandler::RunL() : ECommitChangeInfo" );
hgs
parents:
diff changeset
   294
            delete iItems;
hgs
parents:
diff changeset
   295
            iItems = NULL;
hgs
parents:
diff changeset
   296
            CompleteRequest( iStatus.Int() );
hgs
parents:
diff changeset
   297
            break;
hgs
parents:
diff changeset
   298
            
hgs
parents:
diff changeset
   299
        default:
hgs
parents:
diff changeset
   300
            LOGGER_WRITE("Not asynchronous function")
hgs
parents:
diff changeset
   301
            CompleteRequest( KErrNotSupported );
hgs
parents:
diff changeset
   302
            break;
hgs
parents:
diff changeset
   303
        }
hgs
parents:
diff changeset
   304
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   305
    }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
TInt CSconAsyncHandler::RunError(TInt aError)
hgs
parents:
diff changeset
   308
    {
hgs
parents:
diff changeset
   309
    LOGGER_WRITE_1("CSconAsyncHandler::RunError() aError: %d", aError);
hgs
parents:
diff changeset
   310
    delete iItems;
hgs
parents:
diff changeset
   311
    iItems = NULL;
hgs
parents:
diff changeset
   312
    delete iWriteData;
hgs
parents:
diff changeset
   313
    iWriteData = NULL;
hgs
parents:
diff changeset
   314
    
hgs
parents:
diff changeset
   315
    if ( IsActive() )
hgs
parents:
diff changeset
   316
        {
hgs
parents:
diff changeset
   317
        LOGGER_WRITE("IsActive");
hgs
parents:
diff changeset
   318
        //iDataStore->CancelRequest();
hgs
parents:
diff changeset
   319
        Cancel();
hgs
parents:
diff changeset
   320
        }
hgs
parents:
diff changeset
   321
    
hgs
parents:
diff changeset
   322
    if ( iDataStore && iMessage.Function() == EOpenItem )
hgs
parents:
diff changeset
   323
        {
hgs
parents:
diff changeset
   324
        LOGGER_WRITE( "CSconAsyncHandler::RunError() : EOpenItem" );
hgs
parents:
diff changeset
   325
        iDataStore->CloseItem();
hgs
parents:
diff changeset
   326
        }
hgs
parents:
diff changeset
   327
    
hgs
parents:
diff changeset
   328
    CompleteRequest( aError );
hgs
parents:
diff changeset
   329
    aError = KErrNone;
hgs
parents:
diff changeset
   330
    LOGGER_WRITE_1("CSconAsyncHandler::RunError() : Return %d", aError);
hgs
parents:
diff changeset
   331
    return aError;
hgs
parents:
diff changeset
   332
    //return KErrNone;//aError;
hgs
parents:
diff changeset
   333
    }
hgs
parents:
diff changeset
   334
hgs
parents:
diff changeset
   335
void CSconAsyncHandler::DoCancel()
hgs
parents:
diff changeset
   336
    {
hgs
parents:
diff changeset
   337
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   338
    iDataStore->CancelRequest();
hgs
parents:
diff changeset
   339
    iTimeOut->Cancel();
hgs
parents:
diff changeset
   340
    
hgs
parents:
diff changeset
   341
    if ( iStatus == KRequestPending )
hgs
parents:
diff changeset
   342
        {
hgs
parents:
diff changeset
   343
        LOGGER_WRITE( "iStatus == KRequestPending" );
hgs
parents:
diff changeset
   344
        }
hgs
parents:
diff changeset
   345
    
hgs
parents:
diff changeset
   346
    if ( iDataStore && iMessage.Function() == EOpenItem )
hgs
parents:
diff changeset
   347
        {
hgs
parents:
diff changeset
   348
        LOGGER_WRITE( "CSconAsyncHandler::RunError() : EOpenItem" );
hgs
parents:
diff changeset
   349
        iDataStore->CloseItem();
hgs
parents:
diff changeset
   350
        }
hgs
parents:
diff changeset
   351
    
hgs
parents:
diff changeset
   352
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   353
    }
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
void CSconAsyncHandler::TimeOut()
hgs
parents:
diff changeset
   356
    {
hgs
parents:
diff changeset
   357
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   358
    if ( IsActive() )
hgs
parents:
diff changeset
   359
        {
hgs
parents:
diff changeset
   360
        Cancel();
hgs
parents:
diff changeset
   361
        CompleteRequest( KErrCancel );
hgs
parents:
diff changeset
   362
        }
hgs
parents:
diff changeset
   363
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   364
    }
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
void CSconAsyncHandler::HandleChunkMessage()
hgs
parents:
diff changeset
   368
    {
hgs
parents:
diff changeset
   369
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   370
    TInt ret ( KErrNone );
hgs
parents:
diff changeset
   371
    
hgs
parents:
diff changeset
   372
    ret = iChunk.Open( iMessage, 0, EFalse );
hgs
parents:
diff changeset
   373
        
hgs
parents:
diff changeset
   374
    LOGGER_WRITE_1( "CSconAsyncHandler::HandleChunkMessageL() : ret %d", ret );
hgs
parents:
diff changeset
   375
    CompleteRequest( ret );
hgs
parents:
diff changeset
   376
    }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
hgs
parents:
diff changeset
   380
void CSconAsyncHandler::ListAllImplementationsL()
hgs
parents:
diff changeset
   381
    {
hgs
parents:
diff changeset
   382
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   383
    
hgs
parents:
diff changeset
   384
    RImplInfoPtrArray implInfoArray;
hgs
parents:
diff changeset
   385
    CleanupResetAndDestroyPushL( implInfoArray );
hgs
parents:
diff changeset
   386
    REComSession::ListImplementationsL( KDSEcomIFUid, implInfoArray );
hgs
parents:
diff changeset
   387
    
hgs
parents:
diff changeset
   388
    const TInt KDataproviderInfoSize = 250; // 250 bytes should be enought
hgs
parents:
diff changeset
   389
    TInt requiredSize = implInfoArray.Count() * KDataproviderInfoSize;
hgs
parents:
diff changeset
   390
    if ( iChunk.Size() < requiredSize )
hgs
parents:
diff changeset
   391
        {
hgs
parents:
diff changeset
   392
        User::LeaveIfError( iChunk.Adjust( requiredSize ) );
hgs
parents:
diff changeset
   393
        }
hgs
parents:
diff changeset
   394
    
hgs
parents:
diff changeset
   395
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   396
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   397
    
hgs
parents:
diff changeset
   398
    RSconDataProviderInfoArray dpInfoArray;
hgs
parents:
diff changeset
   399
    CleanupResetAndDestroyPushL( dpInfoArray );
hgs
parents:
diff changeset
   400
    
hgs
parents:
diff changeset
   401
    // Collect information from dataproviders
hgs
parents:
diff changeset
   402
    for ( TInt i=0; i < implInfoArray.Count(); i++ )
hgs
parents:
diff changeset
   403
        {
hgs
parents:
diff changeset
   404
        LOGGER_WRITE_1("implInfoArray: %d",i);
hgs
parents:
diff changeset
   405
        CImplementationInformation& implInfo = *implInfoArray[i];
hgs
parents:
diff changeset
   406
        
hgs
parents:
diff changeset
   407
        CSmlDataProvider* dp(NULL);
hgs
parents:
diff changeset
   408
        TRAPD( err, dp = CSmlDataProvider::NewL( implInfo.ImplementationUid().iUid ) );
hgs
parents:
diff changeset
   409
        LOGGER_WRITE_2("CSmlDataProvider::NewL, uid(0x%08x) err: %d",implInfo.ImplementationUid().iUid, err );
hgs
parents:
diff changeset
   410
        if ( !err )
hgs
parents:
diff changeset
   411
            {
hgs
parents:
diff changeset
   412
            CleanupStack::PushL( dp );
hgs
parents:
diff changeset
   413
            
hgs
parents:
diff changeset
   414
            CSconDataproviderInfo *dpInfo = CSconDataproviderInfo::NewL();
hgs
parents:
diff changeset
   415
            CleanupStack::PushL( dpInfo );
hgs
parents:
diff changeset
   416
            
hgs
parents:
diff changeset
   417
            dpInfo->SetImplementationUid( implInfo.ImplementationUid() );
hgs
parents:
diff changeset
   418
            LOGGER_WRITE_1("ImplementationUid: 0x%08x", implInfo.ImplementationUid().iUid );
hgs
parents:
diff changeset
   419
            dpInfo->SetDisplayNameL( implInfo.DisplayName() );
hgs
parents:
diff changeset
   420
            LOGGER_WRITE_1("DisplayName: %S", &implInfo.DisplayName() );
hgs
parents:
diff changeset
   421
            
hgs
parents:
diff changeset
   422
            dpInfo->SetDefaultStoreL( dp->DefaultStoreL() );
hgs
parents:
diff changeset
   423
            LOGGER_WRITE_1("DefaultStoreL: %S", &dp->DefaultStoreL() );
hgs
parents:
diff changeset
   424
            CDesCArray* stores = dp->ListStoresLC();
hgs
parents:
diff changeset
   425
            dpInfo->SetStoresL( *stores );
hgs
parents:
diff changeset
   426
            CleanupStack::PopAndDestroy( stores );
hgs
parents:
diff changeset
   427
            
hgs
parents:
diff changeset
   428
            dpInfoArray.AppendL( dpInfo );
hgs
parents:
diff changeset
   429
            CleanupStack::Pop( dpInfo );
hgs
parents:
diff changeset
   430
            
hgs
parents:
diff changeset
   431
            CleanupStack::PopAndDestroy( dp );
hgs
parents:
diff changeset
   432
            }
hgs
parents:
diff changeset
   433
        }
hgs
parents:
diff changeset
   434
    
hgs
parents:
diff changeset
   435
    // Wrtie to stream
hgs
parents:
diff changeset
   436
    stream.WriteUint16L( dpInfoArray.Count() );
hgs
parents:
diff changeset
   437
    for ( TInt i = 0; i < dpInfoArray.Count(); i++ )
hgs
parents:
diff changeset
   438
        {
hgs
parents:
diff changeset
   439
        CSconDataproviderInfo& dpInfo = *dpInfoArray[i];
hgs
parents:
diff changeset
   440
        dpInfo.ExternalizeL( stream );
hgs
parents:
diff changeset
   441
        }
hgs
parents:
diff changeset
   442
    
hgs
parents:
diff changeset
   443
    stream.CommitL();
hgs
parents:
diff changeset
   444
    
hgs
parents:
diff changeset
   445
    CleanupStack::PopAndDestroy( &dpInfoArray );
hgs
parents:
diff changeset
   446
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   447
    CleanupStack::PopAndDestroy( &implInfoArray );
hgs
parents:
diff changeset
   448
    
hgs
parents:
diff changeset
   449
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   450
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   451
    }
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
void CSconAsyncHandler::OpenStoreL()
hgs
parents:
diff changeset
   454
    {
hgs
parents:
diff changeset
   455
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   456
    if ( iDataStore )
hgs
parents:
diff changeset
   457
        {
hgs
parents:
diff changeset
   458
        LOGGER_WRITE("Warning: Previous DataStore was not closed properly.");
hgs
parents:
diff changeset
   459
        DoCloseStore();
hgs
parents:
diff changeset
   460
        }
hgs
parents:
diff changeset
   461
    
hgs
parents:
diff changeset
   462
    // copy data from the chunk
hgs
parents:
diff changeset
   463
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   464
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
   465
    
hgs
parents:
diff changeset
   466
    TSmlDataProviderId providerId = readStream.ReadUint32L();
hgs
parents:
diff changeset
   467
    LOGGER_WRITE_1("providerId: 0x%08x", providerId);
hgs
parents:
diff changeset
   468
    
hgs
parents:
diff changeset
   469
    TInt len = readStream.ReadUint32L();
hgs
parents:
diff changeset
   470
    HBufC* storeName = HBufC::NewLC(len);
hgs
parents:
diff changeset
   471
    TPtr storeNamePtr = storeName->Des();
hgs
parents:
diff changeset
   472
    readStream.ReadL(storeNamePtr, len);
hgs
parents:
diff changeset
   473
    LOGGER_WRITE_1("storeName: %S", &storeNamePtr);
hgs
parents:
diff changeset
   474
    
hgs
parents:
diff changeset
   475
    TInt contextUid = readStream.ReadUint32L();
hgs
parents:
diff changeset
   476
    
hgs
parents:
diff changeset
   477
    LOGGER_WRITE_1("contextIdentifier: 0x%08x", contextUid);
hgs
parents:
diff changeset
   478
    
hgs
parents:
diff changeset
   479
    LOGGER_WRITE("Open provider");
hgs
parents:
diff changeset
   480
    delete iDataProvider;
hgs
parents:
diff changeset
   481
    iDataProvider = NULL;
hgs
parents:
diff changeset
   482
    iDataProvider = CSmlDataProvider::NewL( providerId );
hgs
parents:
diff changeset
   483
    
hgs
parents:
diff changeset
   484
    delete iContext;
hgs
parents:
diff changeset
   485
    iContext = NULL;
hgs
parents:
diff changeset
   486
    
hgs
parents:
diff changeset
   487
    delete iStoreFormat;
hgs
parents:
diff changeset
   488
    iStoreFormat = NULL;
hgs
parents:
diff changeset
   489
hgs
parents:
diff changeset
   490
    LOGGER_WRITE("Create context");
hgs
parents:
diff changeset
   491
    iContext = CSconSyncRelationship::NewL( iFs, TUid::Uid(contextUid), providerId );
hgs
parents:
diff changeset
   492
    
hgs
parents:
diff changeset
   493
    
hgs
parents:
diff changeset
   494
    LOGGER_WRITE("Create NewStoreInstanceLC");
hgs
parents:
diff changeset
   495
    iDataStore = iDataProvider->NewStoreInstanceLC();
hgs
parents:
diff changeset
   496
    CleanupStack::Pop( iDataStore );
hgs
parents:
diff changeset
   497
    
hgs
parents:
diff changeset
   498
    SetActive();
hgs
parents:
diff changeset
   499
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   500
    LOGGER_WRITE("OpenL");
hgs
parents:
diff changeset
   501
    TRAPD(err, iDataStore->OpenL(storeNamePtr,*iContext, iStatus));
hgs
parents:
diff changeset
   502
    if ( err )
hgs
parents:
diff changeset
   503
        {
hgs
parents:
diff changeset
   504
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   505
        LOGGER_WRITE_1("iDataStore->OpenL leaved with err: %d", err);
hgs
parents:
diff changeset
   506
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   507
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   508
        }
hgs
parents:
diff changeset
   509
    
hgs
parents:
diff changeset
   510
    CleanupStack::PopAndDestroy( storeName );
hgs
parents:
diff changeset
   511
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
   512
    
hgs
parents:
diff changeset
   513
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   514
    }
hgs
parents:
diff changeset
   515
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
void CSconAsyncHandler::OpenItemL()
hgs
parents:
diff changeset
   518
    {
hgs
parents:
diff changeset
   519
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   520
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   521
    if ( IsActive() )
hgs
parents:
diff changeset
   522
        {
hgs
parents:
diff changeset
   523
        LOGGER_WRITE("Was still in Active");
hgs
parents:
diff changeset
   524
        Cancel();
hgs
parents:
diff changeset
   525
        }
hgs
parents:
diff changeset
   526
    
hgs
parents:
diff changeset
   527
    TSmlDbItemUid itemUid = iMessage.Int0();
hgs
parents:
diff changeset
   528
    LOGGER_WRITE_1("Open item: %d", itemUid);
hgs
parents:
diff changeset
   529
    
hgs
parents:
diff changeset
   530
    // set default values
hgs
parents:
diff changeset
   531
    iFieldChange = EFalse;
hgs
parents:
diff changeset
   532
    iSize = 0;
hgs
parents:
diff changeset
   533
    iParent = 0;
hgs
parents:
diff changeset
   534
    iMimeType.Copy(KNullDesC);
hgs
parents:
diff changeset
   535
    iMimeVer.Copy(KNullDesC);
hgs
parents:
diff changeset
   536
    
hgs
parents:
diff changeset
   537
    SetActive();
hgs
parents:
diff changeset
   538
    LOGGER_WRITE("iDataStore->OpenItemL");
hgs
parents:
diff changeset
   539
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   540
    TRAPD( err, iDataStore->OpenItemL(itemUid,iFieldChange,iSize,iParent,iMimeType,iMimeVer,iStatus));
hgs
parents:
diff changeset
   541
    if ( err )
hgs
parents:
diff changeset
   542
        {
hgs
parents:
diff changeset
   543
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   544
        LOGGER_WRITE_1("iDataStore->OpenItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   545
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   546
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   547
        }
hgs
parents:
diff changeset
   548
    
hgs
parents:
diff changeset
   549
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   550
    }
hgs
parents:
diff changeset
   551
hgs
parents:
diff changeset
   552
void CSconAsyncHandler::OpenItemCompletedL( TInt aError )
hgs
parents:
diff changeset
   553
    {
hgs
parents:
diff changeset
   554
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   555
    // item opened, now read it
hgs
parents:
diff changeset
   556
    if ( aError )
hgs
parents:
diff changeset
   557
        {
hgs
parents:
diff changeset
   558
        CompleteRequest( aError );
hgs
parents:
diff changeset
   559
        return;
hgs
parents:
diff changeset
   560
        }
hgs
parents:
diff changeset
   561
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   562
    
hgs
parents:
diff changeset
   563
    LOGGER_WRITE_1("item size: %d", iSize);
hgs
parents:
diff changeset
   564
    
hgs
parents:
diff changeset
   565
    TInt totalObjectSize( 0 );
hgs
parents:
diff changeset
   566
    totalObjectSize+= sizeof(TInt32);   // data length
hgs
parents:
diff changeset
   567
    totalObjectSize+= iSize;            // data
hgs
parents:
diff changeset
   568
    totalObjectSize+= sizeof(TInt8);    // iFieldChange
hgs
parents:
diff changeset
   569
    totalObjectSize+= sizeof(TInt32);   // iParent
hgs
parents:
diff changeset
   570
    totalObjectSize+= sizeof(TInt32);   // iMimeType
hgs
parents:
diff changeset
   571
    totalObjectSize+= iMimeType.Length();  // iMimeType
hgs
parents:
diff changeset
   572
    totalObjectSize+= sizeof(TInt32);   // iMimeVer
hgs
parents:
diff changeset
   573
    totalObjectSize+= iMimeVer.Length();  // iMimeType
hgs
parents:
diff changeset
   574
    
hgs
parents:
diff changeset
   575
    LOGGER_WRITE_1("iChunk.Size(): %d", iChunk.Size());
hgs
parents:
diff changeset
   576
    LOGGER_WRITE_1("iChunk.MaxSize(): %d", iChunk.MaxSize());
hgs
parents:
diff changeset
   577
    LOGGER_WRITE_1("totalObjectSize: %d", totalObjectSize);
hgs
parents:
diff changeset
   578
    
hgs
parents:
diff changeset
   579
    if ( iChunk.Size() < totalObjectSize )
hgs
parents:
diff changeset
   580
        {
hgs
parents:
diff changeset
   581
        LOGGER_WRITE("adjust chunk");
hgs
parents:
diff changeset
   582
        TInt err = iChunk.Adjust( totalObjectSize );
hgs
parents:
diff changeset
   583
        LOGGER_WRITE_1("Chunk.Adjust err: %d", err);
hgs
parents:
diff changeset
   584
        User::LeaveIfError( err );
hgs
parents:
diff changeset
   585
        }
hgs
parents:
diff changeset
   586
    LOGGER_WRITE_1("new Chunk size: %d", iChunk.Size());
hgs
parents:
diff changeset
   587
    LOGGER_WRITE_1("new ChunkMaxSize(): %d", iChunk.MaxSize());
hgs
parents:
diff changeset
   588
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   589
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   590
    
hgs
parents:
diff changeset
   591
    LOGGER_WRITE("ReadItemL");
hgs
parents:
diff changeset
   592
    HBufC8* tempBuf = HBufC8::NewLC(iSize);
hgs
parents:
diff changeset
   593
    TPtr8 tempPtr = tempBuf->Des();
hgs
parents:
diff changeset
   594
    
hgs
parents:
diff changeset
   595
    TUint8* ptr = (TUint8*) tempPtr.Ptr();
hgs
parents:
diff changeset
   596
    
hgs
parents:
diff changeset
   597
    TPtr8 tempPtr2( ptr, 0, iSize );
hgs
parents:
diff changeset
   598
    LOGGER_WRITE_1( "tempPtr2.Size(): %d", tempPtr2.Size());
hgs
parents:
diff changeset
   599
    iDataStore->ReadItemL( tempPtr2 );
hgs
parents:
diff changeset
   600
    LOGGER_WRITE("ReadItemL -ok");
hgs
parents:
diff changeset
   601
    
hgs
parents:
diff changeset
   602
    LOGGER_WRITE_1("readed Length: %d", tempPtr2.Length() );
hgs
parents:
diff changeset
   603
    LOGGER_WRITE_1("readed Size: %d", tempPtr2.Size() );
hgs
parents:
diff changeset
   604
    
hgs
parents:
diff changeset
   605
    LOGGER_WRITE8_1("iMimeType: %S", &iMimeType );
hgs
parents:
diff changeset
   606
    LOGGER_WRITE_1("iMimeType.Length(): %d", iMimeType.Length() );
hgs
parents:
diff changeset
   607
    LOGGER_WRITE_1("iMimeType Size: %d", iMimeType.Size() );
hgs
parents:
diff changeset
   608
    
hgs
parents:
diff changeset
   609
    LOGGER_WRITE8_1("iMimeVer: %S", &iMimeVer );
hgs
parents:
diff changeset
   610
    LOGGER_WRITE_1("iMimeVer.Length(): %d", iMimeVer.Length() );
hgs
parents:
diff changeset
   611
    LOGGER_WRITE_1("iMimeVer Size: %d", iMimeVer.Size() );
hgs
parents:
diff changeset
   612
    
hgs
parents:
diff changeset
   613
    iDataStore->CloseItem();
hgs
parents:
diff changeset
   614
    LOGGER_WRITE("Write to chunk");
hgs
parents:
diff changeset
   615
    stream.WriteInt32L( tempPtr2.Length() );
hgs
parents:
diff changeset
   616
    stream.WriteL( tempPtr2 );
hgs
parents:
diff changeset
   617
    CleanupStack::PopAndDestroy( tempBuf );
hgs
parents:
diff changeset
   618
    
hgs
parents:
diff changeset
   619
    stream.WriteInt8L( (TInt)iFieldChange );
hgs
parents:
diff changeset
   620
    stream.WriteInt32L( iParent );
hgs
parents:
diff changeset
   621
    stream.WriteInt32L( iMimeType.Length() );
hgs
parents:
diff changeset
   622
    stream.WriteL( iMimeType );
hgs
parents:
diff changeset
   623
    stream.WriteInt32L( iMimeVer.Length() );
hgs
parents:
diff changeset
   624
    stream.WriteL( iMimeVer );
hgs
parents:
diff changeset
   625
    
hgs
parents:
diff changeset
   626
    stream.CommitL();
hgs
parents:
diff changeset
   627
    LOGGER_WRITE("Writed ok");
hgs
parents:
diff changeset
   628
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   629
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   630
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   631
    }
hgs
parents:
diff changeset
   632
hgs
parents:
diff changeset
   633
void CSconAsyncHandler::CreateItemL()
hgs
parents:
diff changeset
   634
    {
hgs
parents:
diff changeset
   635
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   636
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   637
    iCommitInProgress = EFalse;
hgs
parents:
diff changeset
   638
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   639
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
   640
    
hgs
parents:
diff changeset
   641
    TSmlDbItemUid parent = readStream.ReadUint32L();
hgs
parents:
diff changeset
   642
    TInt len = readStream.ReadUint32L();
hgs
parents:
diff changeset
   643
    readStream.ReadL(iMimeType, len);
hgs
parents:
diff changeset
   644
    len = readStream.ReadUint32L();
hgs
parents:
diff changeset
   645
    readStream.ReadL(iMimeVer, len);
hgs
parents:
diff changeset
   646
    len = readStream.ReadUint32L();
hgs
parents:
diff changeset
   647
    delete iWriteData;
hgs
parents:
diff changeset
   648
    iWriteData = NULL;
hgs
parents:
diff changeset
   649
    iWriteData = HBufC8::New(len);
hgs
parents:
diff changeset
   650
    TPtr8 dataPtr = iWriteData->Des();
hgs
parents:
diff changeset
   651
    readStream.ReadL(dataPtr, len);
hgs
parents:
diff changeset
   652
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
   653
    SetActive();
hgs
parents:
diff changeset
   654
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   655
    TRAPD(err, iDataStore->CreateItemL( iNewItem, dataPtr.Size(), parent, iMimeType, iMimeVer, iStatus ));
hgs
parents:
diff changeset
   656
    if ( err )
hgs
parents:
diff changeset
   657
        {
hgs
parents:
diff changeset
   658
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   659
        LOGGER_WRITE_1("iDataStore->CreateItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   660
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   661
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   662
        }
hgs
parents:
diff changeset
   663
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   664
    }
hgs
parents:
diff changeset
   665
hgs
parents:
diff changeset
   666
void CSconAsyncHandler::CreateItemCompletedL( TInt aError )
hgs
parents:
diff changeset
   667
    {
hgs
parents:
diff changeset
   668
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   669
    User::LeaveIfError( aError );
hgs
parents:
diff changeset
   670
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   671
    // CreateItem completed, now we must write the data to the created item and commit it.
hgs
parents:
diff changeset
   672
    
hgs
parents:
diff changeset
   673
    iDataStore->WriteItemL( iWriteData->Des() );
hgs
parents:
diff changeset
   674
    delete iWriteData;
hgs
parents:
diff changeset
   675
    iWriteData = NULL;
hgs
parents:
diff changeset
   676
    SetActive();
hgs
parents:
diff changeset
   677
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   678
    TRAPD(err, iDataStore->CommitItemL( iStatus ));
hgs
parents:
diff changeset
   679
    if ( err )
hgs
parents:
diff changeset
   680
        {
hgs
parents:
diff changeset
   681
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   682
        LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   683
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   684
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   685
        }
hgs
parents:
diff changeset
   686
    iCommitInProgress = ETrue;
hgs
parents:
diff changeset
   687
    
hgs
parents:
diff changeset
   688
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   689
    }
hgs
parents:
diff changeset
   690
hgs
parents:
diff changeset
   691
void CSconAsyncHandler::ReplaceItemL()
hgs
parents:
diff changeset
   692
    {
hgs
parents:
diff changeset
   693
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   694
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   695
    
hgs
parents:
diff changeset
   696
    iCommitInProgress = EFalse;
hgs
parents:
diff changeset
   697
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   698
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
   699
    
hgs
parents:
diff changeset
   700
    TSmlDbItemUid uid = readStream.ReadUint32L();
hgs
parents:
diff changeset
   701
    TSmlDbItemUid parent = readStream.ReadUint32L();
hgs
parents:
diff changeset
   702
    TBool fieldChange = readStream.ReadUint8L();
hgs
parents:
diff changeset
   703
    TInt len = readStream.ReadUint32L();
hgs
parents:
diff changeset
   704
    delete iWriteData;
hgs
parents:
diff changeset
   705
    iWriteData = NULL;
hgs
parents:
diff changeset
   706
    iWriteData = HBufC8::New(len);
hgs
parents:
diff changeset
   707
    TPtr8 dataPtr = iWriteData->Des();
hgs
parents:
diff changeset
   708
    readStream.ReadL(dataPtr, len);
hgs
parents:
diff changeset
   709
    
hgs
parents:
diff changeset
   710
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
   711
    SetActive();
hgs
parents:
diff changeset
   712
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   713
    TRAPD(err,iDataStore->ReplaceItemL( uid,dataPtr.Size(),parent,fieldChange, iStatus ));
hgs
parents:
diff changeset
   714
    if ( err )
hgs
parents:
diff changeset
   715
        {
hgs
parents:
diff changeset
   716
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   717
        LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   718
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   719
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   720
        }
hgs
parents:
diff changeset
   721
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   722
    }
hgs
parents:
diff changeset
   723
hgs
parents:
diff changeset
   724
void CSconAsyncHandler::ReplaceItemCompletedL( TInt aError )
hgs
parents:
diff changeset
   725
    {
hgs
parents:
diff changeset
   726
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   727
    User::LeaveIfError( aError );
hgs
parents:
diff changeset
   728
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   729
    // CreateItem completed, now we must write the data to the created item and commit it.
hgs
parents:
diff changeset
   730
    
hgs
parents:
diff changeset
   731
    iDataStore->WriteItemL( iWriteData->Des() );
hgs
parents:
diff changeset
   732
    delete iWriteData;
hgs
parents:
diff changeset
   733
    iWriteData = NULL;
hgs
parents:
diff changeset
   734
    
hgs
parents:
diff changeset
   735
    SetActive();
hgs
parents:
diff changeset
   736
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   737
    TRAPD(err, iDataStore->CommitItemL( iStatus ));
hgs
parents:
diff changeset
   738
    if ( err )
hgs
parents:
diff changeset
   739
        {
hgs
parents:
diff changeset
   740
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   741
        LOGGER_WRITE_1("iDataStore->CommitItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   742
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   743
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   744
        }
hgs
parents:
diff changeset
   745
    iCommitInProgress = ETrue;
hgs
parents:
diff changeset
   746
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   747
    }
hgs
parents:
diff changeset
   748
hgs
parents:
diff changeset
   749
void CSconAsyncHandler::MoveItemL()
hgs
parents:
diff changeset
   750
    {
hgs
parents:
diff changeset
   751
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   752
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   753
    TSmlDbItemUid uid = iMessage.Int0();
hgs
parents:
diff changeset
   754
    TSmlDbItemUid newParent = iMessage.Int1();
hgs
parents:
diff changeset
   755
    LOGGER_WRITE_1( "uid: %d", uid );
hgs
parents:
diff changeset
   756
    LOGGER_WRITE_1( "newParent: %d", newParent );
hgs
parents:
diff changeset
   757
    
hgs
parents:
diff changeset
   758
    SetActive();
hgs
parents:
diff changeset
   759
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   760
    TRAPD(err, iDataStore->MoveItemL( uid, newParent, iStatus )); 
hgs
parents:
diff changeset
   761
    if ( err )
hgs
parents:
diff changeset
   762
        {
hgs
parents:
diff changeset
   763
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   764
        LOGGER_WRITE_1("iDataStore->MoveItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   765
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   766
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   767
        }
hgs
parents:
diff changeset
   768
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   769
    }
hgs
parents:
diff changeset
   770
hgs
parents:
diff changeset
   771
void CSconAsyncHandler::DeleteItemL()
hgs
parents:
diff changeset
   772
    {
hgs
parents:
diff changeset
   773
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   774
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   775
    
hgs
parents:
diff changeset
   776
    TSmlDbItemUid uid = iMessage.Int0();
hgs
parents:
diff changeset
   777
    LOGGER_WRITE_1( "uid: %d", uid );
hgs
parents:
diff changeset
   778
    
hgs
parents:
diff changeset
   779
    SetActive();
hgs
parents:
diff changeset
   780
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   781
    TRAPD(err, iDataStore->DeleteItemL( uid, iStatus ));
hgs
parents:
diff changeset
   782
    if ( err )
hgs
parents:
diff changeset
   783
        {
hgs
parents:
diff changeset
   784
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   785
        LOGGER_WRITE_1("iDataStore->DeleteItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   786
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   787
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   788
        }
hgs
parents:
diff changeset
   789
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   790
    }
hgs
parents:
diff changeset
   791
hgs
parents:
diff changeset
   792
void CSconAsyncHandler::SoftDeleteItemL()
hgs
parents:
diff changeset
   793
    {
hgs
parents:
diff changeset
   794
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   795
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   796
    
hgs
parents:
diff changeset
   797
    TSmlDbItemUid uid = iMessage.Int0();
hgs
parents:
diff changeset
   798
    LOGGER_WRITE_1( "uid: %d", uid );
hgs
parents:
diff changeset
   799
    
hgs
parents:
diff changeset
   800
    SetActive();
hgs
parents:
diff changeset
   801
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   802
    TRAPD(err, iDataStore->SoftDeleteItemL( uid, iStatus ));
hgs
parents:
diff changeset
   803
    if ( err )
hgs
parents:
diff changeset
   804
        {
hgs
parents:
diff changeset
   805
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   806
        LOGGER_WRITE_1("iDataStore->SoftDeleteItemL leaved with err: %d", err);
hgs
parents:
diff changeset
   807
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   808
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   809
        }
hgs
parents:
diff changeset
   810
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   811
    }
hgs
parents:
diff changeset
   812
hgs
parents:
diff changeset
   813
void CSconAsyncHandler::DeleteAllItemsL()
hgs
parents:
diff changeset
   814
    {
hgs
parents:
diff changeset
   815
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   816
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   817
    
hgs
parents:
diff changeset
   818
    SetActive();
hgs
parents:
diff changeset
   819
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   820
    TRAPD(err, iDataStore->DeleteAllItemsL( iStatus ));
hgs
parents:
diff changeset
   821
    if ( err )
hgs
parents:
diff changeset
   822
        {
hgs
parents:
diff changeset
   823
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   824
        LOGGER_WRITE_1("iDataStore->DeleteAllItemsL leaved with err: %d", err);
hgs
parents:
diff changeset
   825
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   826
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   827
        }
hgs
parents:
diff changeset
   828
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   829
    }
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
void CSconAsyncHandler::ReadParentL()
hgs
parents:
diff changeset
   832
    {
hgs
parents:
diff changeset
   833
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   834
    OpenItemL();
hgs
parents:
diff changeset
   835
    
hgs
parents:
diff changeset
   836
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   837
    }
hgs
parents:
diff changeset
   838
hgs
parents:
diff changeset
   839
void CSconAsyncHandler::ReadParentCompletedL( TInt aError )
hgs
parents:
diff changeset
   840
    {
hgs
parents:
diff changeset
   841
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   842
    // item opened, now read it
hgs
parents:
diff changeset
   843
    if ( aError )
hgs
parents:
diff changeset
   844
        {
hgs
parents:
diff changeset
   845
        CompleteRequest( aError );
hgs
parents:
diff changeset
   846
        return;
hgs
parents:
diff changeset
   847
        }
hgs
parents:
diff changeset
   848
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   849
    
hgs
parents:
diff changeset
   850
    iDataStore->CloseItem();
hgs
parents:
diff changeset
   851
    
hgs
parents:
diff changeset
   852
    TPckg<TSmlDbItemUid> pckg(iParent);
hgs
parents:
diff changeset
   853
    iMessage.WriteL( 1, pckg, 0);
hgs
parents:
diff changeset
   854
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   855
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   856
    }
hgs
parents:
diff changeset
   857
hgs
parents:
diff changeset
   858
void CSconAsyncHandler::HasHistoryL()
hgs
parents:
diff changeset
   859
    {
hgs
parents:
diff changeset
   860
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   861
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   862
    TBool hasHistory = iDataStore->HasSyncHistory();
hgs
parents:
diff changeset
   863
    
hgs
parents:
diff changeset
   864
    TPckgC<TBool> pckg(hasHistory);
hgs
parents:
diff changeset
   865
    iMessage.WriteL( 0, pckg, 0);
hgs
parents:
diff changeset
   866
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   867
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   868
    }
hgs
parents:
diff changeset
   869
hgs
parents:
diff changeset
   870
void CSconAsyncHandler::AddedItemsL()
hgs
parents:
diff changeset
   871
    {
hgs
parents:
diff changeset
   872
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   873
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   874
    const MSmlDataItemUidSet& items = iDataStore->AddedItems();
hgs
parents:
diff changeset
   875
    
hgs
parents:
diff changeset
   876
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   877
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   878
    items.ExternalizeL( stream );
hgs
parents:
diff changeset
   879
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   880
    
hgs
parents:
diff changeset
   881
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   882
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   883
    }
hgs
parents:
diff changeset
   884
hgs
parents:
diff changeset
   885
void CSconAsyncHandler::DeletedItemsL()
hgs
parents:
diff changeset
   886
    {
hgs
parents:
diff changeset
   887
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   888
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   889
    const MSmlDataItemUidSet& items = iDataStore->DeletedItems();
hgs
parents:
diff changeset
   890
    
hgs
parents:
diff changeset
   891
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   892
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   893
    items.ExternalizeL( stream );
hgs
parents:
diff changeset
   894
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   895
    
hgs
parents:
diff changeset
   896
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   897
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   898
    }
hgs
parents:
diff changeset
   899
hgs
parents:
diff changeset
   900
void CSconAsyncHandler::SoftDeletedItemsL()
hgs
parents:
diff changeset
   901
    {
hgs
parents:
diff changeset
   902
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   903
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   904
    const MSmlDataItemUidSet& items = iDataStore->SoftDeletedItems();
hgs
parents:
diff changeset
   905
    
hgs
parents:
diff changeset
   906
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   907
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   908
    items.ExternalizeL( stream );
hgs
parents:
diff changeset
   909
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   910
    
hgs
parents:
diff changeset
   911
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   912
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   913
    }
hgs
parents:
diff changeset
   914
hgs
parents:
diff changeset
   915
void CSconAsyncHandler::ModifiedItemsL()
hgs
parents:
diff changeset
   916
    {
hgs
parents:
diff changeset
   917
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   918
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   919
    const MSmlDataItemUidSet& items = iDataStore->ModifiedItems();
hgs
parents:
diff changeset
   920
    
hgs
parents:
diff changeset
   921
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   922
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   923
    items.ExternalizeL( stream );
hgs
parents:
diff changeset
   924
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   925
    
hgs
parents:
diff changeset
   926
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   927
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   928
    }
hgs
parents:
diff changeset
   929
hgs
parents:
diff changeset
   930
void CSconAsyncHandler::MovedItemsL()
hgs
parents:
diff changeset
   931
    {
hgs
parents:
diff changeset
   932
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   933
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   934
    const MSmlDataItemUidSet& items = iDataStore->MovedItems();
hgs
parents:
diff changeset
   935
    
hgs
parents:
diff changeset
   936
    RMemWriteStream stream ( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   937
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
   938
    items.ExternalizeL( stream );
hgs
parents:
diff changeset
   939
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
   940
    
hgs
parents:
diff changeset
   941
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   942
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   943
    }
hgs
parents:
diff changeset
   944
hgs
parents:
diff changeset
   945
void CSconAsyncHandler::ResetChangeInfoL()
hgs
parents:
diff changeset
   946
    {
hgs
parents:
diff changeset
   947
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   948
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   949
    SetActive();
hgs
parents:
diff changeset
   950
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   951
    TRAPD(err, iDataStore->ResetChangeInfoL( iStatus ));
hgs
parents:
diff changeset
   952
    if ( err )
hgs
parents:
diff changeset
   953
        {
hgs
parents:
diff changeset
   954
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   955
        LOGGER_WRITE_1("iDataStore->ResetChangeInfoL leaved with err: %d", err);
hgs
parents:
diff changeset
   956
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   957
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   958
        }
hgs
parents:
diff changeset
   959
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   960
    }
hgs
parents:
diff changeset
   961
hgs
parents:
diff changeset
   962
void CSconAsyncHandler::CommitChangeInfoL()
hgs
parents:
diff changeset
   963
    {
hgs
parents:
diff changeset
   964
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   965
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
   966
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
   967
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
   968
    
hgs
parents:
diff changeset
   969
    if ( iItems )
hgs
parents:
diff changeset
   970
        {
hgs
parents:
diff changeset
   971
        delete iItems;
hgs
parents:
diff changeset
   972
        iItems = NULL;
hgs
parents:
diff changeset
   973
        }
hgs
parents:
diff changeset
   974
    iItems = new (ELeave) CNSmlDataItemUidSet();
hgs
parents:
diff changeset
   975
    iItems->InternalizeL( readStream );
hgs
parents:
diff changeset
   976
    
hgs
parents:
diff changeset
   977
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
   978
    
hgs
parents:
diff changeset
   979
    SetActive();
hgs
parents:
diff changeset
   980
    iStatus = KRequestPending;
hgs
parents:
diff changeset
   981
    TRAPD(err, iDataStore->CommitChangeInfoL( iStatus, *iItems ));
hgs
parents:
diff changeset
   982
    if ( err )
hgs
parents:
diff changeset
   983
        {
hgs
parents:
diff changeset
   984
        // we are on active state, call request completed (RunL)
hgs
parents:
diff changeset
   985
        LOGGER_WRITE_1("iDataStore->CommitChangeInfoL leaved with err: %d", err);
hgs
parents:
diff changeset
   986
        TRequestStatus* status = &iStatus;
hgs
parents:
diff changeset
   987
        User::RequestComplete( status, err );
hgs
parents:
diff changeset
   988
        }
hgs
parents:
diff changeset
   989
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   990
    }
hgs
parents:
diff changeset
   991
hgs
parents:
diff changeset
   992
void CSconAsyncHandler::CloseStore()
hgs
parents:
diff changeset
   993
    {
hgs
parents:
diff changeset
   994
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   995
    DoCloseStore();
hgs
parents:
diff changeset
   996
    REComSession::FinalClose();
hgs
parents:
diff changeset
   997
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
   998
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   999
    }
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
void CSconAsyncHandler::SetSyncTimeStampL()
hgs
parents:
diff changeset
  1002
    {
hgs
parents:
diff changeset
  1003
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1004
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
  1005
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
  1006
    TInt relationId = readStream.ReadInt32L();
hgs
parents:
diff changeset
  1007
    TInt providerId = readStream.ReadInt32L();
hgs
parents:
diff changeset
  1008
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
  1009
    
hgs
parents:
diff changeset
  1010
    CSconSyncRelationship::SetTimeStampL( iFs, TUid::Uid(relationId), providerId);
hgs
parents:
diff changeset
  1011
    
hgs
parents:
diff changeset
  1012
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
  1013
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1014
    }
hgs
parents:
diff changeset
  1015
hgs
parents:
diff changeset
  1016
void CSconAsyncHandler::GetSyncTimeStampL()
hgs
parents:
diff changeset
  1017
    {
hgs
parents:
diff changeset
  1018
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1019
    TInt providerId = iMessage.Int0();
hgs
parents:
diff changeset
  1020
    TInt relationId = iMessage.Int1();
hgs
parents:
diff changeset
  1021
        
hgs
parents:
diff changeset
  1022
    TDateTime time;
hgs
parents:
diff changeset
  1023
    CSconSyncRelationship::GetTimeStampL( iFs, TUid::Uid(relationId), providerId, time);
hgs
parents:
diff changeset
  1024
    
hgs
parents:
diff changeset
  1025
    // write timestamp
hgs
parents:
diff changeset
  1026
    TPckgC<TDateTime> timeBuf(time);
hgs
parents:
diff changeset
  1027
    iMessage.WriteL( 2, timeBuf, 0);
hgs
parents:
diff changeset
  1028
    
hgs
parents:
diff changeset
  1029
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
  1030
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1031
    }
hgs
parents:
diff changeset
  1032
hgs
parents:
diff changeset
  1033
void CSconAsyncHandler::ExportStoreFormatL()
hgs
parents:
diff changeset
  1034
    {
hgs
parents:
diff changeset
  1035
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1036
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
  1037
    if ( !iDataProvider )
hgs
parents:
diff changeset
  1038
        {
hgs
parents:
diff changeset
  1039
        User::Leave( KErrNotReady );
hgs
parents:
diff changeset
  1040
        }
hgs
parents:
diff changeset
  1041
    CBufFlat* buffer = CBufFlat::NewL( KDefaultExpandSize );
hgs
parents:
diff changeset
  1042
    CleanupStack::PushL( buffer );
hgs
parents:
diff changeset
  1043
    RBufWriteStream stream( *buffer );
hgs
parents:
diff changeset
  1044
    CleanupClosePushL( stream );
hgs
parents:
diff changeset
  1045
    
hgs
parents:
diff changeset
  1046
    const CSmlDataStoreFormat& storeFormat = iDataProvider->StoreFormatL();
hgs
parents:
diff changeset
  1047
    TRAP_IGNORE( TLogDataStoreFormat::LogDataStoreFormatL( _L("iDataProvider->StoreFormatL()"), storeFormat ));
hgs
parents:
diff changeset
  1048
    
hgs
parents:
diff changeset
  1049
    storeFormat.ExternalizeL( stream );
hgs
parents:
diff changeset
  1050
    
hgs
parents:
diff changeset
  1051
    stream.CommitL();
hgs
parents:
diff changeset
  1052
    CleanupStack::PopAndDestroy( &stream );
hgs
parents:
diff changeset
  1053
    buffer->Compress();
hgs
parents:
diff changeset
  1054
    
hgs
parents:
diff changeset
  1055
    RMemWriteStream chunkStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
  1056
    CleanupClosePushL( chunkStream );
hgs
parents:
diff changeset
  1057
    
hgs
parents:
diff changeset
  1058
    chunkStream.WriteInt32L( buffer->Size() );
hgs
parents:
diff changeset
  1059
    chunkStream.WriteL( buffer->Ptr(0), buffer->Size());
hgs
parents:
diff changeset
  1060
    chunkStream.CommitL();
hgs
parents:
diff changeset
  1061
    CleanupStack::PopAndDestroy( &chunkStream );
hgs
parents:
diff changeset
  1062
    
hgs
parents:
diff changeset
  1063
    CleanupStack::PopAndDestroy( buffer );
hgs
parents:
diff changeset
  1064
    
hgs
parents:
diff changeset
  1065
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
  1066
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1067
    }
hgs
parents:
diff changeset
  1068
hgs
parents:
diff changeset
  1069
void CSconAsyncHandler::SetRemoteStoreFormatL()
hgs
parents:
diff changeset
  1070
    {
hgs
parents:
diff changeset
  1071
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1072
    LeaveIfNoInstanceL();
hgs
parents:
diff changeset
  1073
    
hgs
parents:
diff changeset
  1074
    RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
hgs
parents:
diff changeset
  1075
    CleanupClosePushL( readStream );
hgs
parents:
diff changeset
  1076
    
hgs
parents:
diff changeset
  1077
    if ( iStoreFormat )
hgs
parents:
diff changeset
  1078
        {
hgs
parents:
diff changeset
  1079
        delete iStoreFormat;
hgs
parents:
diff changeset
  1080
        iStoreFormat = NULL;
hgs
parents:
diff changeset
  1081
        }
hgs
parents:
diff changeset
  1082
    iStoreFormat = CSmlDataStoreFormat::NewLC( iStringPool, readStream);
hgs
parents:
diff changeset
  1083
    CleanupStack::Pop( iStoreFormat );
hgs
parents:
diff changeset
  1084
    TRAP_IGNORE( TLogDataStoreFormat::LogDataStoreFormatL( _L("iDataProvider->SetRemoteStoreFormatL()"), *iStoreFormat ));
hgs
parents:
diff changeset
  1085
    iDataStore->SetRemoteStoreFormatL( *iStoreFormat );
hgs
parents:
diff changeset
  1086
    
hgs
parents:
diff changeset
  1087
    CleanupStack::PopAndDestroy( &readStream );
hgs
parents:
diff changeset
  1088
    
hgs
parents:
diff changeset
  1089
    CompleteRequest( KErrNone );
hgs
parents:
diff changeset
  1090
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1091
    }
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
void CSconAsyncHandler::LeaveIfNoInstanceL()
hgs
parents:
diff changeset
  1094
    {
hgs
parents:
diff changeset
  1095
    if ( !iDataStore )
hgs
parents:
diff changeset
  1096
        {
hgs
parents:
diff changeset
  1097
        LOGGER_WRITE("DataStore instance was not ready, leaving KErrNotReady");
hgs
parents:
diff changeset
  1098
        User::Leave( KErrNotReady );
hgs
parents:
diff changeset
  1099
        }
hgs
parents:
diff changeset
  1100
    }
hgs
parents:
diff changeset
  1101
hgs
parents:
diff changeset
  1102
void CSconAsyncHandler::DoCloseStore()
hgs
parents:
diff changeset
  1103
    {
hgs
parents:
diff changeset
  1104
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1105
    delete iItems;
hgs
parents:
diff changeset
  1106
    iItems = NULL;
hgs
parents:
diff changeset
  1107
    delete iWriteData;
hgs
parents:
diff changeset
  1108
    iWriteData = NULL;
hgs
parents:
diff changeset
  1109
    if ( iDataProvider && iContext )
hgs
parents:
diff changeset
  1110
        {
hgs
parents:
diff changeset
  1111
        TInt providerId = iDataProvider->Identifier();
hgs
parents:
diff changeset
  1112
        TInt contextId = iContext->SyncTaskKey();
hgs
parents:
diff changeset
  1113
        TRAP_IGNORE( CSconSyncRelationship::SetTimeStampL( iFs, TUid::Uid(contextId), providerId) );
hgs
parents:
diff changeset
  1114
        }
hgs
parents:
diff changeset
  1115
    delete iDataStore;
hgs
parents:
diff changeset
  1116
    iDataStore = NULL;
hgs
parents:
diff changeset
  1117
    delete iDataProvider;
hgs
parents:
diff changeset
  1118
    iDataProvider = NULL;
hgs
parents:
diff changeset
  1119
    delete iContext;
hgs
parents:
diff changeset
  1120
    iContext = NULL;
hgs
parents:
diff changeset
  1121
    delete iStoreFormat;
hgs
parents:
diff changeset
  1122
    iStoreFormat = NULL;
hgs
parents:
diff changeset
  1123
    
hgs
parents:
diff changeset
  1124
    CleanOldStoresL();
hgs
parents:
diff changeset
  1125
    
hgs
parents:
diff changeset
  1126
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1127
    }
hgs
parents:
diff changeset
  1128
hgs
parents:
diff changeset
  1129
void CSconAsyncHandler::CleanOldStoresL()
hgs
parents:
diff changeset
  1130
    {
hgs
parents:
diff changeset
  1131
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1132
    TFileName path;
hgs
parents:
diff changeset
  1133
    User::LeaveIfError( iFs.PrivatePath( path ) );
hgs
parents:
diff changeset
  1134
    CDir* dir;
hgs
parents:
diff changeset
  1135
    iFs.GetDir( path, KEntryAttNormal, ESortByDate, dir );
hgs
parents:
diff changeset
  1136
    CleanupStack::PushL( dir );
hgs
parents:
diff changeset
  1137
    TInt storesCount(0);
hgs
parents:
diff changeset
  1138
    LOGGER_WRITE_1("count: %d", dir->Count() );
hgs
parents:
diff changeset
  1139
    for ( TInt i=dir->Count()-1; i >= 0; i-- )
hgs
parents:
diff changeset
  1140
        {
hgs
parents:
diff changeset
  1141
        LOGGER_WRITE_1("dir[%d]", i);
hgs
parents:
diff changeset
  1142
        TEntry entry = (*dir)[i];
hgs
parents:
diff changeset
  1143
        LOGGER_WRITE_1("file: %S", &entry.iName);
hgs
parents:
diff changeset
  1144
        _LIT(KContextStoreName, "contextstore");
hgs
parents:
diff changeset
  1145
        _LIT(KTimeStoreName, "timestore");
hgs
parents:
diff changeset
  1146
        if ( entry.iName.Find(KContextStoreName) == 0 )
hgs
parents:
diff changeset
  1147
            {
hgs
parents:
diff changeset
  1148
            storesCount++;
hgs
parents:
diff changeset
  1149
            LOGGER_WRITE_1("storeNro: %d", storesCount);
hgs
parents:
diff changeset
  1150
#ifdef _DEBUG
hgs
parents:
diff changeset
  1151
            TTime time = entry.iModified;
hgs
parents:
diff changeset
  1152
            TDateTime dt = time.DateTime();
hgs
parents:
diff changeset
  1153
            _LIT(KFormat, "%d.%d %02d:%02d");
hgs
parents:
diff changeset
  1154
            TFileName mod;
hgs
parents:
diff changeset
  1155
            mod.Format(KFormat, dt.Day()+1, dt.Month()+1, dt.Hour()+1,dt.Minute() );
hgs
parents:
diff changeset
  1156
            LOGGER_WRITE_1("time: %S", &mod);
hgs
parents:
diff changeset
  1157
#endif
hgs
parents:
diff changeset
  1158
            if ( storesCount > KMaxStoresCount )
hgs
parents:
diff changeset
  1159
                {
hgs
parents:
diff changeset
  1160
                LOGGER_WRITE_1("delete contextstore: '%S'", &entry.iName );
hgs
parents:
diff changeset
  1161
                iFs.Delete( entry.iName );
hgs
parents:
diff changeset
  1162
                TFileName timeStoreFile;
hgs
parents:
diff changeset
  1163
                timeStoreFile = entry.iName.Right(15);
hgs
parents:
diff changeset
  1164
                timeStoreFile.Insert(0, KTimeStoreName);
hgs
parents:
diff changeset
  1165
                LOGGER_WRITE_1("delete timeStoreFile: %S", &timeStoreFile);
hgs
parents:
diff changeset
  1166
                iFs.Delete( timeStoreFile );
hgs
parents:
diff changeset
  1167
                }
hgs
parents:
diff changeset
  1168
            }
hgs
parents:
diff changeset
  1169
        
hgs
parents:
diff changeset
  1170
        }
hgs
parents:
diff changeset
  1171
    CleanupStack::PopAndDestroy( dir );
hgs
parents:
diff changeset
  1172
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1173
    }
hgs
parents:
diff changeset
  1174
hgs
parents:
diff changeset
  1175
void CSconAsyncHandler::CompleteRequest( TInt aError )
hgs
parents:
diff changeset
  1176
    {
hgs
parents:
diff changeset
  1177
    TRACE_FUNC;
hgs
parents:
diff changeset
  1178
    iTimeOut->Cancel();
hgs
parents:
diff changeset
  1179
    LOGGER_WRITE_1("iMessage.Complete( %d )", aError);
hgs
parents:
diff changeset
  1180
    iMessage.Complete( aError );
hgs
parents:
diff changeset
  1181
    }