landmarks/locationlandmarks/localaccess/src/EPos_CPosLmLocalModifyOp.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 11 May 2010 16:36:36 +0300
branchRCL_3
changeset 23 5944cae565c9
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201017 Kit: 201019

/*
* Copyright (c) 2002-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: A local representation of the operation class assigned for operations that
* modifies the database.
*
*
*/


#include    <epos_cposlmlocaldbaccess.h>
#include    <epos_cposlmresourcereader.h>

#include    "epos_cposlmlocaldatabase.h"
#include    "EPos_RPosLmLocalAccessSubsession.h"
#include    "EPos_LocalLandmarks.h"
#include    "EPos_CPosLmLocalModifyOp.h"

const TReal32 KPosLmLocalSubOpInitialProgress = 0.05f;
const TReal32 KPosLmLocalSubOpProgressChange = 0.9f;
const TReal32 KPosLmLocalSubOpAlmost100Percent = 0.99f;


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

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
CPosLmLocalModifyOp::CPosLmLocalModifyOp(
    CPosLmLocalDatabase& aDb) :
    CPosLmLocalOperation(aDb),
    iStatusFlag(KPosLmOperationNotComplete),
    iCompactState(ECompactSubOperationOff)
    {
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CPosLmLocalModifyOp::BaseConstructL()
    {
    CPosLmLocalOperation::BaseConstructL();

    AquireLockL(CPosLmLocalDatabase::EWriteLock);
    User::LeaveIfError(iDb->DatabaseAccess()->BeginTransaction());
    if ( iUsesServerData )
        {
        iDb->BeginServerTransactionL();
        }
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
CPosLmLocalModifyOp::~CPosLmLocalModifyOp()
    {
    delete iCompactSubOp;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
TInt CPosLmLocalModifyOp::NextStepL(
    TReal32& aProgress)
    {
    if (iCompactState == ECompactSubOperationOn)
        {
        // Compact state. Continue compacting sub operation.
        TReal32 progress;
        if (iCompactSubOp->NextL(progress))
            {
            delete iCompactSubOp;
            iCompactSubOp = NULL;
            iCompactState = ECompactSubOperationOff;
            }

        aProgress = iSavedProgress +
            CalculateSubOperationProgress(Step(), progress);
        }
    else
        {
        // Normal operation state
        DoNextStepPreL(aProgress);

        User::LeaveIfError(iDb->DatabaseAccess()->CommitTransaction());
        if ( iUsesServerData )
            {
            iDb->CommitServerTransactionL();
            }

        if (iDb->DatabaseAccess()->IsCompactNeededL())
            {
            RecalculateProgressDueToCompact(aProgress, Step());

            iCompactState = ECompactSubOperationOn;
            iSavedProgress = aProgress;
            iCompactSubOp = CPosLmCompactDatabase::NewL(*iDb->DatabaseAccess());
            }
        }

    if (iCompactState == ECompactSubOperationOff)
        {
        if (DoNextStepPostL(aProgress))
            {
            User::LeaveIfError(iDb->DatabaseAccess()->BeginTransaction());
            if ( iUsesServerData )
                {
                iDb->BeginServerTransactionL();
                }
            }
        else
            {
            ReleaseLock();
            }
        }

    return iStatusFlag;
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CPosLmLocalModifyOp::ReadInfoFromResourceFileL(
    TInt aResourceId)
    {
    CPosLmResourceReader* resources = CPosLmResourceReader::NewLC(
        KPosLocalSuboperationResourceFile);
    iNoOfSubOperations = resources->ReadInt32L(aResourceId);
    CleanupStack::PopAndDestroy(resources);

    CheckResourceValue(aResourceId, iNoOfSubOperations);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CPosLmLocalModifyOp::RollbackIfNeeded()
    {
    if ( iStatusFlag != KErrNone )
        {
        if (iDb->DatabaseAccess()->InTransaction())
            {
            iDb->DatabaseAccess()->RollbackTransaction();
            if ( iUsesServerData )
                {
                iDb->RollbackServerTransaction();
                }
            }
        ReleaseLock();
        }
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
TBool CPosLmLocalModifyOp::IsInCompactingState()
    {
    return (iCompactState == ECompactSubOperationOn);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
TReal32 CPosLmLocalModifyOp::CalculateSubOperationProgress(
    TReal32 aProgressStep,
    TReal32 aCompactProgress)
    {
    return aProgressStep * (KPosLmLocalSubOpInitialProgress +
        KPosLmLocalSubOpProgressChange * aCompactProgress);
    }

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//
void CPosLmLocalModifyOp::RecalculateProgressDueToCompact(
    TReal32& aProgress,
    TReal32 aProgressStep)
    {
    aProgress = aProgress - aProgressStep * KPosLmLocalSubOpAlmost100Percent;
    }