menucontentsrv/srvsrc/mcsgetlistcreatorinterface.cpp
changeset 0 79c6a41cd166
child 23 ace62b58f4b2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/menucontentsrv/srvsrc/mcsgetlistcreatorinterface.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,573 @@
+/*
+* Copyright (c) 2008 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 <e32cmn.h>
+#include <liwcommon.h>
+#include <liwgenericparam.h>
+#include "mcsgetlistcreatorinterface.h"
+#include "menusrveng.h"
+
+_LIT( KMenuAttrSuiteName, "suite_name" );
+
+/**
+ * Class for getting attributes for installed suite items
+ * @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CMcsSuiteGetAttrStrategy ) :
+	public CMcsGetAttrStrategy
+	{
+public:
+
+	/**
+	 * Constructor.
+	 */
+	CMcsSuiteGetAttrStrategy( CMenuSrvEng& aEng );
+
+	/**
+	 * Destructor.
+	 */
+	virtual ~CMcsSuiteGetAttrStrategy();
+
+	/**
+	 * TODO: add comments
+	 */
+	void PrepareL(TInt aId);
+
+	/**
+	 * GetAttributeL.
+	 */
+	void GetAttributeL(const TDesC& aAttrName,
+		        TBool& aAttrExists, TDes& aAttrVal );
+
+private:
+	RBuf iSuiteName; ///< Name of a suite for actual strategy. Own.
+	};
+
+/**
+ * Class for getting attributes for non suite items / not installed suite items
+ * @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CMcsMainGetAttrStrategy ) :
+	public CMcsGetAttrStrategy
+	{
+public:
+
+	/**
+	 * Constructor.
+	 */
+	CMcsMainGetAttrStrategy ( CMenuSrvEng& aEng );
+
+	/**
+	 * TODO: add comments
+	 */
+	void PrepareL(TInt aId);
+
+	/**
+	 * GetAttributeL.
+	 */
+	void GetAttributeL(const TDesC& aAttrName,
+		        TBool& aAttrExists, TDes& aAttrVal );
+
+private:
+	TInt iId; ///< a id of an item for actual strategy.
+	};
+
+
+// ---------------------------------------------------------
+// CMcsGetAttrStrategy::CMcsGetAttrStrategy
+// ---------------------------------------------------------
+//
+CMcsGetAttrStrategy::CMcsGetAttrStrategy( CMenuSrvEng& aEng ) :
+	iEng(aEng)
+	{
+	}
+
+
+// ---------------------------------------------------------
+// CMcsGetAttrStrategy::~CMcsGetAttrStrategy
+// ---------------------------------------------------------
+//
+CMcsGetAttrStrategy::~CMcsGetAttrStrategy()
+	{
+	}
+
+// ---------------------------------------------------------
+// CMcsSuiteGetAttrStrategy::CMcsGetSuiteAttributeStrategy
+// ---------------------------------------------------------
+//
+CMcsSuiteGetAttrStrategy::CMcsSuiteGetAttrStrategy( CMenuSrvEng& aEng ) :
+	CMcsGetAttrStrategy(aEng)
+	{
+	}
+
+// ---------------------------------------------------------
+// CMcsSuiteGetAttrStrategy::~CMcsSuiteGetAttrStrategy
+// ---------------------------------------------------------
+//
+CMcsSuiteGetAttrStrategy::~CMcsSuiteGetAttrStrategy()
+	{
+	iSuiteName.Close();
+	}
+
+// ---------------------------------------------------------
+// CMcsSuiteGetAttrStrategy::Prepare
+// ---------------------------------------------------------
+//
+void CMcsSuiteGetAttrStrategy::PrepareL(TInt aId)
+	{
+	TBool suiteNameExists;
+	iSuiteName.Close();
+	iSuiteName.CreateL( KMenuMaxAttrValueLen );
+	iEng.GetAttributeL(aId, KMenuAttrSuiteName, suiteNameExists, iSuiteName);
+	}
+
+// ---------------------------------------------------------
+// CMcsSuiteGetAttrStrategy::GetAttributeL
+// ---------------------------------------------------------
+//
+void CMcsSuiteGetAttrStrategy::GetAttributeL(const TDesC& aAttrName,
+        TBool& aAttrExists, TDes& aAttrVal )
+	{
+	iEng.GetSuiteAttribute(iSuiteName, aAttrName, aAttrExists, aAttrVal);
+	}
+
+// ---------------------------------------------------------
+// CMcsSuiteGetAttrStrategy::CMcsGetSuiteAttributeStrategy
+// ---------------------------------------------------------
+//
+CMcsMainGetAttrStrategy::CMcsMainGetAttrStrategy( CMenuSrvEng& aEng ) :
+	CMcsGetAttrStrategy(aEng)
+	{
+	}
+
+// ---------------------------------------------------------
+// CMcsMainGetAttrStrategy::Prepare
+// ---------------------------------------------------------
+//
+void CMcsMainGetAttrStrategy::PrepareL(TInt aId)
+	{
+	iId = aId;
+	}
+
+// ---------------------------------------------------------
+// CMcsGetSuiteAttributeStrategy::GetAttributeL
+// ---------------------------------------------------------
+//
+void CMcsMainGetAttrStrategy::GetAttributeL(const TDesC& aAttrName,
+        TBool& aAttrExists, TDes& aAttrVal )
+	{
+	iEng.GetAttributeL (iId, aAttrName, aAttrExists, aAttrVal);
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::~CMcsGetListCreatorInterface
+// ---------------------------------------------------------
+//
+CMcsGetListCreatorInterface::~CMcsGetListCreatorInterface()
+    {
+    delete iNormalGetter;
+    delete iSuiteGetter;
+    }
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::CMcsGetListCreatorInterface
+// ---------------------------------------------------------
+//
+CMcsGetListCreatorInterface::CMcsGetListCreatorInterface( CMenuSrvEng& aEng ):
+	iEng( aEng )
+    {
+    }
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::ConstructL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::ConstructL()
+    {
+    iActualGetter = NULL;
+    iSuiteGetter = new(ELeave) CMcsSuiteGetAttrStrategy(iEng);
+    iNormalGetter = new(ELeave) CMcsMainGetAttrStrategy(iEng);
+    }
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::BuildMapL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::BuildMapL(
+		const TMenuItem& aMenuItem, CDesC16Array* aRequiredAttributes,
+		CDesC16Array* aIgnoredAttributes, CLiwDefaultMap* aMap )
+	{
+	SetGetterStrategyL( aMenuItem.Id() );
+	AddFundamentalAttributesL( aMenuItem, aMap );
+
+	if( aRequiredAttributes->MdcaCount() &&
+			aIgnoredAttributes->MdcaCount() == KErrNone )
+	    {
+	    AddRequiredAttributesL( aMenuItem, aRequiredAttributes, aMap );
+	    }
+	else if( aIgnoredAttributes->MdcaCount() &&
+			aRequiredAttributes->MdcaCount() == KErrNone )
+	    {
+	    AddAttributesWithoutIgnoredL( aMenuItem, aIgnoredAttributes, aMap );
+	    }
+	else if( aRequiredAttributes->MdcaCount() )
+	    {
+	    AddRequiredAttributesWithoutIgnoredL( aMenuItem, aRequiredAttributes,
+	    		aIgnoredAttributes, aMap );
+	    }
+	else
+	    {
+	    AddAllAttributesL( aMenuItem, aMap );
+	    }
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AddFundamentalAttributesL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AddFundamentalAttributesL(
+		const TMenuItem& aMenuItem, CLiwDefaultMap* aMap )
+	{
+    aMap->InsertL( KMenuAttrId8, TLiwVariant( (TInt32)aMenuItem.Id() ) );
+
+    aMap->InsertL( KType, TLiwVariant( aMenuItem.Type() ) );
+    aMap->InsertL( KMenuParentId, TLiwVariant( (TInt32)aMenuItem.Parent() ) );
+
+    // Flags
+    TInt flag = aMenuItem.Flags();
+    TInt flagvalue = ( flag & TMenuItem::ELockDelete )? 1 : 0;
+
+    aMap->InsertL( KDeleteLocked, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::ELockName )? 1 : 0;
+    aMap->InsertL( KNameLocked, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::ELockIcon )? 1 : 0;
+    aMap->InsertL( KIconLocked, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::ELockMoveInto )? 1 : 0;
+    aMap->InsertL( KAddingLocked, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::ELockItem )? 1 : 0;
+    aMap->InsertL( KMoveLocked, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::EHidden )? 1 : 0;
+    aMap->InsertL( KHidden, TLiwVariant( (TBool)flagvalue) );
+
+    flagvalue = ( flag & TMenuItem::EMissing )? 1 : 0;
+    aMap->InsertL( KMissing, TLiwVariant( (TBool)flagvalue) );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AddRequiredAttributesL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AddRequiredAttributesL( const TMenuItem& aMenuItem,
+		CDesC16Array* aRequiredAttributes, CLiwDefaultMap* aMap )
+	{
+	TBool exists = EFalse;
+	TBuf<KMenuMaxAttrNameLen> running;
+	running.Copy( KRunning );
+	TBuf<KMenuMaxAttrNameLen> bitmap;
+	bitmap.Copy( KBitmapBuffer );
+	TBuf<KMenuMaxAttrNameLen> mask;
+	mask.Copy( KMaskBuffer );
+	TBool findBitmap( EFalse );
+	TBool findMask( EFalse );
+
+	RBuf attrvalue;
+	attrvalue.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( attrvalue );
+
+	for( TInt i= 0; i < aRequiredAttributes->MdcaCount(); i++ )
+	    {
+	    if( aRequiredAttributes->MdcaPoint(i).Compare( running ) == KErrNone )
+	        {
+	        if ( aMenuItem.Type() == KMenuTypeApp() ||
+	        		aMenuItem.Type() == KMenuTypeFolder() )
+	            {
+	            iActualGetter->GetAttributeL( KRunningStatus, exists, attrvalue );
+	            aMap->InsertL( KRunning, TLiwVariant( exists ) );
+	            }
+	        }
+	    else if( aRequiredAttributes->MdcaPoint(i).Compare( bitmap ) == KErrNone )
+	        {
+	        findBitmap = ETrue;
+	        }
+	    else if( aRequiredAttributes->MdcaPoint(i).Compare( mask ) == KErrNone  )
+	        {
+	        findMask = ETrue;
+	        }
+	    else
+	        {
+	        iActualGetter->GetAttributeL(
+	        		aRequiredAttributes->MdcaPoint(i), exists, attrvalue );
+	        if( exists )
+	            {
+	            TBuf8<KMenuMaxAttrNameLen> attrname;
+	            attrname.Copy( aRequiredAttributes->MdcaPoint(i) );
+	            aMap->InsertL( attrname, TLiwVariant( attrvalue ) );
+	            }
+	        }
+	    }
+	if( findBitmap && findMask )
+	    {
+	    CLiwDefaultMap* iconAttrMap = CLiwDefaultMap::NewLC();
+	    FillIconAttributesMapL( aMenuItem, iconAttrMap );
+		aMap->InsertL( KIconAttributes, TLiwVariant( iconAttrMap ) );
+    	CleanupStack::PopAndDestroy( iconAttrMap );
+	   	}
+	CleanupStack::PopAndDestroy( &attrvalue );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AddAttributesWithoutIgnoredL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AddAttributesWithoutIgnoredL(	const TMenuItem& aMenuItem,
+		CDesC16Array* aIgnoredAttributes, CLiwDefaultMap* aMap )
+	{
+    TBool exists = EFalse;
+    TInt pos( KErrNotFound );
+
+	RBuf attrvalue;
+	attrvalue.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( attrvalue );
+
+    if ( aMenuItem.Type() == KMenuTypeApp()
+    		|| aMenuItem.Type() == KMenuTypeFolder() )
+        {
+        TBuf<KMenuMaxAttrNameLen> running;
+        running.Copy( KRunning );
+        if( aIgnoredAttributes->Find( running, pos ) != KErrNone )
+            {
+            iActualGetter->GetAttributeL(KRunningStatus, exists, attrvalue );
+            aMap->InsertL( KRunning, TLiwVariant( exists ) );
+            }
+        }
+
+    RArray<TPtrC> attrNameList;
+    CleanupClosePushL(attrNameList);
+    iEng.GetAttributeListL( aMenuItem.Id(), attrNameList );
+
+    for( TInt i = 0; i< attrNameList.Count(); i++ )
+        {
+        if( aIgnoredAttributes->Find( attrNameList[i], pos ) != KErrNone )
+            {
+            iActualGetter->GetAttributeL(attrNameList[i], exists, attrvalue );
+            if( exists )
+                {
+                TBuf8<KMenuMaxAttrNameLen> attrname;
+                attrname.Copy( attrNameList[i] );
+                aMap->InsertL( attrname, TLiwVariant( attrvalue ) );
+                }
+            }
+        }
+    TBuf<KMenuMaxAttrNameLen> bitmap;
+    bitmap.Copy( KBitmapBuffer );
+    TBuf<KMenuMaxAttrNameLen> mask;
+    mask.Copy( KMaskBuffer );
+    if( aIgnoredAttributes->Find( bitmap, pos ) != KErrNone
+        && aIgnoredAttributes->Find( mask, pos ) != KErrNone )
+        {
+        CLiwDefaultMap* iconAttrMap = CLiwDefaultMap::NewLC();
+    	FillIconAttributesMapL( aMenuItem, iconAttrMap );
+    	aMap->InsertL( KIconAttributes, TLiwVariant( iconAttrMap ) );
+    	CleanupStack::PopAndDestroy( iconAttrMap );
+    	}
+
+    CleanupStack::PopAndDestroy(&attrNameList);
+
+	CleanupStack::PopAndDestroy( &attrvalue );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AddRequiredAttributesWithoutIgnoredL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AddRequiredAttributesWithoutIgnoredL(
+		const TMenuItem& aMenuItem, CDesC16Array* aRequiredAttributes,
+		CDesC16Array* aIgnoredAttributes, CLiwDefaultMap* aMap )
+	{
+    TInt pos( KErrNotFound );
+    TBool exists = EFalse;
+    TBuf<KMenuMaxAttrNameLen> running;
+    running.Copy( KRunning );
+    TBuf<KMenuMaxAttrNameLen> bitmap;
+    bitmap.Copy( KBitmapBuffer );
+    TBuf<KMenuMaxAttrNameLen> mask;
+    mask.Copy( KMaskBuffer );
+    TBool findBitmap( EFalse );
+    TBool findMask( EFalse );
+
+	RBuf attrvalue;
+	attrvalue.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( attrvalue );
+
+    for( TInt i= 0; i < aRequiredAttributes->MdcaCount(); i++ )
+        {
+        if( aRequiredAttributes->MdcaPoint(i).Compare( running ) == KErrNone
+            && aIgnoredAttributes->Find( running, pos ) != KErrNone )
+            {
+            if ( aMenuItem.Type() == KMenuTypeApp() || aMenuItem.Type() == KMenuTypeFolder() )
+                {
+                iActualGetter->GetAttributeL( KRunningStatus, exists, attrvalue );
+                aMap->InsertL( KRunning, TLiwVariant( exists ) );
+                }
+            }
+        else if( aRequiredAttributes->MdcaPoint(i).Compare( bitmap ) == KErrNone
+                && aIgnoredAttributes->Find( bitmap, pos ) != KErrNone )
+            {
+            findBitmap = ETrue;
+            }
+        else if( aRequiredAttributes->MdcaPoint(i).Compare( mask ) == KErrNone
+                && aIgnoredAttributes->Find( mask, pos ) != KErrNone )
+            {
+            findMask = ETrue;
+            }
+        else if( aIgnoredAttributes->Find( aRequiredAttributes->MdcaPoint(i), pos ) != KErrNone )
+            {
+            iActualGetter->GetAttributeL( aRequiredAttributes->MdcaPoint(i), exists, attrvalue );
+            if( exists )
+                {
+                TBuf8<KMenuMaxAttrNameLen> attrname;
+                attrname.Copy( aRequiredAttributes->MdcaPoint(i) );
+                aMap->InsertL( attrname, TLiwVariant( attrvalue ) );
+                }
+            }
+        }
+    if( findBitmap && findMask )
+        {
+        CLiwDefaultMap* iconAttrMap = CLiwDefaultMap::NewLC();
+       	FillIconAttributesMapL( aMenuItem, iconAttrMap );
+       	aMap->InsertL( KIconAttributes, TLiwVariant( iconAttrMap ) );
+       	CleanupStack::PopAndDestroy( iconAttrMap );
+        }
+	CleanupStack::PopAndDestroy( &attrvalue );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AddAllAttributesL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AddAllAttributesL(
+		const TMenuItem& aMenuItem, CLiwDefaultMap* aMap )
+	{
+	TBool exists = EFalse;
+    RBuf attrvalue;
+	attrvalue.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( attrvalue );
+
+	if ( aMenuItem.Type() == KMenuTypeApp() ||
+			aMenuItem.Type() == KMenuTypeFolder() )
+	    {
+        iActualGetter->GetAttributeL( KRunningStatus, exists, attrvalue );
+        aMap->InsertL( KRunning, TLiwVariant( exists ) );
+	    }
+	RArray<TPtrC> attrNameList;
+	CleanupClosePushL(attrNameList);
+    iEng.GetAttributeListL( aMenuItem.Id(), attrNameList );
+
+	for(TInt i = 0;i< attrNameList.Count();i++)
+	    {
+	    TBuf8<KMenuMaxAttrNameLen> attrname;
+	    attrname.Copy( attrNameList[i] );
+        iActualGetter->GetAttributeL( attrNameList[i], exists, attrvalue );
+	    if(exists)
+	        {
+	        attrname.Copy(attrNameList[i]);
+	        aMap->InsertL( attrname, TLiwVariant( attrvalue ) );
+	        }
+	    }
+    CLiwDefaultMap* iconAttrMap = CLiwDefaultMap::NewLC();
+   	FillIconAttributesMapL( aMenuItem, iconAttrMap );
+   	aMap->InsertL( KIconAttributes, TLiwVariant( iconAttrMap ) );
+   	CleanupStack::PopAndDestroy( iconAttrMap );
+	CleanupStack::PopAndDestroy(&attrNameList);
+	CleanupStack::PopAndDestroy( &attrvalue );
+
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::FillIconAttributesMapL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::FillIconAttributesMapL(
+		const TMenuItem& aMenuItem, CLiwDefaultMap* aMap )
+	{
+
+    if ( aMenuItem.Type() == KMenuTypeApp())
+    	{
+    	AppendAttrL( KMenuAttrUid, aMap );
+    	AppendAttrL( KMenuAttrNative, aMap );
+    	}
+    else if ( aMenuItem.Type() == KMenuTypeFolder() )
+    	{
+    	AppendAttrL( KChildrenCount, aMap );
+    	}
+	AppendAttrL( KMenuAttrIconSkinMajorId, aMap );
+	AppendAttrL( KMenuAttrIconSkinMinorId, aMap );
+	AppendAttrL( KMenuAttrIconFile, aMap );
+	AppendAttrL( KMenuAttrIconId, aMap );
+	AppendAttrL( KMenuAttrMaskId, aMap );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::AppendAttrL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::AppendAttrL(
+        const TDesC& aAttrName, CLiwDefaultMap* aMap )
+	{
+	TBool exists;
+	TBuf8<KMenuMaxAttrNameLen> attrName;
+	RBuf attrvalue;
+    attrvalue.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( attrvalue );
+	iActualGetter->GetAttributeL(aAttrName, exists, attrvalue );
+	if ( exists )
+		{
+		attrName.Copy( aAttrName );
+		aMap->InsertL(attrName, TLiwVariant( attrvalue ) );
+		}
+	CleanupStack::PopAndDestroy( &attrvalue );
+	}
+
+// ---------------------------------------------------------
+// CMcsGetListCreatorInterface::SetGetterStrategyL
+// ---------------------------------------------------------
+//
+void CMcsGetListCreatorInterface::SetGetterStrategyL(TInt aId)
+	{
+	TBool suiteNameExists;
+	RBuf name;
+	name.CreateL( KMenuMaxAttrValueLen );
+	CleanupClosePushL( name );
+
+	iEng.GetAttributeL(aId, KMenuAttrSuiteName, suiteNameExists, name);
+	if (suiteNameExists && iEng.InstalledSuiteExist(name))
+		{
+		iActualGetter = iSuiteGetter;
+		}
+	else
+		{
+		iActualGetter = iNormalGetter;
+		}
+	iActualGetter->PrepareL(aId);
+	CleanupStack::PopAndDestroy(&name);
+	}
+//  End of File