browserui/browser/FavouritesSrc/BrowserFavouritesIncrementalDelete.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:04 +0100
branchRCL_3
changeset 65 8e6fa1719340
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201032 Kit: 201035

/*
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*      Implementation of CWmlBrowserFavouritesIncrementalDelete.
*      
*
*/


// INCLUDE FILES

#include <AknWaitDialog.h>
#include <favouritesdb.h>
#include <BrowserNG.rsg>
#include "BrowserFavouritesIncrementalDelete.h"
#include "BrowserFavouritesModel.h"

// CONSTANTS

/// Granularity of the folder-contents array.
LOCAL_D const TInt KGranularity = 4;

// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CBrowserFavouritesIncrementalDelete::NewL
// ---------------------------------------------------------
//
CBrowserFavouritesIncrementalDelete*
CBrowserFavouritesIncrementalDelete::NewL
        (
        CBrowserFavouritesModel& aModel,
        CArrayFix<TInt>& aUids,
        CArrayFix<TInt>& aNotDeletedUids,
        TInt aPriority /*=CActive::EPriorityStandard*/
        )
    {
    CBrowserFavouritesIncrementalDelete* incDel =
        new (ELeave) CBrowserFavouritesIncrementalDelete
        ( aModel, aUids, aNotDeletedUids, aPriority );
    CleanupStack::PushL( incDel );
    incDel->ConstructL();
    CleanupStack::Pop();    // incDel
    return incDel;
    }

// ---------------------------------------------------------
// CBrowserFavouritesIncrementalDelete::~CBrowserFavouritesIncrementalDelete
// ---------------------------------------------------------
//
CBrowserFavouritesIncrementalDelete::~CBrowserFavouritesIncrementalDelete()
    {
    delete iFolderContents;
    }

// ---------------------------------------------------------
// CBrowserFavouritesIncrementalDelete::CBrowserFavouritesIncrementalDelete
// ---------------------------------------------------------
//
CBrowserFavouritesIncrementalDelete::CBrowserFavouritesIncrementalDelete
    (
    CBrowserFavouritesModel& aModel,
    CArrayFix<TInt>& aUids,
    CArrayFix<TInt>& aNotDeletedUids,
    TInt aPriority
    )
: CBrowserFavouritesIncrementalOp( aModel, aPriority ), iUids( &aUids ),
  iNotDeletedUids( &aNotDeletedUids ), iFolderPending( EFalse ), iIndex( 0 )
    {
    }

// CBrowserFavouritesIncrementalDelete::ConstructL
// ---------------------------------------------------------
//
void CBrowserFavouritesIncrementalDelete::ConstructL()
    {
    CBrowserFavouritesIncrementalOp::ConstructL();
    iFolderContents = new (ELeave) CArrayFixFlat<TInt>( KGranularity );
    }

// ---------------------------------------------------------
// CBrowserFavouritesIncrementalDelete::StepL
// ---------------------------------------------------------
//
TInt CBrowserFavouritesIncrementalDelete::StepL()
    {
    if ( iFolderContents->Count() )
        {
        // Deleting one item from folder.
        (void)iModel->Database().Delete( iFolderContents->At( 0 ) );
        iFolderContents->Delete( 0 );
        }
    else if ( iIndex < iUids->Count() )
        {
        // Still have item in the main list to delete.
        TInt uid = iUids->At( iIndex );
        // Check if it is a non-empty folder: get contents.
        //
        // The variable iFolderPending is a performance optimization: avoid
        // querying contents of a folder twice. (If iFolderPending == ETrue,
        // and we reach this point, that means that the last item in a folder
        // was deleted in the last StepL. The contents of this folder were
        // already queried).
        if ( !iFolderPending )
            {
            // The contents of this folder were not queried yet: do it now.
            iModel->Database().GetUids( *iFolderContents, uid );
            }
        if ( iFolderContents->Count() )
            {
            // Folder is not empty, do nothing now. iIndex is not incremented
            // (deletion of this folder becomes pending) and next StepL will
            // begin deleting the contents.
            iFolderPending = ETrue;
            }
        else
            {
            // Deleting an empty (pending) folder or an ordinary item.
            iFolderPending = EFalse;
            if ( iModel->Database().Delete( uid ) != KErrNone )
                {
                // Error deleting.
                iNotDeletedUids->AppendL( uid );
                }
            iIndex++;
            }
        }
    return iUids->Count() - iIndex;
    }

// ---------------------------------------------------------
// CBrowserFavouritesIncrementalDelete::CreateWaitNoteLC
// ---------------------------------------------------------
//
void CBrowserFavouritesIncrementalDelete::CreateWaitNoteLC()
    {
    iWaitNote = new (ELeave) CAknWaitDialog
        ( REINTERPRET_CAST( CEikDialog**, &iWaitNote ) );
    iWaitNote->PrepareLC( R_WMLBROWSER_FAVOURITES_NOTE_DELETING );
    }

// End of File