activityfw/storage/server/src/afdatabasecleaner.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 02 Sep 2010 20:45:03 +0300
changeset 115 3ab5c078b490
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:
*
*/

#include "afdatabasecleaner.h"

CAfDatabaseCleaner::~CAfDatabaseCleaner()
{
    Cancel();
}

CAfDatabaseCleaner::CAfDatabaseCleaner(RDbStoreDatabase &database) : CActive(EPriorityIdle), mDatabase(database), mCleanupStep(Initial)
{
    CActiveScheduler::Add(this);
}

void CAfDatabaseCleaner::StartCleanup()
{
    if (!IsActive()) {
        mCleanupStep = Initial;
        SetActive();
        CompleteSelf(KErrNone);
    }
}

void CAfDatabaseCleaner::RunL()
{
    if (KErrNone == iStatus.Int()) {
        switch (mCleanupStep) {
            case Initial:
            {
                User::LeaveIfError(mIncrementalInterface.Compact(mDatabase, mStep));
                mCleanupStep = Continuation;
                SetActive();
                CompleteSelf(KErrNone);
                break;
            }
            case Continuation:
            {
                User::LeaveIfError(mIncrementalInterface.Next(mStep));
                if (mStep != 0) {
                    SetActive();
                    CompleteSelf(KErrNone);
                } else {
                    mIncrementalInterface.Close();
                }
                break;
            }
            default:
                User::Leave(KErrArgument);
        }
    }
}

void CAfDatabaseCleaner::DoCancel()
{
    mIncrementalInterface.Close();
}

void CAfDatabaseCleaner::CompleteSelf(TInt completionCode)
{
    TRequestStatus* status = &iStatus;
    User::RequestComplete(status, completionCode);
}

TInt CAfDatabaseCleaner::RunError(TInt /*aError*/)
{
    mIncrementalInterface.Close();
    return KErrNone;
}