landmarksui/engine/src/CLmkAddToCatOperation.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:27 +0100
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 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 "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:    LandmarksUi Content File -
*
*/








// INCLUDE FILES
#include "CLmkAddToCatOperation.h"
#include "CLmkAOOperation.h"
#include <EPos_CPosLmCategoryManager.h>
#include <EPos_CPosLmOperation.h>
#include <lmkerrors.h>

#if defined(_DEBUG)
// CONSTANTS
/// Unnamed namespace for local definitions
namespace {

_LIT( KPanicMsg, "CLmkAddToCatOperation" );

void Panic( TPanicCode aReason )
    {
    User::Panic( KPanicMsg, aReason );
    }
}  // namespace
#endif
// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::CLmkAddToCatOperation
// C++ constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CLmkAddToCatOperation::CLmkAddToCatOperation(
    CPosLmCategoryManager& aCategoryMgr )
    : iCategoryMgr( aCategoryMgr )
    {
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CLmkAddToCatOperation::ConstructL(
    const RArray<TPosLmItemId>& aLandmarkIdArray,
    const RArray<TPosLmItemId>& aCategoryIdArray )
    {
    TInt lmCount = aLandmarkIdArray.Count();
    for ( TInt i( 0 ); i < lmCount; ++i )
        {
        User::LeaveIfError( iLmIdArray.Append( aLandmarkIdArray[i] ) );
        }
    TInt catCount = aCategoryIdArray.Count();
    for ( TInt k( 0 ); k < catCount; ++k )
        {
        User::LeaveIfError( iCatIdArray.Append( aCategoryIdArray[k] ) );
        }
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CLmkAddToCatOperation* CLmkAddToCatOperation::NewL(
    CPosLmCategoryManager& aCategoryMgr,
    const RArray<TPosLmItemId>& aLandmarkIdArray,
    const RArray<TPosLmItemId>& aCategoryIdArray )
    {
    CLmkAddToCatOperation* self =
        new ( ELeave ) CLmkAddToCatOperation( aCategoryMgr );

    CleanupStack::PushL( self );
    self->ConstructL( aLandmarkIdArray, aCategoryIdArray );
    CleanupStack::Pop();

    return self;
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CLmkAddToCatOperation* CLmkAddToCatOperation::NewL(
    CPosLmCategoryManager& aCategoryMgr,
    TPosLmItemId aLandmarkId,
    const RArray<TPosLmItemId>& aCategoryIdArray )
    {
    CLmkAddToCatOperation* self =
        new ( ELeave ) CLmkAddToCatOperation( aCategoryMgr );

    CleanupStack::PushL( self );
    // For users of this class we provide two NewL interfaces but internally
    // we create an array also in case of just one landmark item.
    RArray<TPosLmItemId> tmpArray = RArray<TPosLmItemId>( 1 );
    CleanupClosePushL( tmpArray );
    User::LeaveIfError( tmpArray.Append( aLandmarkId ) );
    self->ConstructL( tmpArray, aCategoryIdArray );
    CleanupStack::PopAndDestroy(); // tmpArray
    CleanupStack::Pop();

    return self;
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::~CLmkAddToCatOperation
// -----------------------------------------------------------------------------
//
CLmkAddToCatOperation::~CLmkAddToCatOperation()
    {
    if (iStatus)
        {
        if (*iStatus == KRequestPending )
            {
            User::RequestComplete( iStatus, KErrCancel );
            }
        }
    iLmIdArray.Close();
    iCatIdArray.Close();
    delete iAddOperation;
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::NextStep
// -----------------------------------------------------------------------------
//
void CLmkAddToCatOperation::NextStep( TRequestStatus& aStatus,
                                      TReal32& aProgress )
    {
    aStatus = KRequestPending;
    iStatus = &aStatus;
    iProgress = &aProgress;

    TInt count = iCatIdArray.Count();
    // Index should be smaller than count if NextStep called properly:
    __ASSERT_DEBUG( iCurrentIndex < count, Panic( KLmkPanicIllegalMethodCall ) );

    TInt err( KErrNone );

    // Do one step:
    if ( iCurrentIndex < count )
        {
        TRAP( err, DoAddToCatStepL( iCatIdArray[iCurrentIndex++] ) );
        }

    if ( err != KErrNone )
        { // error occurred already when preparing for asynch. operation
        --iCurrentIndex;
        *iProgress = 1;
        User::RequestComplete( iStatus, err );
        }
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::ExecuteL
// -----------------------------------------------------------------------------
//
void CLmkAddToCatOperation::ExecuteL()
    {
    // We never use asynchronous methods in synchronous way and therefore
    // don't need to support this method
    User::Leave( KErrNotSupported );
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::HandleOperationL
// -----------------------------------------------------------------------------
//
void CLmkAddToCatOperation::HandleOperationL(
    TOperationTypes /*aType*/,
    TReal32 /*aProgress*/,
    TInt aStatus )
    {
    // Operation (adding one category to landmarks) finished:
    delete iAddOperation;
    iAddOperation = NULL;

    TInt result( KErrNone );
    TInt count = iCatIdArray.Count();

    // Check result:
    if ( aStatus != KErrNone || iCurrentIndex == count )
        {
        *iProgress = 1;
        result = aStatus;
        }
    else
        {
        result = KPosLmOperationNotComplete;
        // Neither divider nor dividend can be zero in this if-branch:
        __ASSERT_DEBUG( ( iCurrentIndex > 0 ) && ( count > 0 ),
                        Panic( KLmkPanicMathError ) );
        *iProgress = static_cast<TReal32>( iCurrentIndex ) / count;
        }
    User::RequestComplete( iStatus, result );
    }

// -----------------------------------------------------------------------------
// CLmkAddToCatOperation::DoAddToCatStepL
// -----------------------------------------------------------------------------
//
void CLmkAddToCatOperation::DoAddToCatStepL( TPosLmItemId aCategoryId )
    {
    CPosLmOperation* operation =
        iCategoryMgr.AddCategoryToLandmarksL( aCategoryId,
                                              iLmIdArray );

    __ASSERT_DEBUG( !iAddOperation, Panic( KLmkPanicAlreadyActive ) );

    iAddOperation =
        CLmkAOOperation::NewL( operation,
                               *this,
                               MLmkAOOperationObserver::EAddToCategory,
                               EFalse );
    iAddOperation->StartOperation();
    }

//  End of File