menucontentsrv/srvsrc/menusrvoperation.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 12 Mar 2010 15:43:54 +0200
branchRCL_3
changeset 11 bd874ee5e5e2
parent 0 79c6a41cd166
permissions -rw-r--r--
Revision: 201007 Kit: 201008

/*
* 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 FILES

#include <s32strm.h>
#include "menusrvoperation.h"
#include "menuitemattr.h"
#include "menuutil.h"
#include "menueng.h"
#include "menuengobject.h"

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

// ---------------------------------------------------------
// CMenuSrvOperation::CMenuSrvOperation()
// ---------------------------------------------------------
//
CMenuSrvOperation::CMenuSrvOperation( CMenuEng& aEng )
: iEng( aEng )
    {
    }

// ---------------------------------------------------------
// CMenuSrvOperation::StartL()
// ---------------------------------------------------------
//
void CMenuSrvOperation::StartL( const RMessage2& aMessage )
    {
    PanicIfPendingL( aMessage );
    iEng.QueueOperationL( *this );
    SetPending( aMessage ); // No leaving after this point!
    }

// ---------------------------------------------------------
// CMenuSrvOperation::Cancel()
// ---------------------------------------------------------
//
void CMenuSrvOperation::Cancel()
    {
    iEng.DequeueOperation( *this );
    Complete( KErrCancel );
    }

// ---------------------------------------------------------
// CMenuSrvOperation::CompletedMenuEngOperation()
// ---------------------------------------------------------
//
void CMenuSrvOperation::CompletedMenuEngOperation( TInt aErr )
    {
    iEng.DequeueOperation( *this );
    Complete( aErr );
    }

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

// ---------------------------------------------------------
// CMenuSrvRemoveOperation::CMenuSrvRemoveOperation
// ---------------------------------------------------------
//
CMenuSrvRemoveOperation::CMenuSrvRemoveOperation( CMenuEng& aEng, TInt aId )
: CMenuSrvOperation( aEng ), iId( aId )
    {
    }

// ---------------------------------------------------------
// CMenuSrvRemoveOperation::RunMenuEngOperationL
// ---------------------------------------------------------
//
void CMenuSrvRemoveOperation::RunMenuEngOperationL()
    {
    iEng.RemoveL( iId );
    }

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

// ---------------------------------------------------------
// CMenuSrvMoveToFolderOperation::~CMenuSrvMoveToFolderOperation
// ---------------------------------------------------------
//
CMenuSrvMoveToFolderOperation::~CMenuSrvMoveToFolderOperation()
    {
    iItems.Close();
    }

// ---------------------------------------------------------
// CMenuSrvMoveToFolderOperation::NewL()
// ---------------------------------------------------------
//
CMenuSrvMoveToFolderOperation* CMenuSrvMoveToFolderOperation::NewL(
        CMenuEng& aEng,
        RReadStream& aItems,
        TInt aFolder,
        TInt aMoveBefore )
    {
    CMenuSrvMoveToFolderOperation* op =
        new (ELeave) CMenuSrvMoveToFolderOperation
        ( aEng, aFolder, aMoveBefore );
    CleanupStack::PushL( op );
    op->ConstructL( aItems );
    CleanupStack::Pop( op );
    return op;
    }

// ---------------------------------------------------------
// CMenuSrvMoveToFolderOperation::CMenuSrvMoveToFolderOperation
// ---------------------------------------------------------
//
CMenuSrvMoveToFolderOperation::CMenuSrvMoveToFolderOperation
( CMenuEng& aEng, TInt aFolder, TInt aMoveBefore )
: CMenuSrvOperation( aEng ), iFolder( aFolder ), iMoveBefore( aMoveBefore )
    {
    }

// ---------------------------------------------------------
// CMenuSrvMoveToFolderOperation::ConstructL()
// ---------------------------------------------------------
//
void CMenuSrvMoveToFolderOperation::ConstructL( RReadStream& aItems )
    {
    MenuUtil::InternalizeL( iItems, aItems );
    }

// ---------------------------------------------------------
// CMenuSrvMoveToFolderOperation::RunMenuEngOperationL
// ---------------------------------------------------------
//
void CMenuSrvMoveToFolderOperation::RunMenuEngOperationL()
    {
    iEng.MoveToFolderL( iItems, iFolder, iMoveBefore );
    }

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

// ---------------------------------------------------------
// CMenuSrvReorderOperation::CMenuSrvReorderOperation
// ---------------------------------------------------------
//
CMenuSrvReorderOperation::CMenuSrvReorderOperation
( CMenuEng& aEng, TInt aId, TInt aMoveBefore )
: CMenuSrvOperation( aEng ), iId( aId ), iMoveBefore( aMoveBefore )
    {
    }

// ---------------------------------------------------------
// CMenuSrvReorderOperation::RunMenuEngOperationL
// ---------------------------------------------------------
//
void CMenuSrvReorderOperation::RunMenuEngOperationL()
    {
    iEng.ReorderL( iId, iMoveBefore );
    }

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

// ---------------------------------------------------------
// CMenuSrvAddOperation::~CMenuSrvAddOperation
// ---------------------------------------------------------
//
CMenuSrvAddOperation::~CMenuSrvAddOperation()
    {
    delete iObject;
    }

// ---------------------------------------------------------
// CMenuSrvAddOperation::NewL()
// ---------------------------------------------------------
//
CMenuSrvAddOperation* CMenuSrvAddOperation::NewL
( CMenuEng& aEng, const TDesC& aType, RReadStream& aChanges )
    {
    CMenuSrvAddOperation* op = new (ELeave) CMenuSrvAddOperation( aEng );
    CleanupStack::PushL( op );
    op->ConstructL( aType, aChanges );
    CleanupStack::Pop( op );
    return op;
    }

// ---------------------------------------------------------
// CMenuSrvAddOperation::CMenuSrvAddOperation
// ---------------------------------------------------------
//
CMenuSrvAddOperation::CMenuSrvAddOperation( CMenuEng& aEng )
: CMenuSrvOperation( aEng )
    {
    }

// ---------------------------------------------------------
// CMenuSrvAddOperation::ConstructL()
// ---------------------------------------------------------
//
void CMenuSrvAddOperation::ConstructL( const TDesC& aType, RReadStream& aChanges )
    {
    iObject = iEng.NewObjectL( aType );
    // Flags.
    const TUint32 flags = aChanges.ReadUint32L();
    // Attributes.
    RMenuItemAttrArray attrChanges;
    CleanupResetAndDestroyPushL( attrChanges );
    attrChanges.InternalizeL( aChanges );
    // Parent folder and insertion point.
    iParent = aChanges.ReadInt32L();
    iInsertBefore = aChanges.ReadInt32L();
    // Flag and attribute data is stored inside the object.
    iObject->SetFlags( flags, ETrue );
    for ( TInt i = 0; i < attrChanges.Count(); i++ )
        {
        const CMenuItemAttr* attr = attrChanges[i];
        if ( attr->Value() )
            {
            iObject->SetAttributeL( attr->Name(), *attr->Value(), EFalse );
            }
        else
            {
            ; // No use trying to remove attribute: this is a new object.
            }
        }
    CleanupStack::PopAndDestroy( &attrChanges ); // Ownership NOT passed.        
    }

// ---------------------------------------------------------
// CMenuSrvAddOperation::ObjectId
// ---------------------------------------------------------
//
TInt CMenuSrvAddOperation::ObjectId()
    {
    __ASSERT_DEBUG( iObject, User::Invariant() );
    return iObject->Id();
    }

// ---------------------------------------------------------
// CMenuSrvAddOperation::RunMenuEngOperationL
// ---------------------------------------------------------
//
void CMenuSrvAddOperation::RunMenuEngOperationL()
    {
    __ASSERT_DEBUG( iObject, User::Invariant() );
    iEng.AddL( *iObject, iParent, iInsertBefore );
    iObject = NULL; // Ownership passed to engine.
    }

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

// ---------------------------------------------------------
// CMenuSrvUpdateOperation::~CMenuSrvUpdateOperation
// ---------------------------------------------------------
//
CMenuSrvUpdateOperation::~CMenuSrvUpdateOperation()
    {
    iAttrChanges.ResetAndDestroy();
    }

// ---------------------------------------------------------
// CMenuSrvUpdateOperation::NewL()
// ---------------------------------------------------------
//
CMenuSrvUpdateOperation* CMenuSrvUpdateOperation::NewL
( CMenuEng& aEng, TInt aId, RReadStream& aChanges )
    {
    CMenuSrvUpdateOperation* op =
        new (ELeave) CMenuSrvUpdateOperation( aEng, aId );
    CleanupStack::PushL( op );
    op->ConstructL( aChanges );
    CleanupStack::Pop( op );
    return op;
    }

// ---------------------------------------------------------
// CMenuSrvUpdateOperation::CMenuSrvUpdateOperation
// ---------------------------------------------------------
//
CMenuSrvUpdateOperation::CMenuSrvUpdateOperation( CMenuEng& aEng, TInt aId )
: CMenuSrvOperation( aEng ), iId( aId )
    {
    }

// ---------------------------------------------------------
// CMenuSrvUpdateOperation::ConstructL()
// ---------------------------------------------------------
//
void CMenuSrvUpdateOperation::ConstructL( RReadStream& aChanges )
    {
    iFlags = aChanges.ReadUint32L();
    iChangedFlags = aChanges.ReadUint32L();
    iAttrChanges.InternalizeL( aChanges );
    }

// ---------------------------------------------------------
// CMenuSrvUpdateOperation::RunMenuEngOperationL
// ---------------------------------------------------------
//
void CMenuSrvUpdateOperation::RunMenuEngOperationL()
    {
    CMenuEngObject& object = iEng.ModifiableObjectL( iId );
    object.SetFlags( iFlags & iChangedFlags, ETrue );
    object.SetFlags( ~iFlags & iChangedFlags, EFalse );
    for ( TInt i = 0; i < iAttrChanges.Count(); i++ )
        {
        const CMenuItemAttr* attr = iAttrChanges[i];
        if ( attr->Value() )
            {
            object.SetAttributeL( attr->Name(), *attr->Value(), EFalse );
            }
        else
            {
            object.RemoveAttribute( attr->Name() );
            }
        }
    }

//  End of File