omads/omadsextensions/adapters/bookmark/src/bookmarkdatastore.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
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). 
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:  Part of SyncML Data Synchronization Plug In Adapter
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 <sysutil.h> 
hgs
parents:
diff changeset
    20
#include <favouritesitem.h>
hgs
parents:
diff changeset
    21
#include <favouritesitemlist.h> 
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
#include <feedsserverclient.h>
hgs
parents:
diff changeset
    24
#include <feedsserverfeed.h>
hgs
parents:
diff changeset
    25
#include <feedsserverfolderitem.h>
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include "bookmarkdatastore.h"
hgs
parents:
diff changeset
    28
#include "vbookmarkconverter.h"
hgs
parents:
diff changeset
    29
#include "omadsfolderobject.h"
hgs
parents:
diff changeset
    30
#include "bookmarkdataproviderdefs.h"
hgs
parents:
diff changeset
    31
#include "conversionutil.h"
hgs
parents:
diff changeset
    32
#include "changefinder.h"
hgs
parents:
diff changeset
    33
#include "logger.h"
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
_LIT8( KBookmarkFolderMimeType, "application/vnd.omads-folder+xml" );
hgs
parents:
diff changeset
    37
_LIT8( KBookmarkFolderMimeVersion, "" );
hgs
parents:
diff changeset
    38
_LIT8( KBookmarkItemMimeType, "text/x-vbookmark" );
hgs
parents:
diff changeset
    39
_LIT8( KBookmarkItemMimeVersion, "" );
hgs
parents:
diff changeset
    40
_LIT( KRSSRootFolderName, "Web Feeds" );
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
const TInt KDefaultBufferSize = 1024;
hgs
parents:
diff changeset
    43
const TInt KDataBufferNotReady = -1;
hgs
parents:
diff changeset
    44
const TInt KRssFeedsOffset = 50000;
hgs
parents:
diff changeset
    45
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    46
// CBookmarkDataStore::CBookmarkDataStore
hgs
parents:
diff changeset
    47
// C++ default constructor can NOT contain any code, that might leave.
hgs
parents:
diff changeset
    48
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
CBookmarkDataStore::CBookmarkDataStore() :
hgs
parents:
diff changeset
    50
    iDataBaseOpened( EFalse ), iFeedsServer(*this), iRootFolder(*this),
hgs
parents:
diff changeset
    51
    iKey( TKeyArrayFix( _FOFF( TNSmlSnapshotItem, ItemId() ), ECmpTInt ) ),
hgs
parents:
diff changeset
    52
    iHasHistory( EFalse )
hgs
parents:
diff changeset
    53
    {
hgs
parents:
diff changeset
    54
    LOGGER_ENTERFN( "CBookmarkDataStore" );
hgs
parents:
diff changeset
    55
    LOGGER_LEAVEFN( "CBookmarkDataStore" ); 
hgs
parents:
diff changeset
    56
    }
hgs
parents:
diff changeset
    57
    
hgs
parents:
diff changeset
    58
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
// CBookmarkDataStore::ConstructL
hgs
parents:
diff changeset
    60
// Symbian 2nd phase constructor, can leave.
hgs
parents:
diff changeset
    61
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
    62
void CBookmarkDataStore::ConstructL()
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    LOGGER_ENTERFN( "CBookmarkDataStore::ConstructL" );
hgs
parents:
diff changeset
    65
    
hgs
parents:
diff changeset
    66
    User::LeaveIfError( iRfs.Connect() );
hgs
parents:
diff changeset
    67
    User::LeaveIfError( iSession.Connect() );
hgs
parents:
diff changeset
    68
    
hgs
parents:
diff changeset
    69
    iNewItems = new ( ELeave ) CNSmlDataItemUidSet;
hgs
parents:
diff changeset
    70
    iDeletedItems = new ( ELeave ) CNSmlDataItemUidSet;
hgs
parents:
diff changeset
    71
    iSoftDeletedItems = new ( ELeave ) CNSmlDataItemUidSet;
hgs
parents:
diff changeset
    72
    iUpdatedItems = new ( ELeave ) CNSmlDataItemUidSet;
hgs
parents:
diff changeset
    73
    iMovedItems = new ( ELeave ) CNSmlDataItemUidSet;
hgs
parents:
diff changeset
    74
    
hgs
parents:
diff changeset
    75
    LOGGER_LEAVEFN( "CBookmarkDataStore::ConstructL" );
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
    
hgs
parents:
diff changeset
    78
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    79
// CBookmarkDataStore::~CBookmarkDataStore
hgs
parents:
diff changeset
    80
// Destructor
hgs
parents:
diff changeset
    81
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
    82
CBookmarkDataStore::~CBookmarkDataStore()
hgs
parents:
diff changeset
    83
    {
hgs
parents:
diff changeset
    84
    LOGGER_ENTERFN( "~CBookmarkDataStore" );
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    delete iDataBuffer;
hgs
parents:
diff changeset
    87
    delete iNewItems;
hgs
parents:
diff changeset
    88
    delete iDeletedItems;
hgs
parents:
diff changeset
    89
    delete iSoftDeletedItems;
hgs
parents:
diff changeset
    90
    delete iUpdatedItems;
hgs
parents:
diff changeset
    91
    delete iMovedItems;
hgs
parents:
diff changeset
    92
    delete iItemToBeReplaced;
hgs
parents:
diff changeset
    93
    
hgs
parents:
diff changeset
    94
    if ( iChangeFinder )
hgs
parents:
diff changeset
    95
        {
hgs
parents:
diff changeset
    96
        TRAPD( error, iChangeFinder->CloseL() );
hgs
parents:
diff changeset
    97
        if ( error != KErrNone )
hgs
parents:
diff changeset
    98
            {
hgs
parents:
diff changeset
    99
            LOGGER_WRITE_1( "iChangeFinder->CloseL() leaved with %d", error );
hgs
parents:
diff changeset
   100
            }
hgs
parents:
diff changeset
   101
        }
hgs
parents:
diff changeset
   102
    delete iChangeFinder;
hgs
parents:
diff changeset
   103
    
hgs
parents:
diff changeset
   104
    delete iConverter;
hgs
parents:
diff changeset
   105
            
hgs
parents:
diff changeset
   106
    if ( iDataBaseOpened )
hgs
parents:
diff changeset
   107
        {
hgs
parents:
diff changeset
   108
        iDb.Close();
hgs
parents:
diff changeset
   109
        iRootFolder.Close();
hgs
parents:
diff changeset
   110
        iFeedsServer.Close();
hgs
parents:
diff changeset
   111
        }
hgs
parents:
diff changeset
   112
    
hgs
parents:
diff changeset
   113
    iSession.Close();
hgs
parents:
diff changeset
   114
    iRfs.Close();
hgs
parents:
diff changeset
   115
    LOGGER_LEAVEFN( "~CBookmarkDataStore" );
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   119
// CBookmarkDataStore::NewL
hgs
parents:
diff changeset
   120
// Two-phased constructor.
hgs
parents:
diff changeset
   121
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   122
CBookmarkDataStore* CBookmarkDataStore::NewL()
hgs
parents:
diff changeset
   123
    {
hgs
parents:
diff changeset
   124
    LOGGER_ENTERFN( "CBookmarkDataStore::NewL" );
hgs
parents:
diff changeset
   125
    CBookmarkDataStore* self = CBookmarkDataStore::NewLC();
hgs
parents:
diff changeset
   126
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
   127
    LOGGER_LEAVEFN( "CBookmarkDataStore::NewL" );
hgs
parents:
diff changeset
   128
    return self;
hgs
parents:
diff changeset
   129
    }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   132
// CBookmarkDataStore::NewLC
hgs
parents:
diff changeset
   133
// Two-phased constructor.
hgs
parents:
diff changeset
   134
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
CBookmarkDataStore* CBookmarkDataStore::NewLC()
hgs
parents:
diff changeset
   136
    {
hgs
parents:
diff changeset
   137
    LOGGER_ENTERFN( "CBookmarkDataStore::NewLC" );
hgs
parents:
diff changeset
   138
    CBookmarkDataStore* self = new ( ELeave ) CBookmarkDataStore();
hgs
parents:
diff changeset
   139
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   140
    self->ConstructL();
hgs
parents:
diff changeset
   141
    LOGGER_LEAVEFN( "CBookmarkDataStore::NewLC" );
hgs
parents:
diff changeset
   142
    return self;
hgs
parents:
diff changeset
   143
    }
hgs
parents:
diff changeset
   144
hgs
parents:
diff changeset
   145
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
// CBookmarkDataStore::DoOpenL
hgs
parents:
diff changeset
   147
// Opens database.
hgs
parents:
diff changeset
   148
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   149
void CBookmarkDataStore::DoOpenL( const TDesC& /*aStoreName*/,
hgs
parents:
diff changeset
   150
    MSmlSyncRelationship& aContext, TRequestStatus& aStatus )
hgs
parents:
diff changeset
   151
    {
hgs
parents:
diff changeset
   152
    LOGGER_ENTERFN( "CBookmarkDataStore::DoOpenL" );
hgs
parents:
diff changeset
   153
    
hgs
parents:
diff changeset
   154
    iCallerStatus = &aStatus;           
hgs
parents:
diff changeset
   155
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
   156
    
hgs
parents:
diff changeset
   157
    if ( iDataBaseOpened )
hgs
parents:
diff changeset
   158
        {
hgs
parents:
diff changeset
   159
        User::RequestComplete( iCallerStatus, KErrInUse );
hgs
parents:
diff changeset
   160
        LOGGER_WRITE( "CBookmarkDataStore::DoOpenL failed with KErrInUse." );
hgs
parents:
diff changeset
   161
        return;
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
        
hgs
parents:
diff changeset
   164
    // Create ChangeFinder
hgs
parents:
diff changeset
   165
    if ( iChangeFinder )
hgs
parents:
diff changeset
   166
        {
hgs
parents:
diff changeset
   167
        delete iChangeFinder;
hgs
parents:
diff changeset
   168
        iChangeFinder = NULL;
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
    iChangeFinder = CChangeFinder::NewL( aContext, iKey, iHasHistory );
hgs
parents:
diff changeset
   171
    
hgs
parents:
diff changeset
   172
    // Create converter object
hgs
parents:
diff changeset
   173
    if ( iConverter )
hgs
parents:
diff changeset
   174
        {
hgs
parents:
diff changeset
   175
        delete iConverter;
hgs
parents:
diff changeset
   176
        iConverter = NULL;
hgs
parents:
diff changeset
   177
        }
hgs
parents:
diff changeset
   178
    iConverter = CBookmarkConversionUtil::NewL();
hgs
parents:
diff changeset
   179
    
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
    TInt err( KErrNone );       
hgs
parents:
diff changeset
   182
    err = iDb.Open( iSession, KBrowserBookmarks );
hgs
parents:
diff changeset
   183
    if ( err )
hgs
parents:
diff changeset
   184
        {
hgs
parents:
diff changeset
   185
        LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iDb.Open err: %d.", err );
hgs
parents:
diff changeset
   186
        User::RequestComplete( iCallerStatus, err );
hgs
parents:
diff changeset
   187
        return;
hgs
parents:
diff changeset
   188
        }
hgs
parents:
diff changeset
   189
    err = iFeedsServer.Connect();
hgs
parents:
diff changeset
   190
    if ( err )
hgs
parents:
diff changeset
   191
        {
hgs
parents:
diff changeset
   192
        LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iFeedsServer.Connect err: %d.", err );
hgs
parents:
diff changeset
   193
        User::RequestComplete( iCallerStatus, err );
hgs
parents:
diff changeset
   194
        return;
hgs
parents:
diff changeset
   195
        }
hgs
parents:
diff changeset
   196
    err = iRootFolder.Open( iFeedsServer );
hgs
parents:
diff changeset
   197
    if ( err )
hgs
parents:
diff changeset
   198
        {
hgs
parents:
diff changeset
   199
        LOGGER_WRITE_1( "CBookmarkDataStore::DoOpenL iRootFolder.Open err: %d.", err );
hgs
parents:
diff changeset
   200
        User::RequestComplete( iCallerStatus, err );
hgs
parents:
diff changeset
   201
        return;
hgs
parents:
diff changeset
   202
        }
hgs
parents:
diff changeset
   203
        
hgs
parents:
diff changeset
   204
    iRootFolder.FetchRootFolderItemL(); // calls FolderItemRequestCompleted when completed
hgs
parents:
diff changeset
   205
    
hgs
parents:
diff changeset
   206
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoOpenL" );
hgs
parents:
diff changeset
   207
    }
hgs
parents:
diff changeset
   208
hgs
parents:
diff changeset
   209
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   210
// CBookmarkDataStore::FolderItemRequestCompleted
hgs
parents:
diff changeset
   211
// RSS item database request is completed
hgs
parents:
diff changeset
   212
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   213
void CBookmarkDataStore::FolderItemRequestCompleted( TInt aStatus,
hgs
parents:
diff changeset
   214
    CRequestHandler::TRequestHandlerType )
hgs
parents:
diff changeset
   215
    {
hgs
parents:
diff changeset
   216
    LOGGER_ENTERFN( "CBookmarkDataStore::FolderItemRequestCompleted" );
hgs
parents:
diff changeset
   217
    
hgs
parents:
diff changeset
   218
    TRAPD( err, DoFolderItemRequestCompletedL( aStatus ) );
hgs
parents:
diff changeset
   219
    
hgs
parents:
diff changeset
   220
    if ( err != KErrNone )
hgs
parents:
diff changeset
   221
        {
hgs
parents:
diff changeset
   222
        LOGGER_WRITE_1( "DoFolderItemRequestCompletedL leaved with err: %d", err );
hgs
parents:
diff changeset
   223
        User::RequestComplete( iCallerStatus, err );
hgs
parents:
diff changeset
   224
        }
hgs
parents:
diff changeset
   225
    
hgs
parents:
diff changeset
   226
    LOGGER_LEAVEFN( "CBookmarkDataStore::FolderItemRequestCompleted" );
hgs
parents:
diff changeset
   227
    }
hgs
parents:
diff changeset
   228
hgs
parents:
diff changeset
   229
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   230
// CBookmarkDataStore::DoFolderItemRequestCompletedL
hgs
parents:
diff changeset
   231
// RSS item database request is completed
hgs
parents:
diff changeset
   232
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   233
void CBookmarkDataStore::DoFolderItemRequestCompletedL( TInt aStatus )
hgs
parents:
diff changeset
   234
    {
hgs
parents:
diff changeset
   235
    LOGGER_ENTERFN( "CBookmarkDataStore::DoFolderItemRequestCompletedL" );
hgs
parents:
diff changeset
   236
    switch ( iCurrentState )
hgs
parents:
diff changeset
   237
        {
hgs
parents:
diff changeset
   238
        case EClosed : 
hgs
parents:
diff changeset
   239
            {
hgs
parents:
diff changeset
   240
            LOGGER_WRITE("Database ready");
hgs
parents:
diff changeset
   241
            iDataBaseOpened = ETrue;
hgs
parents:
diff changeset
   242
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   243
            RegisterSnapshotL();
hgs
parents:
diff changeset
   244
            break;
hgs
parents:
diff changeset
   245
            }
hgs
parents:
diff changeset
   246
        
hgs
parents:
diff changeset
   247
        // bookmark is added (Add command)
hgs
parents:
diff changeset
   248
        case EBookmarkCreating :
hgs
parents:
diff changeset
   249
           	{
hgs
parents:
diff changeset
   250
           	// RSS Item has been created.
hgs
parents:
diff changeset
   251
           	LOGGER_WRITE_1("RSS item created, err %d", aStatus);
hgs
parents:
diff changeset
   252
           	// Restore state
hgs
parents:
diff changeset
   253
           	iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   254
            if ( aStatus == KErrNone )
hgs
parents:
diff changeset
   255
                {
hgs
parents:
diff changeset
   256
                RssItemCreatedL();
hgs
parents:
diff changeset
   257
                }
hgs
parents:
diff changeset
   258
            break;
hgs
parents:
diff changeset
   259
            }
hgs
parents:
diff changeset
   260
        
hgs
parents:
diff changeset
   261
        // bookmark is updated (Replace command)
hgs
parents:
diff changeset
   262
        case EBookmarkUpdating :
hgs
parents:
diff changeset
   263
            {
hgs
parents:
diff changeset
   264
            LOGGER_WRITE("RSS item replaced");
hgs
parents:
diff changeset
   265
            if ( aStatus == KErrNone )
hgs
parents:
diff changeset
   266
                {
hgs
parents:
diff changeset
   267
                TBool moveNeeded(EFalse);
hgs
parents:
diff changeset
   268
                RssItemReplacedL( moveNeeded );
hgs
parents:
diff changeset
   269
                
hgs
parents:
diff changeset
   270
                if ( moveNeeded )
hgs
parents:
diff changeset
   271
                    {
hgs
parents:
diff changeset
   272
                    // Moving is still ongoing, don't complete request yet.
hgs
parents:
diff changeset
   273
                    return;
hgs
parents:
diff changeset
   274
                    }
hgs
parents:
diff changeset
   275
                
hgs
parents:
diff changeset
   276
                LOGGER_WRITE_1("Item ID: %d", *iCurrentItem);
hgs
parents:
diff changeset
   277
                LOGGER_WRITE_1("Parent ID: %d", iParentFolder);
hgs
parents:
diff changeset
   278
                }
hgs
parents:
diff changeset
   279
            // Restore state
hgs
parents:
diff changeset
   280
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   281
            break;
hgs
parents:
diff changeset
   282
            }
hgs
parents:
diff changeset
   283
        
hgs
parents:
diff changeset
   284
        // bookmark is updated and moved (Replace command, 2nd phase)
hgs
parents:
diff changeset
   285
        case EBookmarkUpdatedAndMoving:
hgs
parents:
diff changeset
   286
            {
hgs
parents:
diff changeset
   287
            LOGGER_WRITE_1( "RSS item moved (replaced), err: %d", aStatus );
hgs
parents:
diff changeset
   288
            if ( aStatus == KErrNone )
hgs
parents:
diff changeset
   289
                {
hgs
parents:
diff changeset
   290
                // Inform ChangeFinder of updated item
hgs
parents:
diff changeset
   291
                iChangeFinder->ItemUpdatedL( *iMovedItem ); // ownership transferred
hgs
parents:
diff changeset
   292
                iMovedItem = NULL;
hgs
parents:
diff changeset
   293
                LOGGER_WRITE( "ItemReplacedL" );
hgs
parents:
diff changeset
   294
                }
hgs
parents:
diff changeset
   295
            else
hgs
parents:
diff changeset
   296
                {
hgs
parents:
diff changeset
   297
                delete iMovedItem;
hgs
parents:
diff changeset
   298
                iMovedItem = NULL;
hgs
parents:
diff changeset
   299
                }
hgs
parents:
diff changeset
   300
            // Restore state
hgs
parents:
diff changeset
   301
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   302
            break;
hgs
parents:
diff changeset
   303
            }
hgs
parents:
diff changeset
   304
        
hgs
parents:
diff changeset
   305
        // bookmark is moved (Move command)
hgs
parents:
diff changeset
   306
        case EBookmarkMoving:
hgs
parents:
diff changeset
   307
            {
hgs
parents:
diff changeset
   308
            LOGGER_WRITE_1( "RSS item moved, err: %d", aStatus );
hgs
parents:
diff changeset
   309
            if ( aStatus == KErrNone )
hgs
parents:
diff changeset
   310
                {
hgs
parents:
diff changeset
   311
                iChangeFinder->ItemMovedL( *iMovedItem ); // ownership transferred
hgs
parents:
diff changeset
   312
                iMovedItem = NULL;
hgs
parents:
diff changeset
   313
                }
hgs
parents:
diff changeset
   314
            else
hgs
parents:
diff changeset
   315
                {
hgs
parents:
diff changeset
   316
                delete iMovedItem;
hgs
parents:
diff changeset
   317
                iMovedItem = NULL;
hgs
parents:
diff changeset
   318
                }
hgs
parents:
diff changeset
   319
            // Restore state
hgs
parents:
diff changeset
   320
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   321
            break;
hgs
parents:
diff changeset
   322
            }
hgs
parents:
diff changeset
   323
            
hgs
parents:
diff changeset
   324
        case EBookmarkDeleting:
hgs
parents:
diff changeset
   325
            {
hgs
parents:
diff changeset
   326
            LOGGER_WRITE_1( "RSS item removed, err: %d", aStatus );
hgs
parents:
diff changeset
   327
            if ( aStatus == KErrNone )
hgs
parents:
diff changeset
   328
                {
hgs
parents:
diff changeset
   329
                // Inform ChangeFinder of the removed item
hgs
parents:
diff changeset
   330
                TSnapshotItem item( iReplaceItem );     
hgs
parents:
diff changeset
   331
                iChangeFinder->ItemDeletedL( item );
hgs
parents:
diff changeset
   332
                }
hgs
parents:
diff changeset
   333
            // Restore state
hgs
parents:
diff changeset
   334
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
   335
            break;
hgs
parents:
diff changeset
   336
            }
hgs
parents:
diff changeset
   337
        case EBookmarkDeletingAll:
hgs
parents:
diff changeset
   338
            {
hgs
parents:
diff changeset
   339
            LOGGER_WRITE_1( "all RSS items removed, err: %d", aStatus );
hgs
parents:
diff changeset
   340
            break;
hgs
parents:
diff changeset
   341
            }
hgs
parents:
diff changeset
   342
        
hgs
parents:
diff changeset
   343
        default :
hgs
parents:
diff changeset
   344
            LOGGER_WRITE_1( "Invalid state: %d", iCurrentState );
hgs
parents:
diff changeset
   345
            return;
hgs
parents:
diff changeset
   346
        }
hgs
parents:
diff changeset
   347
    User::RequestComplete( iCallerStatus, aStatus );
hgs
parents:
diff changeset
   348
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoFolderItemRequestCompletedL" ); 
hgs
parents:
diff changeset
   349
    }
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   352
// CBookmarkDataStore::RssItemCreatedL
hgs
parents:
diff changeset
   353
// Rss item has been created, add item to changefinder
hgs
parents:
diff changeset
   354
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   355
void CBookmarkDataStore::RssItemCreatedL()
hgs
parents:
diff changeset
   356
    {
hgs
parents:
diff changeset
   357
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   358
    if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
   359
        {
hgs
parents:
diff changeset
   360
        LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
   361
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   362
        }
hgs
parents:
diff changeset
   363
    const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
   364
    const CFolderItem* parent = rootFolder.Search( iParentFolder - KRssFeedsOffset );
hgs
parents:
diff changeset
   365
    if ( !parent )
hgs
parents:
diff changeset
   366
        {
hgs
parents:
diff changeset
   367
        LOGGER_WRITE( "parent folder not found" );
hgs
parents:
diff changeset
   368
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   369
        }
hgs
parents:
diff changeset
   370
    LOGGER_WRITE_1("parent->Id(): %d", parent->Id());
hgs
parents:
diff changeset
   371
    LOGGER_WRITE_1( "Name: %S", &iNewItemName );
hgs
parents:
diff changeset
   372
    const CFolderItem* addedItem = parent->Search( iNewItemName );
hgs
parents:
diff changeset
   373
    iNewItemName.Zero();
hgs
parents:
diff changeset
   374
    if ( addedItem )
hgs
parents:
diff changeset
   375
        {
hgs
parents:
diff changeset
   376
        LOGGER_WRITE_1("addedItem found, id: %d", addedItem->Id());
hgs
parents:
diff changeset
   377
        
hgs
parents:
diff changeset
   378
        // Output the uid value of new item
hgs
parents:
diff changeset
   379
        *iCurrentItem = addedItem->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   380
        
hgs
parents:
diff changeset
   381
        // Inform ChangeFinder of the added item
hgs
parents:
diff changeset
   382
        TSnapshotItem snapshotItem( *iCurrentItem );
hgs
parents:
diff changeset
   383
        snapshotItem.SetParentId( iParentFolder );
hgs
parents:
diff changeset
   384
        snapshotItem.CreateHashL( addedItem->Name(), addedItem->SourceUrl() );
hgs
parents:
diff changeset
   385
        iChangeFinder->ItemAddedL( snapshotItem );
hgs
parents:
diff changeset
   386
        LOGGER_WRITE( "ItemAddedL" );
hgs
parents:
diff changeset
   387
        }
hgs
parents:
diff changeset
   388
    else
hgs
parents:
diff changeset
   389
        {
hgs
parents:
diff changeset
   390
        LOGGER_WRITE( "Added item not found" );
hgs
parents:
diff changeset
   391
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   392
        }
hgs
parents:
diff changeset
   393
    LOGGER_WRITE_1("Item ID: %d", *iCurrentItem);
hgs
parents:
diff changeset
   394
    LOGGER_WRITE_1("Parent ID: %d", iParentFolder);
hgs
parents:
diff changeset
   395
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   396
    }
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   399
// CBookmarkDataStore::RssItemReplacedL
hgs
parents:
diff changeset
   400
// Rss item has been replaced, update changefinder
hgs
parents:
diff changeset
   401
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   402
void CBookmarkDataStore::RssItemReplacedL( TBool& aMoveNeeded )
hgs
parents:
diff changeset
   403
    {
hgs
parents:
diff changeset
   404
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
   405
    aMoveNeeded = EFalse;
hgs
parents:
diff changeset
   406
    if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
   407
        {
hgs
parents:
diff changeset
   408
        LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
   409
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   410
        }
hgs
parents:
diff changeset
   411
    const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
   412
    LOGGER_WRITE_1( "rootFolder.Search %d", iReplaceItem - KRssFeedsOffset );
hgs
parents:
diff changeset
   413
    const CFolderItem* modItem = rootFolder.Search( iReplaceItem - KRssFeedsOffset );
hgs
parents:
diff changeset
   414
    if ( modItem )
hgs
parents:
diff changeset
   415
        {
hgs
parents:
diff changeset
   416
        LOGGER_WRITE_1("Item found, id: %d", modItem->Id());
hgs
parents:
diff changeset
   417
        
hgs
parents:
diff changeset
   418
        const CFolderItem* parent = modItem->Parent();
hgs
parents:
diff changeset
   419
        if ( parent )
hgs
parents:
diff changeset
   420
            {
hgs
parents:
diff changeset
   421
            TInt currentParent = parent->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   422
            if ( iParentFolder != parent->Id() + KRssFeedsOffset )
hgs
parents:
diff changeset
   423
                {
hgs
parents:
diff changeset
   424
                // move to another folder
hgs
parents:
diff changeset
   425
                const CFolderItem* newParent = rootFolder.Search(
hgs
parents:
diff changeset
   426
                    iParentFolder - KRssFeedsOffset );
hgs
parents:
diff changeset
   427
                if ( !newParent )
hgs
parents:
diff changeset
   428
                    {
hgs
parents:
diff changeset
   429
                    // new parent not found
hgs
parents:
diff changeset
   430
                    LOGGER_WRITE( "new parent not found" );
hgs
parents:
diff changeset
   431
                    User::Leave( KErrPathNotFound );
hgs
parents:
diff changeset
   432
                    }
hgs
parents:
diff changeset
   433
                else if ( !newParent->IsFolder() )
hgs
parents:
diff changeset
   434
                    {
hgs
parents:
diff changeset
   435
                    // not a folder
hgs
parents:
diff changeset
   436
                    LOGGER_WRITE( "parent is not a folder" );
hgs
parents:
diff changeset
   437
                    User::Leave( KErrPathNotFound );
hgs
parents:
diff changeset
   438
                    }
hgs
parents:
diff changeset
   439
                else
hgs
parents:
diff changeset
   440
                    {
hgs
parents:
diff changeset
   441
                    // Output the uid value of new item
hgs
parents:
diff changeset
   442
                    *iCurrentItem = modItem->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   443
        
hgs
parents:
diff changeset
   444
                    iCurrentState = EBookmarkUpdatedAndMoving;
hgs
parents:
diff changeset
   445
                    RPointerArray<const CFolderItem> movedItems;
hgs
parents:
diff changeset
   446
                    CleanupClosePushL( movedItems );
64
hgs
parents: 40
diff changeset
   447
                    movedItems.AppendL( modItem );
40
hgs
parents:
diff changeset
   448
                    // FolderItemRequestCompleted is called when ready
hgs
parents:
diff changeset
   449
                    iRootFolder.MoveFolderItemsToL( movedItems, *newParent);
hgs
parents:
diff changeset
   450
                    CleanupStack::PopAndDestroy( &movedItems );
hgs
parents:
diff changeset
   451
                    aMoveNeeded = ETrue;
hgs
parents:
diff changeset
   452
                    
hgs
parents:
diff changeset
   453
                    delete iMovedItem;
hgs
parents:
diff changeset
   454
                    iMovedItem = NULL;
hgs
parents:
diff changeset
   455
                    iMovedItem = new (ELeave) TSnapshotItem( *iCurrentItem ,
hgs
parents:
diff changeset
   456
                        iParentFolder );
hgs
parents:
diff changeset
   457
                    iMovedItem->CreateHashL( modItem->Name(), modItem->SourceUrl() );
hgs
parents:
diff changeset
   458
                    LOGGER_WRITE( "ItemReplacedL,waiting to move item.." );
hgs
parents:
diff changeset
   459
                    return;
hgs
parents:
diff changeset
   460
                    }
hgs
parents:
diff changeset
   461
                
hgs
parents:
diff changeset
   462
                }
hgs
parents:
diff changeset
   463
            }
hgs
parents:
diff changeset
   464
        else
hgs
parents:
diff changeset
   465
            {
hgs
parents:
diff changeset
   466
            //parent not found
hgs
parents:
diff changeset
   467
            LOGGER_WRITE( "rss parent not defined" );
hgs
parents:
diff changeset
   468
            }
hgs
parents:
diff changeset
   469
        
hgs
parents:
diff changeset
   470
        // Output the uid value of new item
hgs
parents:
diff changeset
   471
        *iCurrentItem = modItem->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   472
        
hgs
parents:
diff changeset
   473
        // Inform ChangeFinder of updated item
hgs
parents:
diff changeset
   474
        TSnapshotItem snapshotItem( *iCurrentItem, iParentFolder );
hgs
parents:
diff changeset
   475
        snapshotItem.CreateHashL( modItem->Name(), modItem->SourceUrl() );
hgs
parents:
diff changeset
   476
        iChangeFinder->ItemUpdatedL( snapshotItem );
hgs
parents:
diff changeset
   477
        LOGGER_WRITE( "ItemReplacedL" );
hgs
parents:
diff changeset
   478
        }
hgs
parents:
diff changeset
   479
    else
hgs
parents:
diff changeset
   480
        {
hgs
parents:
diff changeset
   481
        LOGGER_WRITE_1( "Replaced item %d not found",iReplaceItem - KRssFeedsOffset );
hgs
parents:
diff changeset
   482
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   483
        }
hgs
parents:
diff changeset
   484
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
   485
    }
hgs
parents:
diff changeset
   486
hgs
parents:
diff changeset
   487
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   488
// CBookmarkDataStore::DoCancelRequest
hgs
parents:
diff changeset
   489
// Not supported, does nothing.
hgs
parents:
diff changeset
   490
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
void CBookmarkDataStore::DoCancelRequest()
hgs
parents:
diff changeset
   492
    {
hgs
parents:
diff changeset
   493
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCancelRequest" );
hgs
parents:
diff changeset
   494
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCancelRequest" );    
hgs
parents:
diff changeset
   495
    }
hgs
parents:
diff changeset
   496
hgs
parents:
diff changeset
   497
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   498
// CBookmarkDataStore::DoStoreName
hgs
parents:
diff changeset
   499
// Returns the name of the DataStore
hgs
parents:
diff changeset
   500
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   501
const TDesC& CBookmarkDataStore::DoStoreName() const
hgs
parents:
diff changeset
   502
    {
hgs
parents:
diff changeset
   503
    LOGGER_ENTERFN( "CBookmarkDataStore::DoStoreName" );
hgs
parents:
diff changeset
   504
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoStoreName" );
hgs
parents:
diff changeset
   505
    
hgs
parents:
diff changeset
   506
    if ( iDataBaseOpened )
hgs
parents:
diff changeset
   507
        {
hgs
parents:
diff changeset
   508
        return KBrowserBookmarks;
hgs
parents:
diff changeset
   509
        }
hgs
parents:
diff changeset
   510
    else
hgs
parents:
diff changeset
   511
        {
hgs
parents:
diff changeset
   512
        return KNullDesC;
hgs
parents:
diff changeset
   513
        }
hgs
parents:
diff changeset
   514
    }
hgs
parents:
diff changeset
   515
    
hgs
parents:
diff changeset
   516
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   517
// CBookmarkDataStore::DoBeginTransactionL
hgs
parents:
diff changeset
   518
// Transactions are not supported.
hgs
parents:
diff changeset
   519
// -----------------------------------------------------------------------------    
hgs
parents:
diff changeset
   520
void CBookmarkDataStore::DoBeginTransactionL()
hgs
parents:
diff changeset
   521
    {
hgs
parents:
diff changeset
   522
    LOGGER_ENTERFN( "CBookmarkDataStore::DoBeginTransactionL" );
hgs
parents:
diff changeset
   523
    LOGGER_WRITE( "CBookmarkDataStore::DoBeginTransactionL leaved with KErrNotSupported." )
hgs
parents:
diff changeset
   524
    User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   525
    }
hgs
parents:
diff changeset
   526
hgs
parents:
diff changeset
   527
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   528
// CBookmarkDataStore::DoCommitTransactionL
hgs
parents:
diff changeset
   529
// Transactions are not supported.
hgs
parents:
diff changeset
   530
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
void CBookmarkDataStore::DoCommitTransactionL( TRequestStatus& aStatus )
hgs
parents:
diff changeset
   532
    {
hgs
parents:
diff changeset
   533
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitTransactionL" );
hgs
parents:
diff changeset
   534
    LOGGER_WRITE( "CBookmarkDataStore::DoCommitTransactionL failed with KErrNotSupported." );
hgs
parents:
diff changeset
   535
    
hgs
parents:
diff changeset
   536
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   537
    User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   538
    
hgs
parents:
diff changeset
   539
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitTransactionL" );
hgs
parents:
diff changeset
   540
    }
hgs
parents:
diff changeset
   541
hgs
parents:
diff changeset
   542
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   543
// CBookmarkDataStore::DoRevertTransaction
hgs
parents:
diff changeset
   544
// Transactions are not supported.
hgs
parents:
diff changeset
   545
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   546
void CBookmarkDataStore::DoRevertTransaction( TRequestStatus& aStatus )
hgs
parents:
diff changeset
   547
    {
hgs
parents:
diff changeset
   548
    LOGGER_ENTERFN( "CBookmarkDataStore::DoRevertTransaction" );
hgs
parents:
diff changeset
   549
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   550
    User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   551
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoRevertTransaction" );
hgs
parents:
diff changeset
   552
    }
hgs
parents:
diff changeset
   553
hgs
parents:
diff changeset
   554
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   555
// CBookmarkDataStore::DoBeginBatchL
hgs
parents:
diff changeset
   556
// Batching is not supported.
hgs
parents:
diff changeset
   557
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   558
void CBookmarkDataStore::DoBeginBatchL()
hgs
parents:
diff changeset
   559
    {
hgs
parents:
diff changeset
   560
    LOGGER_ENTERFN( "CBookmarkDataStore::DoBeginBatchL" );
hgs
parents:
diff changeset
   561
    LOGGER_WRITE( "CBookmarkDataStore::DoBeginBatchL leaved with KErrNotSupported." );
hgs
parents:
diff changeset
   562
    User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   563
    }
hgs
parents:
diff changeset
   564
hgs
parents:
diff changeset
   565
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   566
// CBookmarkDataStore::DoCommitBatchL
hgs
parents:
diff changeset
   567
// Batching is not supported
hgs
parents:
diff changeset
   568
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   569
void CBookmarkDataStore::DoCommitBatchL( RArray<TInt>& /*aResultArray*/, TRequestStatus& aStatus )
hgs
parents:
diff changeset
   570
    {
hgs
parents:
diff changeset
   571
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitBatchL" );
hgs
parents:
diff changeset
   572
    LOGGER_WRITE( "CBookmarkDataStore::DoCommitBatchL failed with KErrNotSupported" );
hgs
parents:
diff changeset
   573
        
hgs
parents:
diff changeset
   574
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   575
    User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   576
    
hgs
parents:
diff changeset
   577
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitBatchL" );
hgs
parents:
diff changeset
   578
    }
hgs
parents:
diff changeset
   579
hgs
parents:
diff changeset
   580
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   581
// CBookmarkDataStore::DoCancelBatch
hgs
parents:
diff changeset
   582
// Batching is not supported
hgs
parents:
diff changeset
   583
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   584
void CBookmarkDataStore::DoCancelBatch()
hgs
parents:
diff changeset
   585
    {
hgs
parents:
diff changeset
   586
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCancelBatch" );
hgs
parents:
diff changeset
   587
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCancelBatch" );
hgs
parents:
diff changeset
   588
    }
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   591
// CBookmarkDataStore::DoSetRemoteStoreFormatL
hgs
parents:
diff changeset
   592
// Not supported
hgs
parents:
diff changeset
   593
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   594
void CBookmarkDataStore::DoSetRemoteStoreFormatL( const CSmlDataStoreFormat& /*aServerDataStoreFormat*/ )
hgs
parents:
diff changeset
   595
    {
hgs
parents:
diff changeset
   596
    LOGGER_ENTERFN( "CBookmarkDataStore::DoSetRemoteStoreFormatL" );
hgs
parents:
diff changeset
   597
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoSetRemoteStoreFormatL" );
hgs
parents:
diff changeset
   598
    }
hgs
parents:
diff changeset
   599
    
hgs
parents:
diff changeset
   600
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   601
// CBookmarkDataStore::DoSetRemoteMaxObjectSize
hgs
parents:
diff changeset
   602
// Not supported
hgs
parents:
diff changeset
   603
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   604
void CBookmarkDataStore::DoSetRemoteMaxObjectSize( TInt /*aServerMaxObjectSize*/ )
hgs
parents:
diff changeset
   605
    {
hgs
parents:
diff changeset
   606
    LOGGER_ENTERFN( "CBookmarkDataStore::DoSetRemoteMaxObjectSize" );
hgs
parents:
diff changeset
   607
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoSetRemoteMaxObjectSize" );   
hgs
parents:
diff changeset
   608
    }
hgs
parents:
diff changeset
   609
hgs
parents:
diff changeset
   610
hgs
parents:
diff changeset
   611
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   612
// CBookmarkDataStore::DoMaxObjectSize
hgs
parents:
diff changeset
   613
// Reads the maximum object size from the central repository
hgs
parents:
diff changeset
   614
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   615
TInt CBookmarkDataStore::DoMaxObjectSize() const
hgs
parents:
diff changeset
   616
    {
hgs
parents:
diff changeset
   617
    LOGGER_ENTERFN( "CBookmarkDataStore::DoMaxObjectSize" );
hgs
parents:
diff changeset
   618
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoMaxObjectSize" );    
hgs
parents:
diff changeset
   619
    return 0; // no limit
hgs
parents:
diff changeset
   620
    }
hgs
parents:
diff changeset
   621
hgs
parents:
diff changeset
   622
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   623
// CBookmarkDataStore::DoOpenItemL
hgs
parents:
diff changeset
   624
// Opens item in the DataStore, reads it (either completely or partially) 
hgs
parents:
diff changeset
   625
// to the temporary buffer where it can be later read to the remote database.
hgs
parents:
diff changeset
   626
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   627
void CBookmarkDataStore::DoOpenItemL(
hgs
parents:
diff changeset
   628
    TSmlDbItemUid aUid, 
hgs
parents:
diff changeset
   629
    TBool& aFieldChange, 
hgs
parents:
diff changeset
   630
    TInt& aSize, 
hgs
parents:
diff changeset
   631
    TSmlDbItemUid& aParent, 
hgs
parents:
diff changeset
   632
    TDes8& aMimeType, 
hgs
parents:
diff changeset
   633
    TDes8& aMimeVer, 
hgs
parents:
diff changeset
   634
    TRequestStatus& aStatus )
hgs
parents:
diff changeset
   635
    {
hgs
parents:
diff changeset
   636
    LOGGER_ENTERFN( "CBookmarkDataStore::DoOpenItemL" );
hgs
parents:
diff changeset
   637
    LOGGER_WRITE_1( "Item: %d", aUid );
hgs
parents:
diff changeset
   638
    
hgs
parents:
diff changeset
   639
    
hgs
parents:
diff changeset
   640
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   641
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
   642
    
hgs
parents:
diff changeset
   643
    aFieldChange = EFalse;
hgs
parents:
diff changeset
   644
    
hgs
parents:
diff changeset
   645
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
   646
        {
hgs
parents:
diff changeset
   647
        LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState );
hgs
parents:
diff changeset
   648
        }
hgs
parents:
diff changeset
   649
    
hgs
parents:
diff changeset
   650
    SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
   651
    iDataBuffer = CBufFlat::NewL( KDefaultBufferSize ); 
hgs
parents:
diff changeset
   652
    iReaderPosition = 0;
hgs
parents:
diff changeset
   653
    if ( aUid < KRssFeedsOffset )
hgs
parents:
diff changeset
   654
        {
hgs
parents:
diff changeset
   655
        LOGGER_WRITE( "Handle id as bookmark item " );
hgs
parents:
diff changeset
   656
        TInt err( KErrNone );   
hgs
parents:
diff changeset
   657
        CFavouritesItem* item = CFavouritesItem::NewLC();
hgs
parents:
diff changeset
   658
        err = iDb.Get( aUid, *item );
hgs
parents:
diff changeset
   659
        if (err)
hgs
parents:
diff changeset
   660
            {
hgs
parents:
diff changeset
   661
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   662
            LOGGER_WRITE_1( "RFavouritesDb::Get failed with %d", err );
hgs
parents:
diff changeset
   663
            CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
   664
            return;
hgs
parents:
diff changeset
   665
            }
hgs
parents:
diff changeset
   666
            
hgs
parents:
diff changeset
   667
        
hgs
parents:
diff changeset
   668
        
hgs
parents:
diff changeset
   669
        iConverter->FavouritesItemToBufferL( *item, *iDataBuffer );
hgs
parents:
diff changeset
   670
        aSize = iDataBuffer->Size();
hgs
parents:
diff changeset
   671
        aParent = item->ParentFolder();
hgs
parents:
diff changeset
   672
hgs
parents:
diff changeset
   673
        // Set mime type according to item type
hgs
parents:
diff changeset
   674
        // The following code handles also the case, where the receiving
hgs
parents:
diff changeset
   675
        // buffer doesn't contain enough space for the type (truncated)
hgs
parents:
diff changeset
   676
        if ( item->Type() == CFavouritesItem::EItem )
hgs
parents:
diff changeset
   677
            {
hgs
parents:
diff changeset
   678
            LOGGER_WRITE("item type: EItem");
hgs
parents:
diff changeset
   679
            AssignString( aMimeType, KBookmarkItemMimeType );
hgs
parents:
diff changeset
   680
            AssignString( aMimeVer, KBookmarkItemMimeVersion );
hgs
parents:
diff changeset
   681
            }
hgs
parents:
diff changeset
   682
        else
hgs
parents:
diff changeset
   683
            {
hgs
parents:
diff changeset
   684
            LOGGER_WRITE("item type: EFolder");
hgs
parents:
diff changeset
   685
            AssignString( aMimeType, KBookmarkFolderMimeType );
hgs
parents:
diff changeset
   686
            AssignString( aMimeVer, KBookmarkFolderMimeVersion );
hgs
parents:
diff changeset
   687
            }
hgs
parents:
diff changeset
   688
hgs
parents:
diff changeset
   689
        CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
   690
        }
hgs
parents:
diff changeset
   691
    else
hgs
parents:
diff changeset
   692
        {
hgs
parents:
diff changeset
   693
        LOGGER_WRITE( "Handle id as rssFeed item " );
hgs
parents:
diff changeset
   694
        
hgs
parents:
diff changeset
   695
        TInt rssId = aUid - KRssFeedsOffset;
hgs
parents:
diff changeset
   696
        LOGGER_WRITE_1( "rssId: %d", rssId );
hgs
parents:
diff changeset
   697
        
hgs
parents:
diff changeset
   698
        if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
   699
            {
hgs
parents:
diff changeset
   700
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   701
            LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
   702
            return;
hgs
parents:
diff changeset
   703
            }
hgs
parents:
diff changeset
   704
        
hgs
parents:
diff changeset
   705
        const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
   706
        const CFolderItem* founded = rootFolder.Search( rssId );
hgs
parents:
diff changeset
   707
        if ( founded )
hgs
parents:
diff changeset
   708
            {
hgs
parents:
diff changeset
   709
            LOGGER_WRITE( "Item found" );
hgs
parents:
diff changeset
   710
            const CFolderItem* parent = founded->Parent();
hgs
parents:
diff changeset
   711
            if ( parent )
hgs
parents:
diff changeset
   712
                {
hgs
parents:
diff changeset
   713
                LOGGER_WRITE( "parent found" );
hgs
parents:
diff changeset
   714
                aParent = parent->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   715
                }
hgs
parents:
diff changeset
   716
            else
hgs
parents:
diff changeset
   717
                {
hgs
parents:
diff changeset
   718
                LOGGER_WRITE( "no parent (root)" );
hgs
parents:
diff changeset
   719
                aParent = KErrNotFound;// rootFolder.Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   720
                }
hgs
parents:
diff changeset
   721
            
hgs
parents:
diff changeset
   722
            if ( !founded->IsFolder() )
hgs
parents:
diff changeset
   723
                {
hgs
parents:
diff changeset
   724
                LOGGER_WRITE("item type: EItem");
hgs
parents:
diff changeset
   725
                AssignString( aMimeType, KBookmarkItemMimeType );
hgs
parents:
diff changeset
   726
                AssignString( aMimeVer, KBookmarkItemMimeVersion );
hgs
parents:
diff changeset
   727
                }
hgs
parents:
diff changeset
   728
            else
hgs
parents:
diff changeset
   729
                {
hgs
parents:
diff changeset
   730
                LOGGER_WRITE("item type: EFolder");
hgs
parents:
diff changeset
   731
                AssignString( aMimeType, KBookmarkFolderMimeType );
hgs
parents:
diff changeset
   732
                AssignString( aMimeVer, KBookmarkFolderMimeVersion );
hgs
parents:
diff changeset
   733
                }
hgs
parents:
diff changeset
   734
            iConverter->RssItemToBufferL( *founded, *iDataBuffer );
hgs
parents:
diff changeset
   735
            aSize = iDataBuffer->Size();
hgs
parents:
diff changeset
   736
            
hgs
parents:
diff changeset
   737
            }
hgs
parents:
diff changeset
   738
        else
hgs
parents:
diff changeset
   739
            {
hgs
parents:
diff changeset
   740
            LOGGER_WRITE( "Item not found" );
hgs
parents:
diff changeset
   741
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   742
            return;
hgs
parents:
diff changeset
   743
            }
hgs
parents:
diff changeset
   744
        
hgs
parents:
diff changeset
   745
        }
hgs
parents:
diff changeset
   746
    
hgs
parents:
diff changeset
   747
    User::RequestComplete( iCallerStatus, KErrNone );   
hgs
parents:
diff changeset
   748
    iCurrentState = EBookmarkOpen;
hgs
parents:
diff changeset
   749
    
hgs
parents:
diff changeset
   750
#ifdef _DEBUG
hgs
parents:
diff changeset
   751
    LOGGER_WRITE_1( "aFieldChange: %d", (TInt)aFieldChange );
hgs
parents:
diff changeset
   752
    LOGGER_WRITE_1( "aSize: %d", aSize );
hgs
parents:
diff changeset
   753
    LOGGER_WRITE_1( "aParent: %d", aParent );
hgs
parents:
diff changeset
   754
    TPtr8 bufPtr = iDataBuffer->Ptr(0);
hgs
parents:
diff changeset
   755
    LOGGER_WRITE8_1( "iDataBuffer: %S", &bufPtr);
hgs
parents:
diff changeset
   756
#endif
hgs
parents:
diff changeset
   757
hgs
parents:
diff changeset
   758
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoOpenItemL" );        
hgs
parents:
diff changeset
   759
    }
hgs
parents:
diff changeset
   760
hgs
parents:
diff changeset
   761
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   762
// CBookmarkDataStore::DoCreateItemL
hgs
parents:
diff changeset
   763
// Create new item to the message store.
hgs
parents:
diff changeset
   764
// Return the id number of the newly created item
hgs
parents:
diff changeset
   765
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   766
void CBookmarkDataStore::DoCreateItemL(
hgs
parents:
diff changeset
   767
    TSmlDbItemUid& aUid, 
hgs
parents:
diff changeset
   768
    TInt aSize, 
hgs
parents:
diff changeset
   769
    TSmlDbItemUid aParent, 
hgs
parents:
diff changeset
   770
    const TDesC8& aMimeType, 
hgs
parents:
diff changeset
   771
    const TDesC8& /*aMimeVer*/, 
hgs
parents:
diff changeset
   772
    TRequestStatus& aStatus )
hgs
parents:
diff changeset
   773
    {
hgs
parents:
diff changeset
   774
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCreateItemL" );
hgs
parents:
diff changeset
   775
    LOGGER_WRITE_1( "aParent: %d", aParent );
hgs
parents:
diff changeset
   776
    LOGGER_WRITE8_1( "aMimeType: %S", &aMimeType );
hgs
parents:
diff changeset
   777
    
hgs
parents:
diff changeset
   778
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   779
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
   780
    
hgs
parents:
diff changeset
   781
    delete iItemToBeReplaced;
hgs
parents:
diff changeset
   782
    iItemToBeReplaced = NULL;
hgs
parents:
diff changeset
   783
    
hgs
parents:
diff changeset
   784
    // Check MIME type
hgs
parents:
diff changeset
   785
    if ( aMimeType.Compare( KBookmarkFolderMimeType() ) == 0 )  
hgs
parents:
diff changeset
   786
        {
hgs
parents:
diff changeset
   787
        LOGGER_WRITE("item type: EFolder");
hgs
parents:
diff changeset
   788
        iMimeType = CFavouritesItem::EFolder;
hgs
parents:
diff changeset
   789
        }
hgs
parents:
diff changeset
   790
    else if ( aMimeType.Compare( KBookmarkItemMimeType() ) == 0 )
hgs
parents:
diff changeset
   791
        {
hgs
parents:
diff changeset
   792
        LOGGER_WRITE("item type: EItem");
hgs
parents:
diff changeset
   793
        iMimeType = CFavouritesItem::EItem;
hgs
parents:
diff changeset
   794
        }
hgs
parents:
diff changeset
   795
    else
hgs
parents:
diff changeset
   796
        {
hgs
parents:
diff changeset
   797
        User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   798
        LOGGER_WRITE( "Unexpected mime type" );
hgs
parents:
diff changeset
   799
        return;
hgs
parents:
diff changeset
   800
        }   
hgs
parents:
diff changeset
   801
    
hgs
parents:
diff changeset
   802
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
   803
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
   804
        {
hgs
parents:
diff changeset
   805
        LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState );
hgs
parents:
diff changeset
   806
        }
hgs
parents:
diff changeset
   807
        
hgs
parents:
diff changeset
   808
    // Ensure that we've got enough disk space for the item
hgs
parents:
diff changeset
   809
    if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, EDriveC ) )
hgs
parents:
diff changeset
   810
        {
hgs
parents:
diff changeset
   811
        User::RequestComplete( iCallerStatus, KErrDiskFull );
hgs
parents:
diff changeset
   812
        LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." );
hgs
parents:
diff changeset
   813
        return;
hgs
parents:
diff changeset
   814
        }
hgs
parents:
diff changeset
   815
    
hgs
parents:
diff changeset
   816
    if ( aParent < KRssFeedsOffset )
hgs
parents:
diff changeset
   817
        {
hgs
parents:
diff changeset
   818
        LOGGER_WRITE( "Handle id as bookmark item" );
hgs
parents:
diff changeset
   819
        // Ensure that parent folder exists 
hgs
parents:
diff changeset
   820
        TBool folderExists( EFalse );   
hgs
parents:
diff changeset
   821
        TInt err = iDb.FolderExists( aParent, folderExists );
hgs
parents:
diff changeset
   822
        if ( err || !folderExists )
hgs
parents:
diff changeset
   823
            {
hgs
parents:
diff changeset
   824
            User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
   825
            LOGGER_WRITE_1( "iDb.FolderExist returned %d, folder not found", err );
hgs
parents:
diff changeset
   826
            return;
hgs
parents:
diff changeset
   827
            }
hgs
parents:
diff changeset
   828
        
hgs
parents:
diff changeset
   829
        }
hgs
parents:
diff changeset
   830
    else
hgs
parents:
diff changeset
   831
        {
hgs
parents:
diff changeset
   832
        LOGGER_WRITE( "Handle id as rssFeed item " );
hgs
parents:
diff changeset
   833
        
hgs
parents:
diff changeset
   834
        TInt rssId = aParent - KRssFeedsOffset;
hgs
parents:
diff changeset
   835
        LOGGER_WRITE_1( "parentRssId: %d", rssId );
hgs
parents:
diff changeset
   836
        
hgs
parents:
diff changeset
   837
        if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
   838
            {
hgs
parents:
diff changeset
   839
            User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
   840
            LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
   841
            return;
hgs
parents:
diff changeset
   842
            }
hgs
parents:
diff changeset
   843
        
hgs
parents:
diff changeset
   844
        const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
   845
        const CFolderItem* founded = rootFolder.Search( rssId );
hgs
parents:
diff changeset
   846
        TBool folderExists( EFalse );
hgs
parents:
diff changeset
   847
        if ( founded )
hgs
parents:
diff changeset
   848
            {
hgs
parents:
diff changeset
   849
            if ( founded->IsFolder() )
hgs
parents:
diff changeset
   850
                {
hgs
parents:
diff changeset
   851
                folderExists = ETrue;
hgs
parents:
diff changeset
   852
                }
hgs
parents:
diff changeset
   853
            }
hgs
parents:
diff changeset
   854
        if ( !folderExists )
hgs
parents:
diff changeset
   855
            {
hgs
parents:
diff changeset
   856
            User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
   857
            LOGGER_WRITE( "Folder does not exist" );
hgs
parents:
diff changeset
   858
            return;
hgs
parents:
diff changeset
   859
            }
hgs
parents:
diff changeset
   860
        }
hgs
parents:
diff changeset
   861
    
hgs
parents:
diff changeset
   862
    iCurrentState = EBookmarkCreating;
hgs
parents:
diff changeset
   863
    // Store parent for further use 
hgs
parents:
diff changeset
   864
    iParentFolder = aParent;    
hgs
parents:
diff changeset
   865
                
hgs
parents:
diff changeset
   866
    SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
   867
    iDataBuffer = CBufFlat::NewL( KDefaultBufferSize );
hgs
parents:
diff changeset
   868
    iWriterPosition = 0;
hgs
parents:
diff changeset
   869
        
hgs
parents:
diff changeset
   870
    iCurrentItem = &aUid;   
hgs
parents:
diff changeset
   871
    
hgs
parents:
diff changeset
   872
    
hgs
parents:
diff changeset
   873
    User::RequestComplete( iCallerStatus, KErrNone );
hgs
parents:
diff changeset
   874
        
hgs
parents:
diff changeset
   875
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCreateItemL" );      
hgs
parents:
diff changeset
   876
    }
hgs
parents:
diff changeset
   877
hgs
parents:
diff changeset
   878
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   879
// CBookmarkDataStore::DoReplaceItemL
hgs
parents:
diff changeset
   880
// Begin the replace operation, ensure that the item really exists
hgs
parents:
diff changeset
   881
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   882
void CBookmarkDataStore::DoReplaceItemL(
hgs
parents:
diff changeset
   883
    TSmlDbItemUid aUid, 
hgs
parents:
diff changeset
   884
    TInt aSize, 
hgs
parents:
diff changeset
   885
    TSmlDbItemUid aParent,
hgs
parents:
diff changeset
   886
    TBool /*aFieldChange*/, 
hgs
parents:
diff changeset
   887
    TRequestStatus& aStatus )
hgs
parents:
diff changeset
   888
    {
hgs
parents:
diff changeset
   889
    LOGGER_ENTERFN( "CBookmarkDataStore::DoReplaceItemL" );
hgs
parents:
diff changeset
   890
    LOGGER_WRITE_1("aUid: %d", aUid);
hgs
parents:
diff changeset
   891
    LOGGER_WRITE_1("aParent: %d", aParent);
hgs
parents:
diff changeset
   892
    
hgs
parents:
diff changeset
   893
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
   894
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
   895
    
hgs
parents:
diff changeset
   896
    delete iItemToBeReplaced;
hgs
parents:
diff changeset
   897
    iItemToBeReplaced = NULL;
hgs
parents:
diff changeset
   898
    
hgs
parents:
diff changeset
   899
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
   900
        {
hgs
parents:
diff changeset
   901
        LOGGER_WRITE_1( "Warning: Unexpected current state: %d", iCurrentState );
hgs
parents:
diff changeset
   902
        }
hgs
parents:
diff changeset
   903
        
hgs
parents:
diff changeset
   904
    // Ensure that we've got enough disk space for the item
hgs
parents:
diff changeset
   905
    if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, aSize, EDriveC ) )
hgs
parents:
diff changeset
   906
        {
hgs
parents:
diff changeset
   907
        User::RequestComplete( iCallerStatus, KErrDiskFull );
hgs
parents:
diff changeset
   908
        LOGGER_WRITE( "SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull." );
hgs
parents:
diff changeset
   909
        return;
hgs
parents:
diff changeset
   910
        }       
hgs
parents:
diff changeset
   911
    
hgs
parents:
diff changeset
   912
    if ( aUid < KRssFeedsOffset )
hgs
parents:
diff changeset
   913
        {
hgs
parents:
diff changeset
   914
        LOGGER_WRITE( "Bookmark item" );
hgs
parents:
diff changeset
   915
        iItemToBeReplaced = CFavouritesItem::NewL();
hgs
parents:
diff changeset
   916
        // Check that item exists
hgs
parents:
diff changeset
   917
        TInt err = iDb.Get( aUid, *iItemToBeReplaced );
hgs
parents:
diff changeset
   918
        if ( err != KErrNone )
hgs
parents:
diff changeset
   919
            {
hgs
parents:
diff changeset
   920
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   921
            LOGGER_WRITE_1( "iDb.Get failed with %d", err );
hgs
parents:
diff changeset
   922
            SAFEDELETE(iItemToBeReplaced);
hgs
parents:
diff changeset
   923
            return;
hgs
parents:
diff changeset
   924
            }
hgs
parents:
diff changeset
   925
        
hgs
parents:
diff changeset
   926
        // is parent changed
hgs
parents:
diff changeset
   927
        if ( aParent != iItemToBeReplaced->ParentFolder() )
hgs
parents:
diff changeset
   928
            {
hgs
parents:
diff changeset
   929
            if ( aParent >= KRssFeedsOffset )
hgs
parents:
diff changeset
   930
                {
hgs
parents:
diff changeset
   931
                User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   932
                LOGGER_WRITE( "cannot move to RSS items folder" );
hgs
parents:
diff changeset
   933
                SAFEDELETE(iItemToBeReplaced);
hgs
parents:
diff changeset
   934
                return;
hgs
parents:
diff changeset
   935
                }
hgs
parents:
diff changeset
   936
            // parent is changed, ensure that new parent folder exists
hgs
parents:
diff changeset
   937
            TBool folderExists( EFalse ); 
hgs
parents:
diff changeset
   938
            err = iDb.FolderExists( aParent, folderExists );
hgs
parents:
diff changeset
   939
            if ( err || !folderExists )
hgs
parents:
diff changeset
   940
                {
hgs
parents:
diff changeset
   941
                User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
   942
                LOGGER_WRITE_1( "iDb.FolderExist returned %d, new parent folder not found", err );
hgs
parents:
diff changeset
   943
                SAFEDELETE(iItemToBeReplaced);
hgs
parents:
diff changeset
   944
                return;
hgs
parents:
diff changeset
   945
                }
hgs
parents:
diff changeset
   946
            }
hgs
parents:
diff changeset
   947
        
hgs
parents:
diff changeset
   948
        
hgs
parents:
diff changeset
   949
        // Store some variables to be used later in commit
hgs
parents:
diff changeset
   950
        iMimeType = iItemToBeReplaced->Type();
hgs
parents:
diff changeset
   951
        iItemToBeReplaced->SetParentFolder( aParent );
hgs
parents:
diff changeset
   952
        iParentFolder = aParent;
hgs
parents:
diff changeset
   953
        iReplaceItem = aUid;
hgs
parents:
diff changeset
   954
        }
hgs
parents:
diff changeset
   955
    else
hgs
parents:
diff changeset
   956
        {
hgs
parents:
diff changeset
   957
        LOGGER_WRITE( "RSS item" );
hgs
parents:
diff changeset
   958
        if ( aParent < KRssFeedsOffset )
hgs
parents:
diff changeset
   959
            {
hgs
parents:
diff changeset
   960
            User::RequestComplete( iCallerStatus, KErrNotSupported );
hgs
parents:
diff changeset
   961
            LOGGER_WRITE( "cannot move RSS item to normal folder" );
hgs
parents:
diff changeset
   962
            return;
hgs
parents:
diff changeset
   963
            }
hgs
parents:
diff changeset
   964
        if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
   965
            {
hgs
parents:
diff changeset
   966
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   967
            LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
   968
            return;
hgs
parents:
diff changeset
   969
            }
hgs
parents:
diff changeset
   970
        const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
   971
        const CFolderItem* rssItem = rootFolder.Search( aUid - KRssFeedsOffset );
hgs
parents:
diff changeset
   972
        if ( !rssItem )
hgs
parents:
diff changeset
   973
            {
hgs
parents:
diff changeset
   974
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
   975
            LOGGER_WRITE( "rss item not found" );
hgs
parents:
diff changeset
   976
            return;
hgs
parents:
diff changeset
   977
            }
hgs
parents:
diff changeset
   978
        if ( rssItem->IsFolder() )
hgs
parents:
diff changeset
   979
            {
hgs
parents:
diff changeset
   980
            iMimeType = CFavouritesItem::EFolder;
hgs
parents:
diff changeset
   981
            }
hgs
parents:
diff changeset
   982
        else
hgs
parents:
diff changeset
   983
            {
hgs
parents:
diff changeset
   984
            iMimeType = CFavouritesItem::EItem;
hgs
parents:
diff changeset
   985
            }
hgs
parents:
diff changeset
   986
        const CFolderItem* parent = rssItem->Parent();
hgs
parents:
diff changeset
   987
        if ( parent )
hgs
parents:
diff changeset
   988
            {
hgs
parents:
diff changeset
   989
            TInt currentParent = parent->Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
   990
            
hgs
parents:
diff changeset
   991
            const CFolderItem* newParent = rootFolder.Search( aParent - KRssFeedsOffset );
hgs
parents:
diff changeset
   992
            if ( !newParent )
hgs
parents:
diff changeset
   993
                {
hgs
parents:
diff changeset
   994
                User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
   995
                LOGGER_WRITE( "new parent not found" );
hgs
parents:
diff changeset
   996
                return;
hgs
parents:
diff changeset
   997
                }
hgs
parents:
diff changeset
   998
            else if ( !newParent->IsFolder() )
hgs
parents:
diff changeset
   999
                {
hgs
parents:
diff changeset
  1000
                User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
  1001
                LOGGER_WRITE( "new parent must be folder" );
hgs
parents:
diff changeset
  1002
                return;
hgs
parents:
diff changeset
  1003
                }
hgs
parents:
diff changeset
  1004
            else
hgs
parents:
diff changeset
  1005
                {
hgs
parents:
diff changeset
  1006
                iParentFolder = aParent;
hgs
parents:
diff changeset
  1007
                }
hgs
parents:
diff changeset
  1008
            
hgs
parents:
diff changeset
  1009
            }
hgs
parents:
diff changeset
  1010
        else
hgs
parents:
diff changeset
  1011
            {
hgs
parents:
diff changeset
  1012
            iParentFolder = KErrNotFound;
hgs
parents:
diff changeset
  1013
            }
hgs
parents:
diff changeset
  1014
        iReplaceItem = aUid;
hgs
parents:
diff changeset
  1015
        }
hgs
parents:
diff changeset
  1016
    
hgs
parents:
diff changeset
  1017
    
hgs
parents:
diff changeset
  1018
    
hgs
parents:
diff changeset
  1019
    SAFEDELETE(iDataBuffer);
hgs
parents:
diff changeset
  1020
    iDataBuffer = CBufFlat::NewL( KDefaultBufferSize );
hgs
parents:
diff changeset
  1021
    iWriterPosition = 0;
hgs
parents:
diff changeset
  1022
        
hgs
parents:
diff changeset
  1023
    iCurrentItem = &aUid;   
hgs
parents:
diff changeset
  1024
    iCurrentState = EBookmarkUpdating;
hgs
parents:
diff changeset
  1025
    
hgs
parents:
diff changeset
  1026
    User::RequestComplete( iCallerStatus, KErrNone );   
hgs
parents:
diff changeset
  1027
    
hgs
parents:
diff changeset
  1028
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoReplaceItemL" );     
hgs
parents:
diff changeset
  1029
    }
hgs
parents:
diff changeset
  1030
hgs
parents:
diff changeset
  1031
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1032
// CBookmarkDataStore::DoReadItemL
hgs
parents:
diff changeset
  1033
// Read specified amount of data from the temporary buffer
hgs
parents:
diff changeset
  1034
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1035
void CBookmarkDataStore::DoReadItemL( TDes8& aBuffer )
hgs
parents:
diff changeset
  1036
    {
hgs
parents:
diff changeset
  1037
    LOGGER_ENTERFN( "CBookmarkDataStore::DoReadItemL" );
hgs
parents:
diff changeset
  1038
    
hgs
parents:
diff changeset
  1039
    if (iCurrentState != EBookmarkOpen || !iDataBuffer)
hgs
parents:
diff changeset
  1040
        {
hgs
parents:
diff changeset
  1041
        LOGGER_WRITE_1( "Unexpected state %d", iCurrentState );
hgs
parents:
diff changeset
  1042
        User::Leave( KErrNotReady );
hgs
parents:
diff changeset
  1043
        }
hgs
parents:
diff changeset
  1044
        
hgs
parents:
diff changeset
  1045
    if (iReaderPosition == KDataBufferNotReady)
hgs
parents:
diff changeset
  1046
        {
hgs
parents:
diff changeset
  1047
        LOGGER_WRITE( "No data to read" );
hgs
parents:
diff changeset
  1048
        User::Leave( KErrEof );
hgs
parents:
diff changeset
  1049
        }
hgs
parents:
diff changeset
  1050
    
hgs
parents:
diff changeset
  1051
    // Thiw is how much data there is left in the buffer    
hgs
parents:
diff changeset
  1052
    TInt left = iDataBuffer->Size() - iReaderPosition;
hgs
parents:
diff changeset
  1053
    
hgs
parents:
diff changeset
  1054
    if ( left > 0 )
hgs
parents:
diff changeset
  1055
        {
hgs
parents:
diff changeset
  1056
        // This is how much there's space in the destination buffer
hgs
parents:
diff changeset
  1057
        TInt destSize = aBuffer.MaxSize();
hgs
parents:
diff changeset
  1058
        
hgs
parents:
diff changeset
  1059
        // This is how much we can read
hgs
parents:
diff changeset
  1060
        TInt toRead = destSize < left ? destSize : left;
hgs
parents:
diff changeset
  1061
        
hgs
parents:
diff changeset
  1062
        // Read the data from the buffer, then update the position      
hgs
parents:
diff changeset
  1063
        iDataBuffer->Read( iReaderPosition, aBuffer, toRead );
hgs
parents:
diff changeset
  1064
        iReaderPosition += toRead;
hgs
parents:
diff changeset
  1065
        }
hgs
parents:
diff changeset
  1066
    else
hgs
parents:
diff changeset
  1067
        {
hgs
parents:
diff changeset
  1068
        iReaderPosition = KDataBufferNotReady;
hgs
parents:
diff changeset
  1069
        LOGGER_WRITE( "No data to read" );
hgs
parents:
diff changeset
  1070
        User::Leave( KErrEof );
hgs
parents:
diff changeset
  1071
        }   
hgs
parents:
diff changeset
  1072
        
hgs
parents:
diff changeset
  1073
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoReadItemL" );        
hgs
parents:
diff changeset
  1074
    }
hgs
parents:
diff changeset
  1075
hgs
parents:
diff changeset
  1076
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1077
// CBookmarkDataStore::DoWriteItemL
hgs
parents:
diff changeset
  1078
// Write specified amount of data to the temporary buffer
hgs
parents:
diff changeset
  1079
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1080
void CBookmarkDataStore::DoWriteItemL( const TDesC8& aData )
hgs
parents:
diff changeset
  1081
    {
hgs
parents:
diff changeset
  1082
    LOGGER_ENTERFN( "CBookmarkDataStore::DoWriteItemL" );
hgs
parents:
diff changeset
  1083
    
hgs
parents:
diff changeset
  1084
    if ( iCurrentState != EBookmarkCreating && iCurrentState != EBookmarkUpdating )
hgs
parents:
diff changeset
  1085
        {
hgs
parents:
diff changeset
  1086
        LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState );
hgs
parents:
diff changeset
  1087
        User::Leave( KErrNotReady );
hgs
parents:
diff changeset
  1088
        }
hgs
parents:
diff changeset
  1089
    
hgs
parents:
diff changeset
  1090
    // Calculate total size
hgs
parents:
diff changeset
  1091
    TInt totalSize = aData.Size() + iDataBuffer->Size();
hgs
parents:
diff changeset
  1092
hgs
parents:
diff changeset
  1093
    // Ensure that we've got enough disk space for the item
hgs
parents:
diff changeset
  1094
    if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iRfs, totalSize, EDriveC ) )
hgs
parents:
diff changeset
  1095
        {
hgs
parents:
diff changeset
  1096
        User::RequestComplete( iCallerStatus, KErrDiskFull );
hgs
parents:
diff changeset
  1097
        LOGGER_WRITE("SysUtil::DiskSpaceBelowCriticalLevelL failed with KErrDiskFull.");
hgs
parents:
diff changeset
  1098
        return;
hgs
parents:
diff changeset
  1099
        }
hgs
parents:
diff changeset
  1100
        
hgs
parents:
diff changeset
  1101
    // Add data to buffer       
hgs
parents:
diff changeset
  1102
    iDataBuffer->InsertL( iWriterPosition, aData );
hgs
parents:
diff changeset
  1103
    iWriterPosition += aData.Size();
hgs
parents:
diff changeset
  1104
    
hgs
parents:
diff changeset
  1105
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoWriteItemL" );
hgs
parents:
diff changeset
  1106
    }
hgs
parents:
diff changeset
  1107
hgs
parents:
diff changeset
  1108
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1109
// CBookmarkDataStore::DoCommitItemL
hgs
parents:
diff changeset
  1110
// Commits item from temporary buffer to the message store
hgs
parents:
diff changeset
  1111
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1112
void CBookmarkDataStore::DoCommitItemL( TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1113
    {
hgs
parents:
diff changeset
  1114
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitItemL" );
hgs
parents:
diff changeset
  1115
    LOGGER_WRITE_1("iParentFolder: %d", iParentFolder);
hgs
parents:
diff changeset
  1116
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1117
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1118
    
hgs
parents:
diff changeset
  1119
    // Check that we're in proper state
hgs
parents:
diff changeset
  1120
    if ( iCurrentState != EBookmarkCreating && iCurrentState != EBookmarkUpdating )
hgs
parents:
diff changeset
  1121
        {
hgs
parents:
diff changeset
  1122
        User::RequestComplete( iCallerStatus, KErrNotReady );
hgs
parents:
diff changeset
  1123
        LOGGER_WRITE_1( "Unexpected current state: %d", iCurrentState );
hgs
parents:
diff changeset
  1124
        return;
hgs
parents:
diff changeset
  1125
        }
hgs
parents:
diff changeset
  1126
        
hgs
parents:
diff changeset
  1127
    if ( iDataBuffer->Size() <= 0 )
hgs
parents:
diff changeset
  1128
        {
hgs
parents:
diff changeset
  1129
        User::RequestComplete( iCallerStatus, KErrNotReady );
hgs
parents:
diff changeset
  1130
        LOGGER_WRITE_1( "Data buffer has no data (%d)", iDataBuffer->Size() );
hgs
parents:
diff changeset
  1131
        return; 
hgs
parents:
diff changeset
  1132
        }
hgs
parents:
diff changeset
  1133
    
hgs
parents:
diff changeset
  1134
    
hgs
parents:
diff changeset
  1135
    
hgs
parents:
diff changeset
  1136
    // If iItemToBeReplaced exist, bookmark item is going to be replaced.
hgs
parents:
diff changeset
  1137
    // iItemToBeReplaced contains original bookmark and only some of it's data is replaced.
hgs
parents:
diff changeset
  1138
    CFavouritesItem* item(NULL);
hgs
parents:
diff changeset
  1139
    if ( iItemToBeReplaced )
hgs
parents:
diff changeset
  1140
        {
hgs
parents:
diff changeset
  1141
        // Change object ownership to "item"-object, and push to cleanupStack
hgs
parents:
diff changeset
  1142
        item = iItemToBeReplaced;
hgs
parents:
diff changeset
  1143
        CleanupStack::PushL( item );
hgs
parents:
diff changeset
  1144
        iItemToBeReplaced = NULL;
hgs
parents:
diff changeset
  1145
        }
hgs
parents:
diff changeset
  1146
    else
hgs
parents:
diff changeset
  1147
        {
hgs
parents:
diff changeset
  1148
        // Create new object.
hgs
parents:
diff changeset
  1149
        item = CFavouritesItem::NewLC();
hgs
parents:
diff changeset
  1150
        }
hgs
parents:
diff changeset
  1151
    
hgs
parents:
diff changeset
  1152
    iDataBuffer->Compress();
hgs
parents:
diff changeset
  1153
    TInt err = iConverter->BufferToFavouritesItemL( iMimeType, *iDataBuffer, *item );
hgs
parents:
diff changeset
  1154
    
hgs
parents:
diff changeset
  1155
    if ( iParentFolder == KErrNotFound )
hgs
parents:
diff changeset
  1156
        {
hgs
parents:
diff changeset
  1157
        if ( item->Name().Compare( KRSSRootFolderName ) == 0 )
hgs
parents:
diff changeset
  1158
            {
hgs
parents:
diff changeset
  1159
            LOGGER_WRITE( "Was RSS Rootfolder" );
hgs
parents:
diff changeset
  1160
            // Remove from cleanup stack
hgs
parents:
diff changeset
  1161
            CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
  1162
            
hgs
parents:
diff changeset
  1163
            if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1164
                {
hgs
parents:
diff changeset
  1165
                User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1166
                LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
  1167
                return;
hgs
parents:
diff changeset
  1168
                }
hgs
parents:
diff changeset
  1169
            const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1170
            
hgs
parents:
diff changeset
  1171
            *iCurrentItem = rootFolder.Id() + KRssFeedsOffset;
hgs
parents:
diff changeset
  1172
            
hgs
parents:
diff changeset
  1173
            // Inform ChangeFinder of updated item
hgs
parents:
diff changeset
  1174
            TSnapshotItem snapshotItem( rootFolder.Id() + KRssFeedsOffset );
hgs
parents:
diff changeset
  1175
            snapshotItem.SetParentId( iParentFolder );
hgs
parents:
diff changeset
  1176
            snapshotItem.CreateHashL( KRSSRootFolderName, KNullDesC );
hgs
parents:
diff changeset
  1177
            iChangeFinder->ItemUpdatedL( snapshotItem );
hgs
parents:
diff changeset
  1178
            
hgs
parents:
diff changeset
  1179
            // Destroy buffer
hgs
parents:
diff changeset
  1180
            SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
  1181
            iWriterPosition = 0;
hgs
parents:
diff changeset
  1182
            
hgs
parents:
diff changeset
  1183
            // Restore state and signal we're done
hgs
parents:
diff changeset
  1184
            LOGGER_WRITE( "Signal KErrNone" );
hgs
parents:
diff changeset
  1185
            iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
  1186
            User::RequestComplete( iCallerStatus, KErrNone );
hgs
parents:
diff changeset
  1187
            
hgs
parents:
diff changeset
  1188
            LOGGER_WRITE_1("Item ID: %d", *iCurrentItem);
hgs
parents:
diff changeset
  1189
            LOGGER_WRITE_1("Parent ID: %d", iParentFolder);
hgs
parents:
diff changeset
  1190
            LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitItemL" );
hgs
parents:
diff changeset
  1191
            return;
hgs
parents:
diff changeset
  1192
            }
hgs
parents:
diff changeset
  1193
        }
hgs
parents:
diff changeset
  1194
hgs
parents:
diff changeset
  1195
    if ( iParentFolder < KRssFeedsOffset )
hgs
parents:
diff changeset
  1196
        {
hgs
parents:
diff changeset
  1197
        // Convert buffer to favourites item
hgs
parents:
diff changeset
  1198
        LOGGER_WRITE( "BookmarkItem" );
hgs
parents:
diff changeset
  1199
        
hgs
parents:
diff changeset
  1200
        if ( err == KErrNone )
hgs
parents:
diff changeset
  1201
            {
hgs
parents:
diff changeset
  1202
            LOGGER_WRITE_1 ( "ParentFolder: %d", iParentFolder )
hgs
parents:
diff changeset
  1203
            // Creating new item
hgs
parents:
diff changeset
  1204
            if ( iCurrentState == EBookmarkCreating )
hgs
parents:
diff changeset
  1205
                {
hgs
parents:
diff changeset
  1206
#ifdef _DEBUG                
hgs
parents:
diff changeset
  1207
                LOGGER_WRITE( "Create new bookmark item" );
hgs
parents:
diff changeset
  1208
                TPtrC namePtr = item->Name();
hgs
parents:
diff changeset
  1209
                LOGGER_WRITE_1( "name: %S", &namePtr );
hgs
parents:
diff changeset
  1210
#endif
hgs
parents:
diff changeset
  1211
                // Set parent folder
hgs
parents:
diff changeset
  1212
                item->SetParentFolder( iParentFolder );
hgs
parents:
diff changeset
  1213
hgs
parents:
diff changeset
  1214
                // Add to database
hgs
parents:
diff changeset
  1215
                err = iDb.Add( *item, EFalse );
hgs
parents:
diff changeset
  1216
                LOGGER_WRITE_1("iDb.Add return: %d", err);
hgs
parents:
diff changeset
  1217
                if ( err == KErrNone )
hgs
parents:
diff changeset
  1218
                    {
hgs
parents:
diff changeset
  1219
                    // Output the uid value of new item
hgs
parents:
diff changeset
  1220
                    *iCurrentItem = item->Uid();
hgs
parents:
diff changeset
  1221
                    LOGGER_WRITE_1("New item Uid: %d", *iCurrentItem);
hgs
parents:
diff changeset
  1222
                    // Inform ChangeFinder of the added item
hgs
parents:
diff changeset
  1223
                    TSnapshotItem snapshotItem( *iCurrentItem );
hgs
parents:
diff changeset
  1224
                    snapshotItem.SetParentId( iParentFolder );
hgs
parents:
diff changeset
  1225
                    snapshotItem.CreateHashL( item->Name(), item->Url() );
hgs
parents:
diff changeset
  1226
                    iChangeFinder->ItemAddedL( snapshotItem );
hgs
parents:
diff changeset
  1227
                    }
hgs
parents:
diff changeset
  1228
                else
hgs
parents:
diff changeset
  1229
                    {
hgs
parents:
diff changeset
  1230
                    LOGGER_WRITE_1( "RFavouritesDb::Add failed: %d", err );
hgs
parents:
diff changeset
  1231
                    }
hgs
parents:
diff changeset
  1232
                }
hgs
parents:
diff changeset
  1233
            // Updating existing item
hgs
parents:
diff changeset
  1234
            else
hgs
parents:
diff changeset
  1235
                {
hgs
parents:
diff changeset
  1236
                LOGGER_WRITE( "Update existing item" );
hgs
parents:
diff changeset
  1237
                item->SetParentFolder(iParentFolder);
hgs
parents:
diff changeset
  1238
                err = iDb.Update( *item, iReplaceItem, EFalse );
hgs
parents:
diff changeset
  1239
                if ( err == KErrNone )
hgs
parents:
diff changeset
  1240
                    {
hgs
parents:
diff changeset
  1241
                    // Inform ChangeFinder of updated item
hgs
parents:
diff changeset
  1242
                    TSnapshotItem snapshotItem( iReplaceItem );
hgs
parents:
diff changeset
  1243
                    snapshotItem.SetParentId( iParentFolder );
hgs
parents:
diff changeset
  1244
                    snapshotItem.CreateHashL( item->Name(), item->Url() );
hgs
parents:
diff changeset
  1245
                    iChangeFinder->ItemUpdatedL( snapshotItem );
hgs
parents:
diff changeset
  1246
                    }
hgs
parents:
diff changeset
  1247
                else
hgs
parents:
diff changeset
  1248
                    {
hgs
parents:
diff changeset
  1249
                    LOGGER_WRITE_1( "RFavouritesDb::Update failed: %d", err );
hgs
parents:
diff changeset
  1250
                    }
hgs
parents:
diff changeset
  1251
                }
hgs
parents:
diff changeset
  1252
            }
hgs
parents:
diff changeset
  1253
        else
hgs
parents:
diff changeset
  1254
            {
hgs
parents:
diff changeset
  1255
            LOGGER_WRITE_1( "Failed to create db item (%d)", err );
hgs
parents:
diff changeset
  1256
            }
hgs
parents:
diff changeset
  1257
hgs
parents:
diff changeset
  1258
        }
hgs
parents:
diff changeset
  1259
    else
hgs
parents:
diff changeset
  1260
        {
hgs
parents:
diff changeset
  1261
        LOGGER_WRITE( "RSS item" );
hgs
parents:
diff changeset
  1262
        err = iConverter->BufferToFavouritesItemL( iMimeType, *iDataBuffer, *item );
hgs
parents:
diff changeset
  1263
        // Destroy buffer
hgs
parents:
diff changeset
  1264
        SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
  1265
        iWriterPosition = 0;
hgs
parents:
diff changeset
  1266
        if ( err == KErrNone )
hgs
parents:
diff changeset
  1267
            {
hgs
parents:
diff changeset
  1268
            if ( iCurrentState == EBookmarkCreating )
hgs
parents:
diff changeset
  1269
                {
hgs
parents:
diff changeset
  1270
                TBool isFolder = ( iMimeType == CFavouritesItem::EFolder );
hgs
parents:
diff changeset
  1271
                CreateRssItemL( iParentFolder - KRssFeedsOffset, item->Name(), item->Url(), isFolder );
hgs
parents:
diff changeset
  1272
                
hgs
parents:
diff changeset
  1273
                CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
  1274
                LOGGER_WRITE( "waiting FolderItemRequestCompleted..." );
hgs
parents:
diff changeset
  1275
                return;    
hgs
parents:
diff changeset
  1276
                }
hgs
parents:
diff changeset
  1277
            else
hgs
parents:
diff changeset
  1278
                {
hgs
parents:
diff changeset
  1279
                LOGGER_WRITE( "Replace RSS item" );
hgs
parents:
diff changeset
  1280
                ReplaceRssItemL( iReplaceItem - KRssFeedsOffset, item->Name(), item->Url());
hgs
parents:
diff changeset
  1281
                
hgs
parents:
diff changeset
  1282
                CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
  1283
                LOGGER_WRITE( "waiting FolderItemRequestCompleted..." );
hgs
parents:
diff changeset
  1284
                return;
hgs
parents:
diff changeset
  1285
                }
hgs
parents:
diff changeset
  1286
            }
hgs
parents:
diff changeset
  1287
        else
hgs
parents:
diff changeset
  1288
            {
hgs
parents:
diff changeset
  1289
            // Data was corrupted
hgs
parents:
diff changeset
  1290
            LOGGER_WRITE_1( " iConverter->BufferToFavouritesItemL err: %d", err );
hgs
parents:
diff changeset
  1291
            err = KErrCorrupt;
hgs
parents:
diff changeset
  1292
            }
hgs
parents:
diff changeset
  1293
        }
hgs
parents:
diff changeset
  1294
    
hgs
parents:
diff changeset
  1295
hgs
parents:
diff changeset
  1296
    // Remove from cleanup stack
hgs
parents:
diff changeset
  1297
    CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
  1298
    
hgs
parents:
diff changeset
  1299
    // Destroy buffer
hgs
parents:
diff changeset
  1300
    SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
  1301
    iWriterPosition = 0;
hgs
parents:
diff changeset
  1302
    
hgs
parents:
diff changeset
  1303
    // Restore state and signal we're done
hgs
parents:
diff changeset
  1304
    iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
  1305
    User::RequestComplete( iCallerStatus, err );
hgs
parents:
diff changeset
  1306
    
hgs
parents:
diff changeset
  1307
    LOGGER_WRITE_1("Item ID: %d", iReplaceItem);
hgs
parents:
diff changeset
  1308
    LOGGER_WRITE_1("Parent ID: %d", iParentFolder);
hgs
parents:
diff changeset
  1309
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitItemL" );
hgs
parents:
diff changeset
  1310
    }
hgs
parents:
diff changeset
  1311
hgs
parents:
diff changeset
  1312
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1313
// CBookmarkDataStore::CreateRssItemL
hgs
parents:
diff changeset
  1314
// Creates new Rss item, FolderItemRequestCompleted is called when done
hgs
parents:
diff changeset
  1315
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1316
void CBookmarkDataStore::CreateRssItemL( TInt aRssParentUid, const TDesC& aName, const TDesC& aUrl, TBool aIsFolder )
hgs
parents:
diff changeset
  1317
    {
hgs
parents:
diff changeset
  1318
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1319
    LOGGER_WRITE_1("aRssParentUid: %d", aRssParentUid);
hgs
parents:
diff changeset
  1320
    LOGGER_WRITE_1("aName: %S", &aName);
hgs
parents:
diff changeset
  1321
    
hgs
parents:
diff changeset
  1322
    if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1323
        {
hgs
parents:
diff changeset
  1324
        LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
  1325
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
  1326
        }
hgs
parents:
diff changeset
  1327
    
hgs
parents:
diff changeset
  1328
    const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1329
    
hgs
parents:
diff changeset
  1330
    // check that parent folder exists
hgs
parents:
diff changeset
  1331
    const CFolderItem* parent = rootFolder.Search( aRssParentUid );
hgs
parents:
diff changeset
  1332
    if ( !parent )
hgs
parents:
diff changeset
  1333
        {
hgs
parents:
diff changeset
  1334
        LOGGER_WRITE( "parent folder not found" );
hgs
parents:
diff changeset
  1335
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
  1336
        }
hgs
parents:
diff changeset
  1337
    
hgs
parents:
diff changeset
  1338
    // check that folder does not already exists
hgs
parents:
diff changeset
  1339
    const CFolderItem* existingItem = parent->Search( aName );
hgs
parents:
diff changeset
  1340
    if ( existingItem )
hgs
parents:
diff changeset
  1341
        {
hgs
parents:
diff changeset
  1342
        LOGGER_WRITE("Same name already exist, return KErrAlreadyExists");
hgs
parents:
diff changeset
  1343
        User::Leave( KErrAlreadyExists );
hgs
parents:
diff changeset
  1344
        }
hgs
parents:
diff changeset
  1345
    
hgs
parents:
diff changeset
  1346
    TInt err(KErrNone);
hgs
parents:
diff changeset
  1347
    // async func. FolderItemRequestCompleted is called when completed
hgs
parents:
diff changeset
  1348
    TRAP( err, iRootFolder.AddFolderItemL(
hgs
parents:
diff changeset
  1349
        aName,
hgs
parents:
diff changeset
  1350
        aUrl,
hgs
parents:
diff changeset
  1351
        aIsFolder,
hgs
parents:
diff changeset
  1352
        *parent ) );
hgs
parents:
diff changeset
  1353
    LOGGER_WRITE_1( "iRootFolder.AddFolderItemL err: %d", err );
hgs
parents:
diff changeset
  1354
    
hgs
parents:
diff changeset
  1355
    iNewItemName.Copy( aName );
hgs
parents:
diff changeset
  1356
    
hgs
parents:
diff changeset
  1357
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1358
    }
hgs
parents:
diff changeset
  1359
hgs
parents:
diff changeset
  1360
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1361
// CBookmarkDataStore::ReplaceRssItemL
hgs
parents:
diff changeset
  1362
// Replaces rss item, FolderItemRequestCompleted is called when done
hgs
parents:
diff changeset
  1363
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1364
void CBookmarkDataStore::ReplaceRssItemL( TInt aRssItemUid, const TDesC& aNewName, const TDesC& aNewUrl )
hgs
parents:
diff changeset
  1365
    {
hgs
parents:
diff changeset
  1366
    TRACE_FUNC_ENTRY;
hgs
parents:
diff changeset
  1367
    LOGGER_WRITE_1("aRssItemUid: %d", aRssItemUid);
hgs
parents:
diff changeset
  1368
    LOGGER_WRITE_1("aNewName: %S", &aNewName);
hgs
parents:
diff changeset
  1369
    LOGGER_WRITE_1("aNewUrl: %S", &aNewUrl);
hgs
parents:
diff changeset
  1370
    
hgs
parents:
diff changeset
  1371
    if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1372
        {
hgs
parents:
diff changeset
  1373
        LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
  1374
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
  1375
        }
hgs
parents:
diff changeset
  1376
    const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1377
    LOGGER_WRITE_1( "rootFolder.Search %d", aRssItemUid );
hgs
parents:
diff changeset
  1378
    const CFolderItem* rssItem = rootFolder.Search( aRssItemUid );
hgs
parents:
diff changeset
  1379
    if ( !rssItem )
hgs
parents:
diff changeset
  1380
        {
hgs
parents:
diff changeset
  1381
        LOGGER_WRITE( "rssItem not found" );
hgs
parents:
diff changeset
  1382
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
  1383
        }
hgs
parents:
diff changeset
  1384
    
hgs
parents:
diff changeset
  1385
    // async func. FolderItemRequestCompleted is called when completed
hgs
parents:
diff changeset
  1386
    if ( rssItem->IsFolder() )
hgs
parents:
diff changeset
  1387
        {
hgs
parents:
diff changeset
  1388
        iRootFolder.ChangeFolderItemL(
hgs
parents:
diff changeset
  1389
        *rssItem,
hgs
parents:
diff changeset
  1390
        aNewName,
hgs
parents:
diff changeset
  1391
        KNullDesC );
hgs
parents:
diff changeset
  1392
        }
hgs
parents:
diff changeset
  1393
    else
hgs
parents:
diff changeset
  1394
        {
hgs
parents:
diff changeset
  1395
        iRootFolder.ChangeFolderItemL(
hgs
parents:
diff changeset
  1396
        *rssItem,
hgs
parents:
diff changeset
  1397
        aNewName,
hgs
parents:
diff changeset
  1398
        aNewUrl );
hgs
parents:
diff changeset
  1399
        }
hgs
parents:
diff changeset
  1400
    
hgs
parents:
diff changeset
  1401
    TRACE_FUNC_EXIT;
hgs
parents:
diff changeset
  1402
    }
hgs
parents:
diff changeset
  1403
hgs
parents:
diff changeset
  1404
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1405
// CBookmarkDataStore::DoCloseItem
hgs
parents:
diff changeset
  1406
// Closes open item in the data store
hgs
parents:
diff changeset
  1407
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1408
void CBookmarkDataStore::DoCloseItem()
hgs
parents:
diff changeset
  1409
    {
hgs
parents:
diff changeset
  1410
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCloseItem" );
hgs
parents:
diff changeset
  1411
    
hgs
parents:
diff changeset
  1412
    // Make sure that we're opened an item
hgs
parents:
diff changeset
  1413
    if ( iCurrentState == EBookmarkOpen )
hgs
parents:
diff changeset
  1414
        {
hgs
parents:
diff changeset
  1415
        // Reset read buffer 
hgs
parents:
diff changeset
  1416
        iReaderPosition = KDataBufferNotReady;
hgs
parents:
diff changeset
  1417
        SAFEDELETE( iDataBuffer );
hgs
parents:
diff changeset
  1418
        
hgs
parents:
diff changeset
  1419
        // Start to wait for the next operation     
hgs
parents:
diff changeset
  1420
        iCurrentState = EOpenAndWaiting;
hgs
parents:
diff changeset
  1421
        }
hgs
parents:
diff changeset
  1422
    else 
hgs
parents:
diff changeset
  1423
        {
hgs
parents:
diff changeset
  1424
        LOGGER_WRITE_1( "Invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1425
        }   
hgs
parents:
diff changeset
  1426
    
hgs
parents:
diff changeset
  1427
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCloseItem" );    
hgs
parents:
diff changeset
  1428
    }
hgs
parents:
diff changeset
  1429
hgs
parents:
diff changeset
  1430
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1431
// CBookmarkDataStore::DoMoveItemL
hgs
parents:
diff changeset
  1432
// Moves item from one bookmark folder to another 
hgs
parents:
diff changeset
  1433
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1434
void CBookmarkDataStore::DoMoveItemL( TSmlDbItemUid aUid,
hgs
parents:
diff changeset
  1435
    TSmlDbItemUid aNewParent, TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1436
    {
hgs
parents:
diff changeset
  1437
    LOGGER_ENTERFN( "CBookmarkDataStore::DoMoveItemL" );
hgs
parents:
diff changeset
  1438
    LOGGER_WRITE_1("aUid: %d", aUid);
hgs
parents:
diff changeset
  1439
    LOGGER_WRITE_1("new parent: %d", aNewParent);
hgs
parents:
diff changeset
  1440
hgs
parents:
diff changeset
  1441
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1442
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1443
hgs
parents:
diff changeset
  1444
    TInt err( KErrNone ); 
hgs
parents:
diff changeset
  1445
    
hgs
parents:
diff changeset
  1446
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
  1447
        {
hgs
parents:
diff changeset
  1448
        LOGGER_WRITE_1( "WARNING! Invalid state: %d", iCurrentState );
hgs
parents:
diff changeset
  1449
        }
hgs
parents:
diff changeset
  1450
    
hgs
parents:
diff changeset
  1451
    if ( aUid < KRssFeedsOffset )
hgs
parents:
diff changeset
  1452
        {
hgs
parents:
diff changeset
  1453
        // Bookmark item
hgs
parents:
diff changeset
  1454
        LOGGER_WRITE( "Bookmark item" );
hgs
parents:
diff changeset
  1455
        // Ensure that new parent folder exists 
hgs
parents:
diff changeset
  1456
        TBool folderExists( EFalse );   
hgs
parents:
diff changeset
  1457
        err = iDb.FolderExists( aNewParent, folderExists );
hgs
parents:
diff changeset
  1458
        if ( err || !folderExists )
hgs
parents:
diff changeset
  1459
            {
hgs
parents:
diff changeset
  1460
            User::RequestComplete( iCallerStatus, KErrPathNotFound );
hgs
parents:
diff changeset
  1461
            LOGGER_WRITE_1( "iDb.FolderExist returned %d, new parent folder not found", err );
hgs
parents:
diff changeset
  1462
            return;
hgs
parents:
diff changeset
  1463
            }   
hgs
parents:
diff changeset
  1464
        
hgs
parents:
diff changeset
  1465
        CFavouritesItem* item = CFavouritesItem::NewLC();
hgs
parents:
diff changeset
  1466
hgs
parents:
diff changeset
  1467
        err = iDb.Get( aUid, *item );
hgs
parents:
diff changeset
  1468
        if ( err == KErrNone )
hgs
parents:
diff changeset
  1469
            {
hgs
parents:
diff changeset
  1470
            if ( item->ParentFolder() != aNewParent )
hgs
parents:
diff changeset
  1471
                {
hgs
parents:
diff changeset
  1472
                TTime time = item->Modified();
hgs
parents:
diff changeset
  1473
                
hgs
parents:
diff changeset
  1474
                // Parent was changed, set new
hgs
parents:
diff changeset
  1475
                item->SetParentFolder( aNewParent );
hgs
parents:
diff changeset
  1476
hgs
parents:
diff changeset
  1477
                // Update, this'll move the item
hgs
parents:
diff changeset
  1478
                err = iDb.Update( *item, aUid, ETrue );
hgs
parents:
diff changeset
  1479
                
hgs
parents:
diff changeset
  1480
                if ( err == KErrNone )
hgs
parents:
diff changeset
  1481
                    {
hgs
parents:
diff changeset
  1482
                    // Do not change the timestamp, otherwise this will be
hgs
parents:
diff changeset
  1483
                    // considered to be 'updated' item instead of moved one
hgs
parents:
diff changeset
  1484
                    err = iDb.SetModified(aUid, time);
hgs
parents:
diff changeset
  1485
                    if ( err != KErrNone )
hgs
parents:
diff changeset
  1486
                        {
hgs
parents:
diff changeset
  1487
                        LOGGER_WRITE_1( "iDb.SetModified(aUid, time) failed (%d).", err );
hgs
parents:
diff changeset
  1488
                        }
hgs
parents:
diff changeset
  1489
                        
hgs
parents:
diff changeset
  1490
                    // Inform ChangeFinder of updated item
hgs
parents:
diff changeset
  1491
                    TSnapshotItem snapshotItem( aUid );
hgs
parents:
diff changeset
  1492
                    snapshotItem.SetParentId( iParentFolder );
hgs
parents:
diff changeset
  1493
                    snapshotItem.CreateHashL( item->Name(), item->Url() );
hgs
parents:
diff changeset
  1494
                    iChangeFinder->ItemMovedL( snapshotItem );
hgs
parents:
diff changeset
  1495
                    }
hgs
parents:
diff changeset
  1496
                else 
hgs
parents:
diff changeset
  1497
                    {
hgs
parents:
diff changeset
  1498
                    LOGGER_WRITE_1( "iDb.Update(*item, aUid, ETrue) failed (%d).", err );
hgs
parents:
diff changeset
  1499
                    }               
hgs
parents:
diff changeset
  1500
                }
hgs
parents:
diff changeset
  1501
            else 
hgs
parents:
diff changeset
  1502
                {
hgs
parents:
diff changeset
  1503
                LOGGER_WRITE( "Ignoring move (parent was already correct)." );
hgs
parents:
diff changeset
  1504
                }           
hgs
parents:
diff changeset
  1505
            }
hgs
parents:
diff changeset
  1506
        else
hgs
parents:
diff changeset
  1507
            {
hgs
parents:
diff changeset
  1508
            LOGGER_WRITE_1( "RFavouritesDb::Get failed with %d", err );
hgs
parents:
diff changeset
  1509
            err = KErrNotFound;
hgs
parents:
diff changeset
  1510
            }
hgs
parents:
diff changeset
  1511
hgs
parents:
diff changeset
  1512
        CleanupStack::PopAndDestroy( item );
hgs
parents:
diff changeset
  1513
        User::RequestComplete( iCallerStatus, err ); 
hgs
parents:
diff changeset
  1514
        }
hgs
parents:
diff changeset
  1515
    else
hgs
parents:
diff changeset
  1516
        {
hgs
parents:
diff changeset
  1517
        // RRS item
hgs
parents:
diff changeset
  1518
        LOGGER_WRITE( "RSS item" );
hgs
parents:
diff changeset
  1519
        if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1520
            {
hgs
parents:
diff changeset
  1521
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1522
            LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
  1523
            return;
hgs
parents:
diff changeset
  1524
            }
hgs
parents:
diff changeset
  1525
        const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1526
        const CFolderItem* rssItem = rootFolder.Search( aUid - KRssFeedsOffset );
hgs
parents:
diff changeset
  1527
        if ( !rssItem )
hgs
parents:
diff changeset
  1528
            {
hgs
parents:
diff changeset
  1529
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1530
            LOGGER_WRITE( "rssItem not found" );
hgs
parents:
diff changeset
  1531
            return;
hgs
parents:
diff changeset
  1532
            }
hgs
parents:
diff changeset
  1533
        LOGGER_WRITE_1("rssItem->Id(): %d", rssItem->Id());
hgs
parents:
diff changeset
  1534
        if ( !rssItem->Parent() )
hgs
parents:
diff changeset
  1535
            {
hgs
parents:
diff changeset
  1536
            // this is "RSS Root" folder, can't move
hgs
parents:
diff changeset
  1537
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1538
            LOGGER_WRITE( "RSS Root folder, can't move" );
hgs
parents:
diff changeset
  1539
            return;
hgs
parents:
diff changeset
  1540
            }
hgs
parents:
diff changeset
  1541
        const CFolderItem* parent = rootFolder.Search( aNewParent - KRssFeedsOffset );
hgs
parents:
diff changeset
  1542
        if ( !parent )
hgs
parents:
diff changeset
  1543
            {
hgs
parents:
diff changeset
  1544
            // new parent not found
hgs
parents:
diff changeset
  1545
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1546
            LOGGER_WRITE( "new parent not found" );
hgs
parents:
diff changeset
  1547
            return;
hgs
parents:
diff changeset
  1548
            }
hgs
parents:
diff changeset
  1549
        if ( !parent->IsFolder() )
hgs
parents:
diff changeset
  1550
            {
hgs
parents:
diff changeset
  1551
            // not a folder
hgs
parents:
diff changeset
  1552
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1553
            LOGGER_WRITE( "parent is not a folder" );
hgs
parents:
diff changeset
  1554
            return;
hgs
parents:
diff changeset
  1555
            }
hgs
parents:
diff changeset
  1556
        RPointerArray<const CFolderItem> movedItems;
hgs
parents:
diff changeset
  1557
        CleanupClosePushL( movedItems );
64
hgs
parents: 40
diff changeset
  1558
        movedItems.AppendL( rssItem );
40
hgs
parents:
diff changeset
  1559
        // FolderItemRequestCompleted is called when ready
hgs
parents:
diff changeset
  1560
        iRootFolder.MoveFolderItemsToL( movedItems, *parent);
hgs
parents:
diff changeset
  1561
        CleanupStack::PopAndDestroy( &movedItems );
hgs
parents:
diff changeset
  1562
              
hgs
parents:
diff changeset
  1563
        delete iMovedItem;
hgs
parents:
diff changeset
  1564
        iMovedItem = NULL;
hgs
parents:
diff changeset
  1565
        iMovedItem = new (ELeave) TSnapshotItem( aUid, aNewParent );
hgs
parents:
diff changeset
  1566
        
hgs
parents:
diff changeset
  1567
        iCurrentState = EBookmarkMoving;
hgs
parents:
diff changeset
  1568
        LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." );
hgs
parents:
diff changeset
  1569
        }   
hgs
parents:
diff changeset
  1570
    
hgs
parents:
diff changeset
  1571
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoMoveItemL" );
hgs
parents:
diff changeset
  1572
    }
hgs
parents:
diff changeset
  1573
hgs
parents:
diff changeset
  1574
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1575
// CBookmarkDataStore::DoDeleteItemL
hgs
parents:
diff changeset
  1576
// Removes item from the message store
hgs
parents:
diff changeset
  1577
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1578
void CBookmarkDataStore::DoDeleteItemL( TSmlDbItemUid aUid, TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1579
    {
hgs
parents:
diff changeset
  1580
    LOGGER_ENTERFN( "CBookmarkDataStore::DoDeleteItemL" );
hgs
parents:
diff changeset
  1581
    LOGGER_WRITE_1( "aUid: %d", aUid );
hgs
parents:
diff changeset
  1582
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1583
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1584
    
hgs
parents:
diff changeset
  1585
    // Check that we're in proper state
hgs
parents:
diff changeset
  1586
    if ( iCurrentState != EOpenAndWaiting ) 
hgs
parents:
diff changeset
  1587
        {
hgs
parents:
diff changeset
  1588
        LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteItemL, Incorrect state: %d", iCurrentState);
hgs
parents:
diff changeset
  1589
        }
hgs
parents:
diff changeset
  1590
    
hgs
parents:
diff changeset
  1591
    TInt error( KErrNone );
hgs
parents:
diff changeset
  1592
    if ( aUid < KRssFeedsOffset )
hgs
parents:
diff changeset
  1593
        {
hgs
parents:
diff changeset
  1594
        LOGGER_WRITE( "Delete Bookmark item" );
hgs
parents:
diff changeset
  1595
        // Delete item from db and return the error code
hgs
parents:
diff changeset
  1596
        error = iDb.Delete( aUid );
hgs
parents:
diff changeset
  1597
        
hgs
parents:
diff changeset
  1598
        if ( error == KErrNone )
hgs
parents:
diff changeset
  1599
            {
hgs
parents:
diff changeset
  1600
            // Inform ChangeFinder of the removed item
hgs
parents:
diff changeset
  1601
            TSnapshotItem item( aUid );     
hgs
parents:
diff changeset
  1602
            iChangeFinder->ItemDeletedL( item );
hgs
parents:
diff changeset
  1603
            }
hgs
parents:
diff changeset
  1604
        else
hgs
parents:
diff changeset
  1605
            {
hgs
parents:
diff changeset
  1606
            LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteItemL, iDb.Delete failed: %d", error);
hgs
parents:
diff changeset
  1607
            }
hgs
parents:
diff changeset
  1608
        
hgs
parents:
diff changeset
  1609
        User::RequestComplete( iCallerStatus, error );
hgs
parents:
diff changeset
  1610
        }
hgs
parents:
diff changeset
  1611
    else
hgs
parents:
diff changeset
  1612
        {
hgs
parents:
diff changeset
  1613
        LOGGER_WRITE( "Delete RSS item" );
hgs
parents:
diff changeset
  1614
        if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1615
            {
hgs
parents:
diff changeset
  1616
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1617
            LOGGER_WRITE( "rss root folder not found" );
hgs
parents:
diff changeset
  1618
            LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" );
hgs
parents:
diff changeset
  1619
            return;
hgs
parents:
diff changeset
  1620
            }
hgs
parents:
diff changeset
  1621
        const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1622
        const CFolderItem* item = rootFolder.Search( aUid - KRssFeedsOffset );
hgs
parents:
diff changeset
  1623
        if ( !item )
hgs
parents:
diff changeset
  1624
            {
hgs
parents:
diff changeset
  1625
            User::RequestComplete( iCallerStatus, KErrNotFound );
hgs
parents:
diff changeset
  1626
            LOGGER_WRITE( "item not found" );
hgs
parents:
diff changeset
  1627
            LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" );
hgs
parents:
diff changeset
  1628
            return;
hgs
parents:
diff changeset
  1629
            }
hgs
parents:
diff changeset
  1630
        
hgs
parents:
diff changeset
  1631
        LOGGER_WRITE_1("founded. item->Id(): %d", item->Id());
hgs
parents:
diff changeset
  1632
        if ( !item->Parent() )
hgs
parents:
diff changeset
  1633
            {
hgs
parents:
diff changeset
  1634
            LOGGER_WRITE_1(
hgs
parents:
diff changeset
  1635
            "Item parent not found, this is root folder. Return error: %d", KErrAccessDenied);
hgs
parents:
diff changeset
  1636
            User::RequestComplete( iCallerStatus, KErrAccessDenied );
hgs
parents:
diff changeset
  1637
            LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" );
hgs
parents:
diff changeset
  1638
            return;
hgs
parents:
diff changeset
  1639
            }
hgs
parents:
diff changeset
  1640
        else
hgs
parents:
diff changeset
  1641
            {
hgs
parents:
diff changeset
  1642
            LOGGER_WRITE( "parent found" );
hgs
parents:
diff changeset
  1643
            }
hgs
parents:
diff changeset
  1644
        
hgs
parents:
diff changeset
  1645
        RPointerArray<const CFolderItem> folderItems;
hgs
parents:
diff changeset
  1646
        CleanupClosePushL( folderItems );
hgs
parents:
diff changeset
  1647
        error = folderItems.Append( item );
hgs
parents:
diff changeset
  1648
        LOGGER_WRITE_1( "folderItems.Append error: %d", error );
hgs
parents:
diff changeset
  1649
        TRAP( error, iRootFolder.DeleteFolderItemsL( folderItems ) );
hgs
parents:
diff changeset
  1650
        CleanupStack::PopAndDestroy( &folderItems );
hgs
parents:
diff changeset
  1651
        LOGGER_WRITE_1( "Trap error: %d", error );
hgs
parents:
diff changeset
  1652
        
hgs
parents:
diff changeset
  1653
        iReplaceItem = aUid;
hgs
parents:
diff changeset
  1654
        iCurrentState = EBookmarkDeleting;
hgs
parents:
diff changeset
  1655
        LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." );
hgs
parents:
diff changeset
  1656
        }
hgs
parents:
diff changeset
  1657
        
hgs
parents:
diff changeset
  1658
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteItemL" );
hgs
parents:
diff changeset
  1659
    }
hgs
parents:
diff changeset
  1660
hgs
parents:
diff changeset
  1661
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1662
// CBookmarkDataStore::DoSoftDeleteItemL
hgs
parents:
diff changeset
  1663
// Soft delete isn't supported.
hgs
parents:
diff changeset
  1664
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1665
void CBookmarkDataStore::DoSoftDeleteItemL(TSmlDbItemUid /*aUid*/, TRequestStatus& aStatus)
hgs
parents:
diff changeset
  1666
    {
hgs
parents:
diff changeset
  1667
    LOGGER_ENTERFN( "CBookmarkDataStore::DoSoftDeleteItemL" );
hgs
parents:
diff changeset
  1668
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1669
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1670
    
hgs
parents:
diff changeset
  1671
    User::RequestComplete(iCallerStatus, KErrNotSupported); 
hgs
parents:
diff changeset
  1672
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoSoftDeleteItemL" );  
hgs
parents:
diff changeset
  1673
    }
hgs
parents:
diff changeset
  1674
hgs
parents:
diff changeset
  1675
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1676
// CBookmarkDataStore::DoDeleteAllItemsL
hgs
parents:
diff changeset
  1677
// Deletes all items in the standard folders of bookmark store
hgs
parents:
diff changeset
  1678
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1679
void CBookmarkDataStore::DoDeleteAllItemsL( TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1680
    {
hgs
parents:
diff changeset
  1681
    LOGGER_ENTERFN( "CBookmarkDataStore::DoDeleteAllItemsL" );
hgs
parents:
diff changeset
  1682
hgs
parents:
diff changeset
  1683
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1684
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1685
hgs
parents:
diff changeset
  1686
    // Check that we're in proper state
hgs
parents:
diff changeset
  1687
    if (iCurrentState != EOpenAndWaiting) 
hgs
parents:
diff changeset
  1688
        {
hgs
parents:
diff changeset
  1689
        LOGGER_WRITE_1( "CSmsDataStore::DoDeleteAllItemsL, Incorrect state: %d", iCurrentState );
hgs
parents:
diff changeset
  1690
        }
hgs
parents:
diff changeset
  1691
hgs
parents:
diff changeset
  1692
    // Reset the whole change finder
hgs
parents:
diff changeset
  1693
    iChangeFinder->ResetL();
hgs
parents:
diff changeset
  1694
    
hgs
parents:
diff changeset
  1695
    // Delete all Bookmark items
hgs
parents:
diff changeset
  1696
    LOGGER_WRITE( "Delete Bookmark items" );
hgs
parents:
diff changeset
  1697
    // Loop through all items at root, and delete everything
hgs
parents:
diff changeset
  1698
    CFavouritesItemList* list = new ( ELeave ) CFavouritesItemList();
hgs
parents:
diff changeset
  1699
    TInt error = iDb.GetAll( *list, KFavouritesRootUid );
hgs
parents:
diff changeset
  1700
    if ( error == KErrNone )  
hgs
parents:
diff changeset
  1701
        {
hgs
parents:
diff changeset
  1702
        // Loop through the list and delete all items
hgs
parents:
diff changeset
  1703
        TInt count = list->Count();
hgs
parents:
diff changeset
  1704
        LOGGER_WRITE_1("list->Count(): %d", count);
hgs
parents:
diff changeset
  1705
        for ( TInt i = 0; i < count; ++i )
hgs
parents:
diff changeset
  1706
            {
hgs
parents:
diff changeset
  1707
            CFavouritesItem* item = (*list)[i];
hgs
parents:
diff changeset
  1708
        
hgs
parents:
diff changeset
  1709
            // Don't bother try to erase items, which are read only
hgs
parents:
diff changeset
  1710
            if ( !item->IsFactoryItem() )
hgs
parents:
diff changeset
  1711
                {
hgs
parents:
diff changeset
  1712
                TInt deleted = iDb.Delete( item->Uid() );
hgs
parents:
diff changeset
  1713
                if ( deleted != KErrNone )
hgs
parents:
diff changeset
  1714
                    {
hgs
parents:
diff changeset
  1715
                    // In the case of error, store the error value
hgs
parents:
diff changeset
  1716
                    error = deleted;
hgs
parents:
diff changeset
  1717
                    LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteAllItemsL, iDb.Delete failed: %d", error);
hgs
parents:
diff changeset
  1718
                    }
hgs
parents:
diff changeset
  1719
                
hgs
parents:
diff changeset
  1720
                LOGGER_WRITE_1("item->Uid(): %d", item->Uid())
hgs
parents:
diff changeset
  1721
                LOGGER_WRITE_1("iDb.Delete ret: %d", error)
hgs
parents:
diff changeset
  1722
                
hgs
parents:
diff changeset
  1723
                }
hgs
parents:
diff changeset
  1724
            else
hgs
parents:
diff changeset
  1725
                {
hgs
parents:
diff changeset
  1726
                LOGGER_WRITE_1("item->IsFactoryItem(): id: %d", item->Uid());
hgs
parents:
diff changeset
  1727
                }
hgs
parents:
diff changeset
  1728
            }
hgs
parents:
diff changeset
  1729
        }
hgs
parents:
diff changeset
  1730
    else
hgs
parents:
diff changeset
  1731
        {
hgs
parents:
diff changeset
  1732
        LOGGER_WRITE_1("CBookmarkDataStore::DoDeleteAllItemsL, iDb.GetAll failed: %d", error);
hgs
parents:
diff changeset
  1733
        }
hgs
parents:
diff changeset
  1734
    delete list;
hgs
parents:
diff changeset
  1735
    
hgs
parents:
diff changeset
  1736
    // Delete all WebFeeds
hgs
parents:
diff changeset
  1737
    LOGGER_WRITE( "Delete RSS items" );
hgs
parents:
diff changeset
  1738
    if ( !iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  1739
        {
hgs
parents:
diff changeset
  1740
        User::RequestComplete( iCallerStatus, error );
hgs
parents:
diff changeset
  1741
        LOGGER_WRITE( "no RSS items" );
hgs
parents:
diff changeset
  1742
        return;
hgs
parents:
diff changeset
  1743
        }
hgs
parents:
diff changeset
  1744
    const CFolderItem& rootFolder = iRootFolder.RootFolderItem();
hgs
parents:
diff changeset
  1745
    // add subfolders
hgs
parents:
diff changeset
  1746
    RPointerArray<const CFolderItem> folderItems;
hgs
parents:
diff changeset
  1747
    CleanupClosePushL( folderItems );
hgs
parents:
diff changeset
  1748
    for ( TInt i = 0; i < rootFolder.FolderItemCount(); i++)
hgs
parents:
diff changeset
  1749
        {
hgs
parents:
diff changeset
  1750
        error = folderItems.Append( rootFolder.FolderItemAt( i ) );
hgs
parents:
diff changeset
  1751
        LOGGER_WRITE_1( "folderItems.Append error: %d", error );
hgs
parents:
diff changeset
  1752
        }
hgs
parents:
diff changeset
  1753
    
hgs
parents:
diff changeset
  1754
    if ( folderItems.Count() > 0 )
hgs
parents:
diff changeset
  1755
        {
hgs
parents:
diff changeset
  1756
        TRAP( error, iRootFolder.DeleteFolderItemsL( folderItems ) );
hgs
parents:
diff changeset
  1757
        
hgs
parents:
diff changeset
  1758
        LOGGER_WRITE_1( "Trap error: %d", error );
hgs
parents:
diff changeset
  1759
        
hgs
parents:
diff changeset
  1760
        iCurrentState = EBookmarkDeletingAll;
hgs
parents:
diff changeset
  1761
        LOGGER_WRITE( "Wait for FolderItemRequestCompleted.." );
hgs
parents:
diff changeset
  1762
        }
hgs
parents:
diff changeset
  1763
    else
hgs
parents:
diff changeset
  1764
        {
hgs
parents:
diff changeset
  1765
        LOGGER_WRITE( "RSS items not found" );
hgs
parents:
diff changeset
  1766
        User::RequestComplete( iCallerStatus, KErrNone ); 
hgs
parents:
diff changeset
  1767
        }
hgs
parents:
diff changeset
  1768
    CleanupStack::PopAndDestroy( &folderItems );
hgs
parents:
diff changeset
  1769
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeleteAllItemsL" );          
hgs
parents:
diff changeset
  1770
    }
hgs
parents:
diff changeset
  1771
hgs
parents:
diff changeset
  1772
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1773
// CBookmarkDataStore::DoHasSyncHistory
hgs
parents:
diff changeset
  1774
// This method returns ETrue if Data Store has history information. 
hgs
parents:
diff changeset
  1775
// Slow-sync will be used if Data Store does not have history information.
hgs
parents:
diff changeset
  1776
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1777
TBool CBookmarkDataStore::DoHasSyncHistory() const
hgs
parents:
diff changeset
  1778
    {
hgs
parents:
diff changeset
  1779
    LOGGER_ENTERFN( "CBookmarkDataStore::DoHasSyncHistory" );
hgs
parents:
diff changeset
  1780
    LOGGER_WRITE_1( "iHasHistory: %d", iHasHistory );
hgs
parents:
diff changeset
  1781
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoHasSyncHistory" );   
hgs
parents:
diff changeset
  1782
    return iHasHistory;
hgs
parents:
diff changeset
  1783
    }
hgs
parents:
diff changeset
  1784
hgs
parents:
diff changeset
  1785
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1786
// CBookmarkDataStore::DoAddedItems
hgs
parents:
diff changeset
  1787
// This method returns UIDs of added items. Those items are added after previous
hgs
parents:
diff changeset
  1788
// synchronization with current synchronization relationship. 
hgs
parents:
diff changeset
  1789
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1790
const MSmlDataItemUidSet& CBookmarkDataStore::DoAddedItems() const
hgs
parents:
diff changeset
  1791
    {
hgs
parents:
diff changeset
  1792
    LOGGER_ENTERFN( "CBookmarkDataStore::DoAddedItems" );
hgs
parents:
diff changeset
  1793
    
hgs
parents:
diff changeset
  1794
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1795
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
  1796
        {
hgs
parents:
diff changeset
  1797
        LOGGER_WRITE_1( "CBookmarkDataStore::DoAddedItems, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1798
        }
hgs
parents:
diff changeset
  1799
    
hgs
parents:
diff changeset
  1800
    TInt error(KErrNone);
hgs
parents:
diff changeset
  1801
    
hgs
parents:
diff changeset
  1802
    // Clear new-items array
hgs
parents:
diff changeset
  1803
    iNewItems->Reset();
hgs
parents:
diff changeset
  1804
    
hgs
parents:
diff changeset
  1805
    // Search for new items
hgs
parents:
diff changeset
  1806
    TRAP( error, iChangeFinder->FindNewItemsL( *iNewItems ) )
hgs
parents:
diff changeset
  1807
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1808
        {
hgs
parents:
diff changeset
  1809
        LOGGER_WRITE_1( "CBookmarkDataStore::DoAddedItems, iChangeFinder->FindNewItemsL leaved with %d.", error );
hgs
parents:
diff changeset
  1810
        } 
hgs
parents:
diff changeset
  1811
    
hgs
parents:
diff changeset
  1812
    LOGGER_WRITE_1( "New item count: %d.", iNewItems->ItemCount() );
hgs
parents:
diff changeset
  1813
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoAddedItems" );
hgs
parents:
diff changeset
  1814
    
hgs
parents:
diff changeset
  1815
    return *iNewItems;  
hgs
parents:
diff changeset
  1816
    }
hgs
parents:
diff changeset
  1817
    
hgs
parents:
diff changeset
  1818
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1819
// CBookmarkDataStore::DoDeletedItems
hgs
parents:
diff changeset
  1820
// Returns ids of items, which are deleted after previous synchronization
hgs
parents:
diff changeset
  1821
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1822
const MSmlDataItemUidSet& CBookmarkDataStore::DoDeletedItems() const
hgs
parents:
diff changeset
  1823
    {
hgs
parents:
diff changeset
  1824
    LOGGER_ENTERFN( "CBookmarkDataStore::DoDeletedItemsL" );    
hgs
parents:
diff changeset
  1825
    
hgs
parents:
diff changeset
  1826
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1827
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
  1828
        {
hgs
parents:
diff changeset
  1829
        LOGGER_WRITE_1( "CBookmarkDataStore::DoDeletedItems, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1830
        }
hgs
parents:
diff changeset
  1831
    
hgs
parents:
diff changeset
  1832
    TInt error( KErrNone );
hgs
parents:
diff changeset
  1833
    
hgs
parents:
diff changeset
  1834
    // Clear deleted-items array
hgs
parents:
diff changeset
  1835
    iDeletedItems->Reset();
hgs
parents:
diff changeset
  1836
    
hgs
parents:
diff changeset
  1837
    // Search for deleted items
hgs
parents:
diff changeset
  1838
    TRAP( error, iChangeFinder->FindDeletedItemsL( *iDeletedItems ) );
hgs
parents:
diff changeset
  1839
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1840
        {
hgs
parents:
diff changeset
  1841
        LOGGER_WRITE_1( "CBookmarkDataStore::DoDeletedItems, iChangeFinder->FindDeletedItemsL leaved with %d.", error );
hgs
parents:
diff changeset
  1842
        }
hgs
parents:
diff changeset
  1843
    
hgs
parents:
diff changeset
  1844
    LOGGER_WRITE_1( "Deleted item count: %d.", iDeletedItems->ItemCount() );
hgs
parents:
diff changeset
  1845
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoDeletedItemsL" );
hgs
parents:
diff changeset
  1846
    return *iDeletedItems;
hgs
parents:
diff changeset
  1847
    }
hgs
parents:
diff changeset
  1848
hgs
parents:
diff changeset
  1849
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1850
// CBookmarkDataStore::DoSoftDeletedItems
hgs
parents:
diff changeset
  1851
// Not directly supported, empty list returned
hgs
parents:
diff changeset
  1852
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1853
const MSmlDataItemUidSet& CBookmarkDataStore::DoSoftDeletedItems() const
hgs
parents:
diff changeset
  1854
    {
hgs
parents:
diff changeset
  1855
    LOGGER_ENTERFN( "CBookmarkDataStore::DoSoftDeletedItems" );
hgs
parents:
diff changeset
  1856
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoSoftDeletedItems" );         
hgs
parents:
diff changeset
  1857
hgs
parents:
diff changeset
  1858
    // Return empty array as a result
hgs
parents:
diff changeset
  1859
    iSoftDeletedItems->Reset();
hgs
parents:
diff changeset
  1860
    return *iSoftDeletedItems;
hgs
parents:
diff changeset
  1861
    }
hgs
parents:
diff changeset
  1862
hgs
parents:
diff changeset
  1863
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1864
// CBookmarkDataStore::DoModifiedItems
hgs
parents:
diff changeset
  1865
// Finds all modified items in the data store
hgs
parents:
diff changeset
  1866
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1867
const MSmlDataItemUidSet& CBookmarkDataStore::DoModifiedItems() const
hgs
parents:
diff changeset
  1868
    {
hgs
parents:
diff changeset
  1869
    LOGGER_ENTERFN( "CBookmarkDataStore::DoModifiedItems" );    
hgs
parents:
diff changeset
  1870
    
hgs
parents:
diff changeset
  1871
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1872
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
  1873
        {
hgs
parents:
diff changeset
  1874
        LOGGER_WRITE_1( "CBookmarkDataStore::DoModifiedItems, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1875
        }
hgs
parents:
diff changeset
  1876
hgs
parents:
diff changeset
  1877
    TInt error( KErrNone );
hgs
parents:
diff changeset
  1878
hgs
parents:
diff changeset
  1879
    // Clear updated-items array
hgs
parents:
diff changeset
  1880
    iUpdatedItems->Reset();
hgs
parents:
diff changeset
  1881
    
hgs
parents:
diff changeset
  1882
    // Search for updated items
hgs
parents:
diff changeset
  1883
    TRAP( error, iChangeFinder->FindChangedItemsL( *iUpdatedItems ) )
hgs
parents:
diff changeset
  1884
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1885
        {
hgs
parents:
diff changeset
  1886
        LOGGER_WRITE_1( "CBookmarkDataStore::DoModifiedItems, iChangeFinder->FindChangedItemsL leaved with %d.", error );
hgs
parents:
diff changeset
  1887
        }
hgs
parents:
diff changeset
  1888
    
hgs
parents:
diff changeset
  1889
    LOGGER_WRITE_1( "Modified item count: %d.", iUpdatedItems->ItemCount() );
hgs
parents:
diff changeset
  1890
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoModifiedItems" );        
hgs
parents:
diff changeset
  1891
    return *iUpdatedItems;
hgs
parents:
diff changeset
  1892
    }
hgs
parents:
diff changeset
  1893
hgs
parents:
diff changeset
  1894
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1895
// CBookmarkDataStore::DoMovedItems
hgs
parents:
diff changeset
  1896
// Finds all moved items in the data store
hgs
parents:
diff changeset
  1897
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1898
const MSmlDataItemUidSet& CBookmarkDataStore::DoMovedItems() const
hgs
parents:
diff changeset
  1899
    {
hgs
parents:
diff changeset
  1900
    LOGGER_ENTERFN( "CBookmarkDataStore::DoMovedItems" );   
hgs
parents:
diff changeset
  1901
    
hgs
parents:
diff changeset
  1902
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1903
    if ( iCurrentState != EOpenAndWaiting )
hgs
parents:
diff changeset
  1904
        {
hgs
parents:
diff changeset
  1905
        LOGGER_WRITE_1( "CBookmarkDataStore::DoMovedItems, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1906
        }       
hgs
parents:
diff changeset
  1907
    
hgs
parents:
diff changeset
  1908
    TInt error( KErrNone );
hgs
parents:
diff changeset
  1909
    
hgs
parents:
diff changeset
  1910
    // Clear moved-items array
hgs
parents:
diff changeset
  1911
    iMovedItems->Reset();
hgs
parents:
diff changeset
  1912
    
hgs
parents:
diff changeset
  1913
    TRAP( error, iChangeFinder->FindMovedItemsL( *iMovedItems ) );
hgs
parents:
diff changeset
  1914
    if ( error != KErrNone )
hgs
parents:
diff changeset
  1915
        {
hgs
parents:
diff changeset
  1916
        LOGGER_WRITE_1( "CBookmarkDataStore::DoMovedItems, iChangeFinder->FindMovedItemsL leaved with %d.", error );
hgs
parents:
diff changeset
  1917
        }
hgs
parents:
diff changeset
  1918
       
hgs
parents:
diff changeset
  1919
    LOGGER_WRITE_1( "Moved item count: %d.", iMovedItems->ItemCount() );
hgs
parents:
diff changeset
  1920
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoMovedItems" );
hgs
parents:
diff changeset
  1921
    return *iMovedItems;
hgs
parents:
diff changeset
  1922
    }
hgs
parents:
diff changeset
  1923
hgs
parents:
diff changeset
  1924
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1925
// CBookmarkDataStore::DoResetChangeInfoL
hgs
parents:
diff changeset
  1926
// Resets change history in the data store. All content is considered
hgs
parents:
diff changeset
  1927
// new in the data store point of view.
hgs
parents:
diff changeset
  1928
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1929
void CBookmarkDataStore::DoResetChangeInfoL( TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1930
    {
hgs
parents:
diff changeset
  1931
    LOGGER_ENTERFN( "CBookmarkDataStore::DoResetChangeInfoL" );
hgs
parents:
diff changeset
  1932
    
hgs
parents:
diff changeset
  1933
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1934
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1935
    
hgs
parents:
diff changeset
  1936
    // Check that we're in proper state
hgs
parents:
diff changeset
  1937
    if ( iCurrentState != EOpenAndWaiting ) 
hgs
parents:
diff changeset
  1938
        {
hgs
parents:
diff changeset
  1939
        LOGGER_WRITE_1( "CBookmarkDataStore::DoResetChangeInfoL, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1940
        }   
hgs
parents:
diff changeset
  1941
            
hgs
parents:
diff changeset
  1942
    // Reset change info in ChangeFinder
hgs
parents:
diff changeset
  1943
    iChangeFinder->ResetL();
hgs
parents:
diff changeset
  1944
    iHasHistory = EFalse;
hgs
parents:
diff changeset
  1945
    
hgs
parents:
diff changeset
  1946
    // Signal we're done
hgs
parents:
diff changeset
  1947
    User::RequestComplete( iCallerStatus, KErrNone );   
hgs
parents:
diff changeset
  1948
        
hgs
parents:
diff changeset
  1949
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoResetChangeInfoL" );     
hgs
parents:
diff changeset
  1950
    }
hgs
parents:
diff changeset
  1951
hgs
parents:
diff changeset
  1952
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1953
// CBookmarkDataStore::DoCommitChangeInfoL
hgs
parents:
diff changeset
  1954
// Commits change info. These items are no longer reported, when change
hgs
parents:
diff changeset
  1955
// information is being queried.
hgs
parents:
diff changeset
  1956
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1957
void CBookmarkDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus,
hgs
parents:
diff changeset
  1958
    const MSmlDataItemUidSet& aItems )
hgs
parents:
diff changeset
  1959
    {
hgs
parents:
diff changeset
  1960
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitChangeInfoL(1)" );
hgs
parents:
diff changeset
  1961
    
hgs
parents:
diff changeset
  1962
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1963
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1964
    
hgs
parents:
diff changeset
  1965
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1966
    if ( iCurrentState != EOpenAndWaiting ) 
hgs
parents:
diff changeset
  1967
        {
hgs
parents:
diff changeset
  1968
        LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1969
        }
hgs
parents:
diff changeset
  1970
hgs
parents:
diff changeset
  1971
    // Notify ChangeFinder
hgs
parents:
diff changeset
  1972
    LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, item count %d.", aItems.ItemCount() );
hgs
parents:
diff changeset
  1973
    iChangeFinder->CommitChangesL( aItems );
hgs
parents:
diff changeset
  1974
    iHasHistory = ETrue;
hgs
parents:
diff changeset
  1975
        
hgs
parents:
diff changeset
  1976
    // Signal we're done
hgs
parents:
diff changeset
  1977
    User::RequestComplete( iCallerStatus, KErrNone );
hgs
parents:
diff changeset
  1978
    
hgs
parents:
diff changeset
  1979
    LOGGER_LEAVEFN(" CBookmarkDataStore::DoCommitChangeInfoL(1)" ); 
hgs
parents:
diff changeset
  1980
    }
hgs
parents:
diff changeset
  1981
hgs
parents:
diff changeset
  1982
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1983
// CBookmarkDataStore::DoCommitChangeInfoL
hgs
parents:
diff changeset
  1984
// Commits change info. There is no more nothing to report when change
hgs
parents:
diff changeset
  1985
// information is being queried. 
hgs
parents:
diff changeset
  1986
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  1987
void CBookmarkDataStore::DoCommitChangeInfoL( TRequestStatus& aStatus )
hgs
parents:
diff changeset
  1988
    {
hgs
parents:
diff changeset
  1989
    LOGGER_ENTERFN( "CBookmarkDataStore::DoCommitChangeInfoL(2)" );
hgs
parents:
diff changeset
  1990
hgs
parents:
diff changeset
  1991
    iCallerStatus = &aStatus;
hgs
parents:
diff changeset
  1992
    *iCallerStatus = KRequestPending;
hgs
parents:
diff changeset
  1993
    
hgs
parents:
diff changeset
  1994
    // Ensure that we're in a proper state
hgs
parents:
diff changeset
  1995
    if ( iCurrentState != EOpenAndWaiting ) 
hgs
parents:
diff changeset
  1996
        {
hgs
parents:
diff changeset
  1997
        LOGGER_WRITE_1( "CBookmarkDataStore::DoCommitChangeInfoL, invalid state %d.", iCurrentState );
hgs
parents:
diff changeset
  1998
        }
hgs
parents:
diff changeset
  1999
    
hgs
parents:
diff changeset
  2000
    // Notify ChangeFinder
hgs
parents:
diff changeset
  2001
    iChangeFinder->CommitChangesL();
hgs
parents:
diff changeset
  2002
    iHasHistory = ETrue;
hgs
parents:
diff changeset
  2003
        
hgs
parents:
diff changeset
  2004
    // Signal we're done
hgs
parents:
diff changeset
  2005
    User::RequestComplete( iCallerStatus, KErrNone );
hgs
parents:
diff changeset
  2006
        
hgs
parents:
diff changeset
  2007
    LOGGER_LEAVEFN( "CBookmarkDataStore::DoCommitChangeInfoL(2)" );     
hgs
parents:
diff changeset
  2008
    }
hgs
parents:
diff changeset
  2009
hgs
parents:
diff changeset
  2010
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2011
// CBookmarkDataStore::RegisterSnapshotL
hgs
parents:
diff changeset
  2012
// Sets Changefinder to compare against current bookmark store content
hgs
parents:
diff changeset
  2013
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2014
void CBookmarkDataStore::RegisterSnapshotL()
hgs
parents:
diff changeset
  2015
    {
hgs
parents:
diff changeset
  2016
    LOGGER_ENTERFN( "CBookmarkDataStore::RegisterSnapshotL()" );
hgs
parents:
diff changeset
  2017
    
hgs
parents:
diff changeset
  2018
    CArrayFixSeg<TSnapshotItem>* snapshot = 
hgs
parents:
diff changeset
  2019
        new ( ELeave ) CArrayFixSeg<TSnapshotItem>( KSnapshotGranularity );
hgs
parents:
diff changeset
  2020
    CleanupStack::PushL( snapshot );
hgs
parents:
diff changeset
  2021
    
hgs
parents:
diff changeset
  2022
    
hgs
parents:
diff changeset
  2023
    RegisterToSnapshotL( snapshot, KFavouritesRootUid );
hgs
parents:
diff changeset
  2024
    
hgs
parents:
diff changeset
  2025
    if ( iRootFolder.HasRootFolderItem() )
hgs
parents:
diff changeset
  2026
        {
hgs
parents:
diff changeset
  2027
        RegisterRssFeedsToSnapshotL( snapshot, iRootFolder.RootFolderItem() );
hgs
parents:
diff changeset
  2028
        }
hgs
parents:
diff changeset
  2029
    
hgs
parents:
diff changeset
  2030
    // Set new snapshot to compare against
hgs
parents:
diff changeset
  2031
    iChangeFinder->SetNewSnapshot( snapshot );
hgs
parents:
diff changeset
  2032
    
hgs
parents:
diff changeset
  2033
    // Changefinder takes ownership of the snapshot
hgs
parents:
diff changeset
  2034
    CleanupStack::Pop( snapshot );
hgs
parents:
diff changeset
  2035
    
hgs
parents:
diff changeset
  2036
    LOGGER_LEAVEFN( "CBookmarkDataStore::RegisterSnapshotL()" );
hgs
parents:
diff changeset
  2037
    }
hgs
parents:
diff changeset
  2038
hgs
parents:
diff changeset
  2039
hgs
parents:
diff changeset
  2040
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2041
// CBookmarkDataStore::RegisterToSnapshotL
hgs
parents:
diff changeset
  2042
// Adds recursively all the bookmark items to the snapshot
hgs
parents:
diff changeset
  2043
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2044
void CBookmarkDataStore::RegisterToSnapshotL( CArrayFixSeg<TSnapshotItem>* aSnapshot,
hgs
parents:
diff changeset
  2045
    TInt aFolderUid )
hgs
parents:
diff changeset
  2046
    {
hgs
parents:
diff changeset
  2047
    CFavouritesItemList* list = new ( ELeave ) CFavouritesItemList;
hgs
parents:
diff changeset
  2048
    CleanupStack::PushL( list );
hgs
parents:
diff changeset
  2049
    TInt error = iDb.GetAll( *list, aFolderUid );
hgs
parents:
diff changeset
  2050
    if ( error == KErrNone )
hgs
parents:
diff changeset
  2051
        {
hgs
parents:
diff changeset
  2052
        // Loop through the list. Add folders and items to the snapshot
hgs
parents:
diff changeset
  2053
        TInt count = list->Count();
hgs
parents:
diff changeset
  2054
        for ( TInt i = 0; i < count; ++i )
hgs
parents:
diff changeset
  2055
            {
hgs
parents:
diff changeset
  2056
            CFavouritesItem* item = (*list)[i];
hgs
parents:
diff changeset
  2057
            // No matter whether it's a folder or item, we'll add it to snapshot
hgs
parents:
diff changeset
  2058
            TSnapshotItem snapshotItem( item->Uid() );
hgs
parents:
diff changeset
  2059
            snapshotItem.SetParentId( item->ParentFolder() );
hgs
parents:
diff changeset
  2060
            snapshotItem.CreateHashL( item->Name(), item->Url() );
hgs
parents:
diff changeset
  2061
            TKeyArrayFix key( iKey );
hgs
parents:
diff changeset
  2062
            aSnapshot->InsertIsqL( snapshotItem, key );
hgs
parents:
diff changeset
  2063
hgs
parents:
diff changeset
  2064
            // Remember to add also childs in case of folder (recurse)
hgs
parents:
diff changeset
  2065
            if ( item->Type() == CFavouritesItem::EFolder )
hgs
parents:
diff changeset
  2066
                {
hgs
parents:
diff changeset
  2067
                RegisterToSnapshotL( aSnapshot, item->Uid() );
hgs
parents:
diff changeset
  2068
                }
hgs
parents:
diff changeset
  2069
            }
hgs
parents:
diff changeset
  2070
        }
hgs
parents:
diff changeset
  2071
    CleanupStack::PopAndDestroy( list ); //list
hgs
parents:
diff changeset
  2072
    }
hgs
parents:
diff changeset
  2073
hgs
parents:
diff changeset
  2074
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2075
// CBookmarkDataStore::RegisterRssFeedsToSnapshotL
hgs
parents:
diff changeset
  2076
// Adds recursively all the rssFeed items to the snapshot
hgs
parents:
diff changeset
  2077
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2078
void CBookmarkDataStore::RegisterRssFeedsToSnapshotL( CArrayFixSeg<TSnapshotItem>* aSnapshot,
hgs
parents:
diff changeset
  2079
    const CFolderItem& folder )
hgs
parents:
diff changeset
  2080
    {
hgs
parents:
diff changeset
  2081
    TSnapshotItem snapshotItem( folder.Id() + KRssFeedsOffset );
hgs
parents:
diff changeset
  2082
    
hgs
parents:
diff changeset
  2083
    const CFolderItem* parent = folder.Parent();
hgs
parents:
diff changeset
  2084
    if ( parent )
hgs
parents:
diff changeset
  2085
        {
hgs
parents:
diff changeset
  2086
        snapshotItem.SetParentId( parent->Id() + KRssFeedsOffset );
hgs
parents:
diff changeset
  2087
        }
hgs
parents:
diff changeset
  2088
    else
hgs
parents:
diff changeset
  2089
        {
hgs
parents:
diff changeset
  2090
        snapshotItem.SetParentId( KErrNotFound );
hgs
parents:
diff changeset
  2091
        }
hgs
parents:
diff changeset
  2092
    snapshotItem.CreateHashL( folder.Name(), folder.SourceUrl() );
hgs
parents:
diff changeset
  2093
    
hgs
parents:
diff changeset
  2094
    TKeyArrayFix key( iKey );
hgs
parents:
diff changeset
  2095
    aSnapshot->InsertIsqL( snapshotItem, key );
hgs
parents:
diff changeset
  2096
    
hgs
parents:
diff changeset
  2097
    // add subfolders
hgs
parents:
diff changeset
  2098
    for ( TInt i = 0; i < folder.FolderItemCount(); i++)
hgs
parents:
diff changeset
  2099
        {
hgs
parents:
diff changeset
  2100
        RegisterRssFeedsToSnapshotL( aSnapshot, *(folder.FolderItemAt( i ) ));
hgs
parents:
diff changeset
  2101
        }
hgs
parents:
diff changeset
  2102
    }
hgs
parents:
diff changeset
  2103
hgs
parents:
diff changeset
  2104
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2105
// CBookmarkDataStore::AssignString
hgs
parents:
diff changeset
  2106
// Assigns data from one descriptor into another, truncates if too long 
hgs
parents:
diff changeset
  2107
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
  2108
void CBookmarkDataStore::AssignString( TDes8& aDestination, const TDesC8& aSource )
hgs
parents:
diff changeset
  2109
    {
hgs
parents:
diff changeset
  2110
    TInt targetLength = aSource.Length();
hgs
parents:
diff changeset
  2111
    if ( aDestination.MaxLength() < targetLength )
hgs
parents:
diff changeset
  2112
        {
hgs
parents:
diff changeset
  2113
        targetLength = aDestination.MaxLength();
hgs
parents:
diff changeset
  2114
        }
hgs
parents:
diff changeset
  2115
        
hgs
parents:
diff changeset
  2116
    aDestination.Copy( aSource.Ptr(), targetLength );
hgs
parents:
diff changeset
  2117
    }