landmarks/locationlandmarks/localaccess/src/EPos_CPosLmLocalResetGlobalCatOp.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:37:04 +0300
branchRCL_3
changeset 44 2b4ea9893b66
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2005 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: Operation for resetting global categories.
*
*
*/


// INCLUDE FILES
#include    <EPos_LandmarksErrors.h>
#include    <epos_cposlmglobalcategoryreader.h>
#include    <epos_poslmcategoryhandler.h>
#include    <eposlmasyncops.rsg>
#include    <epos_cposlmlocaldbaccess.h>
#include    "EPos_CPosLmLocalResetGlobalCatOp.h"
#include    "epos_cposlmlocaldatabase.h"
#include    "EPos_CPosLmLocalCategoryManager.h"
#include    "EPos_LocalLandmarks.h"

// CONSTANTS
const TReal32 KReadGlCat =              0.2f;
const TReal32 KResetGlCat =             0.5f;
const TReal32 KCheckGlCatToBeRemoved =  0.1f;
const TReal32 KRemoveNotInResource =    0.2f;

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

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::CPosLmLocalResetGlobalCatOp
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CPosLmLocalResetGlobalCatOp::CPosLmLocalResetGlobalCatOp(
    CPosLmLocalDatabase& aDb) :
    CPosLmLocalModifyOp(aDb),
    iState(EReadGlCat)
    {
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::ConstructL()
    {
    BaseConstructL();
    ReadInfoFromResourceFileL(R_POS_LM_LOCAL_RESET_GLOBAL_CATEGORIES_OP);
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CPosLmLocalResetGlobalCatOp* CPosLmLocalResetGlobalCatOp::NewL(
    CPosLmLocalDatabase& aDb)
    {
    CPosLmLocalResetGlobalCatOp* self = new(ELeave) CPosLmLocalResetGlobalCatOp(
        aDb);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop(self);
    return self;
    }

// Destructor
CPosLmLocalResetGlobalCatOp::~CPosLmLocalResetGlobalCatOp()
    {
    RollbackAndRegisterIfNeeded();
    iModifiedGlCats.Close();
    iToBeRemoved.Close();
    delete iGlCatReader;
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::DoNextStepPreL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::DoNextStepPreL(
    TReal32& aProgress)
    {
    switch (iState)
        {
        case EReadGlCat:
            iGlCatReader = CPosLmGlobalCategoryReader::NewL();
            aProgress = KReadGlCat;
            break;
        case EResetGlCat:
            ResetCategoryPreL(aProgress);
            break;
        case ECheckGlCatToBeRemoved:
            // Find global categories to be removed (not in resource file)
            PosLmCategoryHandler::GetGlobalCategoriesL(*iDb->DatabaseAccess(),
                iModifiedGlCats, iToBeRemoved);
            iCurrent = 0; // Reset counter, so it can be reused
            aProgress = KReadGlCat + KResetGlCat + KCheckGlCatToBeRemoved;
            break;
        default: //ERemoveNotInResource
            RemoveCategoryNotInResourceL(aProgress);
            break;
        }
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::DoNextStepPostL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TBool CPosLmLocalResetGlobalCatOp::DoNextStepPostL(
    TReal32& /*aProgress*/)
    {
    switch (iState)
        {
        case EReadGlCat:
            iState = EResetGlCat;
            return ETrue;
        case EResetGlCat:
            if (iGlCatReader->Count() == 0 || iCurrent == iGlCatReader->Count())
                {
                // Done with reset, so step into next step.
                iState = ECheckGlCatToBeRemoved;
                }
            return ETrue;
        case ECheckGlCatToBeRemoved:
            iState = ERemoveNotInResource;
            return ETrue;
        default: //ERemoveNotInResource
            if (iToBeRemoved.Count() == 0 || iCurrent == iToBeRemoved.Count())
                {
                // Operation done
                iStatusFlag = KErrNone;

                User::LeaveIfError(
                    iDb->RegisterEvent(EPosLmEventCategoryUnknownChanges));

                return EFalse;
                }
            return ETrue;
        }
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::Step
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
TReal32 CPosLmLocalResetGlobalCatOp::Step()
    {
    TReal32 step;

    switch (iState)
        {
        case EReadGlCat:
            step = KReadGlCat;
            break;
        case EResetGlCat:
            if (iGlCatReader->Count() > 0)
                {
                step = KResetGlCat/iGlCatReader->Count();
                }
            else
                {
                step = KResetGlCat;
                }
            break;
        case ECheckGlCatToBeRemoved:
            step = KCheckGlCatToBeRemoved;
            break;
        default: //ERemoveNotInResource
            if (iToBeRemoved.Count() > 0)
                {
                step = KCheckGlCatToBeRemoved/iToBeRemoved.Count();
                }
            else
                {
                step = KCheckGlCatToBeRemoved;
                }
            break;
        }

    return step;
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::CheckResourceValue
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::CheckResourceValue(
    TInt /*aResourceId*/,
    TInt aNoOfSubOperations)
    {
    __ASSERT_ALWAYS(aNoOfSubOperations > 0, Panic(KPosLandmarksClientPanic,
        EPosInvalidValueSpecifiedInResourceFile));
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::HandleError
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::HandleError(
    TInt& aError)
    {
    iStatusFlag = aError;
    RollbackAndRegisterIfNeeded();
    iState = EError;
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::ResetCategoryPreL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::ResetCategoryPreL(
    TReal32& aProgress)
    {
    for (TInt i = 0; i < iNoOfSubOperations &&
        iCurrent < iGlCatReader->Count(); i++)
        {
        ResetCategoryL(iCurrent++);
        }

    if (iGlCatReader->Count() != 0)
        {
        aProgress = KReadGlCat +
            (TReal32(iCurrent)/iGlCatReader->Count()) * KResetGlCat;
        }
    else
        {
        aProgress = KReadGlCat + KResetGlCat;
        }
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::RemoveCategoryNotInResourceL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::RemoveCategoryNotInResourceL(
    TReal32& aProgress)
    {
    // Remove global categories not in the resource file
    if (iToBeRemoved.Count() > 0)
        {
        PosLmCategoryHandler::RemoveCategoryL(*iDb->DatabaseAccess(),
            iToBeRemoved[iCurrent++]);
        }

    if (iToBeRemoved.Count() != 0)
        {
        aProgress = KResetGlCat + KResetGlCat + KCheckGlCatToBeRemoved +
            (TReal32(iCurrent)/iToBeRemoved.Count()) * KRemoveNotInResource;
        }
    else
        {
        aProgress = KReadGlCat + KResetGlCat + KCheckGlCatToBeRemoved +
            KRemoveNotInResource;
        }
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::ResetCategoryL
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::ResetCategoryL(
    TInt aIndex)
    {
    CPosLandmarkCategory* glCategory =
        iGlCatReader->GlobalCategoryLC(aIndex);

    PosLmCategoryHandler::ResetGlobalCategoryL(*iDb->DatabaseAccess(),
        *glCategory);

    User::LeaveIfError(iModifiedGlCats.Append(glCategory->GlobalCategory()));

    CleanupStack::PopAndDestroy(glCategory);
    }

// -----------------------------------------------------------------------------
// CPosLmLocalResetGlobalCatOp::RollbackAndRegisterIfNeeded
//
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPosLmLocalResetGlobalCatOp::RollbackAndRegisterIfNeeded()
    {
    RollbackIfNeeded();

    // If progress is not made or an error has occured
    // previously, an event should not be registred
    if (Progress() > KReadGlCat && iState != EError)
        {
        iDb->RegisterEvent(EPosLmEventCategoryUnknownChanges);
        }

    // Reset flag: rollback and event generation should not be done twice.
    iStatusFlag = KErrNone;
    }

//  End of File