menucontentsrv/srvsrc/menusrvoperation.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvsrc/menusrvoperation.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,325 @@
+/*
+* 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