homescreensrv_plat/sapi_menucontent/mcsservice/src/mcsservice.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreensrv_plat/sapi_menucontent/mcsservice/src/mcsservice.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,429 @@
+/*
+* 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:  Interface to MCS service
+ *
+*/
+
+
+#include "mcsdef.h"
+
+#include "mcsservice.h"
+#include "mcsgetlistimpl.h"
+#include "mcsexecuteaction.h"
+#include "mcsrunningapps.h"
+#include "mcsrequestnotification.h"
+#include "mcscallback.h"
+#include "mcsconstants.h"
+#include "debug.h"
+#include "mcsupdateitem.h"
+#include "mcsdeleteitem.h"
+#include "mcsorganizeimpl.h"
+//_LIT( KRunningStatus, "RunningStatus" );
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CMCSService* CMCSService::NewL(const TDesC& aContent)
+	{
+	CMCSService* self = new (ELeave) CMCSService;
+	CleanupStack::PushL( self );
+	self->ConstructL(aContent);
+	CleanupStack::Pop( self );
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CMCSService::~CMCSService()
+	{
+	if( iReqNotifier )
+		{
+		TRAP_IGNORE(iReqNotifier->StopNotificationL());
+		delete iReqNotifier;
+		iReqNotifier = NULL;
+		}
+	iOperationManager.Close();	
+	iMCS.Close();
+	delete iIgnoredAttributes;
+	delete iRequiredAttributes;
+	}
+
+// ---------------------------------------------------------------------------
+// Constructor.
+// ---------------------------------------------------------------------------
+//
+CMCSService::CMCSService()
+	{
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+void CMCSService::ConstructL(const TDesC& aContent)
+	{
+	iMCS.OpenL(aContent);
+	iIsRegistered = EFalse;
+	
+	iIgnoredAttributes = new (ELeave) CDesC16ArrayFlat(1);
+	iRequiredAttributes = new (ELeave) CDesC16ArrayFlat(8);
+	}
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CMCSService::SetFlagInMenuitemL( CLiwMap& aInputMap, 
+		CMenuItem& aMenuitem, TMenuItem::TFlags aFlag)
+	{
+	TLiwVariant param;
+	TPtrC8 key ( KNullDesC8 );
+	switch ( aFlag )
+		{
+		case TMenuItem::ELockDelete:
+			key.Set( KDeleteLocked );
+			break;
+		case TMenuItem::ELockName:
+			key.Set( KNameLocked );
+			break;
+		case TMenuItem::ELockIcon:
+			key.Set( KIconLocked );
+			break;
+		case TMenuItem::ELockMoveInto:
+			key.Set( KMoveLocked  );
+			break;
+		case TMenuItem::ELockItem:
+			key.Set( KAddingLocked );
+			break;
+		case TMenuItem::EHidden:
+			key.Set( KHidden );
+			break;	    	    	    	    	    
+		case TMenuItem::EMissing:
+			key.Set( KMissing );
+			break;	    
+		}
+	if( aInputMap.FindL( key, param))
+		{
+		if (param.AsTBool())
+			{
+			aMenuitem.SetFlags(aFlag, ETrue);
+			}
+		else
+			{
+			aMenuitem.SetFlags(aFlag, EFalse);
+			}
+		aInputMap.Remove( key );
+		param.Reset();
+		}
+
+	}
+
+// ---------------------------------------------------------------------------
+// Update item and its attributes.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void   CMCSService::UpdateItemL(MMCSCallback* aCallBack, TDesC& aType, 
+		TInt aId, TInt aParentId, TInt aBeforeId, CLiwMap& aInputMap)
+	{
+	TBuf8<KMenuMaxAttrNameLen> attrname;
+	TBuf16<KMenuMaxAttrNameLen> attrname16;
+	TBuf16<KMenuMaxAttrValueLen> paramValStr;
+	TPtrC paramvalue;
+	TLiwVariant param;
+
+	if( !aCallBack )
+		{
+		User::Leave( KErrArgument );
+		}
+	CMenuItem* menuItem;
+
+	// If if is zero then create new menu item
+	if (!aId)
+		{
+		menuItem = CMenuItem::CreateL( iMCS, aType, aParentId, aBeforeId );
+		}
+	// Otherwise open existing menu item
+	else
+		{
+		menuItem = CMenuItem::OpenL(iMCS, aId);
+		}
+	CleanupStack::PushL( menuItem ); 
+
+	attrname.Copy(KMenuAttrRefId());  
+	if( aInputMap.FindL( attrname, param))
+		{
+		paramValStr.Num( param.AsTInt32());
+		aInputMap.Remove(attrname);
+		menuItem->SetAttributeL(KMenuAttrRefId(), paramValStr);
+		}
+	else
+		{
+		if( aType == KMenuTypeLink)
+			{
+			User::Leave( KErrArgument );
+			}
+		}
+	param.Reset();
+
+	// Flags parsing
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::ELockName);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::ELockIcon);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::ELockDelete);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::ELockMoveInto);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::ELockItem);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::EHidden);
+	SetFlagInMenuitemL( aInputMap, *menuItem, TMenuItem::EMissing);
+
+	for(TInt index = 0; index < aInputMap.Count(); index++)
+		{
+		aInputMap.AtL(index, attrname);
+		aInputMap.FindL( attrname, param);
+		paramvalue.Set(param.AsDes());
+		attrname16.Copy(attrname);
+		menuItem->SetAttributeL( attrname16,  paramvalue );
+		param.Reset();
+		}
+
+	CMCSUpdateItem* updateAO = CMCSUpdateItem::NewL( *menuItem, aCallBack,
+			iOperationManager );
+	CleanupStack::PushL( updateAO );
+	iOperationManager.AddL( updateAO );
+	CleanupStack::Pop(updateAO);
+	updateAO->UpdateItemL();
+
+	CleanupStack::Pop(menuItem);
+	}
+
+// ---------------------------------------------------------------------------
+// GetListL 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::GetListL( const CLiwGenericParamList& aInParamList, MMCSCallback* aCallBack )
+	{
+	if( !aCallBack )
+		{
+		User::Leave( KErrArgument );
+		}
+	CMCSGetListImpl* getListAO = CMCSGetListImpl::NewL( iMCS, aCallBack, 
+			iOperationManager );
+	CleanupStack::PushL(getListAO);
+	iOperationManager.AddL( getListAO );
+	CleanupStack::Pop(getListAO);
+	getListAO->GetListL( aInParamList );
+	}
+
+// ---------------------------------------------------------------------------
+// GetRunningAppsL 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C  void CMCSService::GetRunningAppsL( MMCSCallback* aCallback ) 
+	{
+	if( !aCallback )
+		{
+		User::Leave( KErrArgument );
+		}
+
+	CMCSRunningApps* getRunningAppsAO = CMCSRunningApps::NewL( iMCS, aCallback, 
+			iOperationManager );
+	CleanupStack::PushL(getRunningAppsAO);
+	iOperationManager.AddL( getRunningAppsAO );
+	CleanupStack::Pop(getRunningAppsAO);
+	getRunningAppsAO->GetRunningApplicationL();
+	}
+
+// ---------------------------------------------------------------------------
+// ExecuteActionL 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C  void CMCSService::ExecuteActionL( MMCSCallback* aCallback, 
+		TInt aItemId, TDesC8& aAction )
+	{
+	if( !aCallback )
+		{
+		User::Leave( KErrArgument );
+		}
+	CMCSExecuteAction* executeAO = CMCSExecuteAction::NewL( iMCS, aCallback, 
+			iOperationManager );
+	CleanupStack::PushL( executeAO );
+	iOperationManager.AddL( executeAO );
+	CleanupStack::Pop(executeAO);
+	executeAO->ExecuteActionL( aItemId, aAction);
+	}
+
+// ---------------------------------------------------------------------------
+// DeleteL 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::DeleteL( MMCSCallback* aCallBack, TInt aItemId )
+	{
+	if( !aCallBack )
+		{
+		User::Leave( KErrArgument );
+		}
+	CMCSDeleteItem* deleteAO = CMCSDeleteItem::NewL( iMCS, aCallBack,
+			iOperationManager );
+	CleanupStack::PushL(deleteAO);
+	iOperationManager.AddL( deleteAO );
+	CleanupStack::Pop(deleteAO);
+	deleteAO->DeleteItemL( aItemId );
+	}
+
+
+// ---------------------------------------------------------------------------
+// Set GetRunningAppsL output to output parameter
+// ---------------------------------------------------------------------------
+//                         
+EXPORT_C void CMCSService::SetRunningAppsOutputL( RArray<TUid>& aOutputArray, 
+		CLiwGenericParamList& aOutParamList )
+	{
+	//List of Maps
+	TBuf8<KMenuMaxAttrNameLen> attrname;
+	CLiwDefaultList *list = CLiwDefaultList::NewL();
+	CleanupStack::PushL( list );
+
+	TInt arrCount = aOutputArray.Count();
+
+	for( TInt index = 0; index < arrCount; ++index )
+		{  
+		CLiwDefaultMap* map = CLiwDefaultMap::NewLC(); 
+
+		TUid auid = aOutputArray[index];
+		attrname.Copy(KMenuAttrUid());
+	
+		map->InsertL( attrname, TLiwVariant( (TInt32) aOutputArray[index].iUid ));
+
+		list->AppendL( TLiwVariant( map ) );
+
+		CleanupStack::PopAndDestroy( map );        
+		}
+
+	aOutParamList.AppendL( TLiwGenericParam( KReturnValue, TLiwVariant( list ) ) );
+
+	CleanupStack::Pop( list );
+	list->DecRef();
+	}
+
+// ---------------------------------------------------------------------------
+// Organize
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::OrganizeL( MMCSCallback* aCallBack, 
+		TInt aMoveItemId, TInt aBeforeItemId )
+	{
+	if( !aCallBack )
+		{
+		User::Leave( KErrArgument );
+		}
+
+	CMCSOrganizeImpl* organizeAO = CMCSOrganizeImpl::NewL( iMCS, aCallBack,
+			iOperationManager );
+	CleanupStack::PushL( organizeAO );
+	iOperationManager.AddL( organizeAO );
+	CleanupStack::Pop( organizeAO );// we pop item from cleanupstack because
+	//ownership was transfered to operation manager                                                         
+	organizeAO->OrganizeL( aMoveItemId, aBeforeItemId );
+	}
+
+// ---------------------------------------------------------------------------
+// Organize
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::OrganizeL( MMCSCallback* aCallBack, 
+		const RArray<TInt>& aList, TInt aFolderId, TInt aBeforeItemId )
+	{
+	if( !aCallBack )
+		{
+		User::Leave( KErrArgument );
+		}
+
+
+	CMCSOrganizeImpl* organizeAO = CMCSOrganizeImpl::NewL( iMCS, aCallBack,
+			iOperationManager );
+	CleanupStack::PushL( organizeAO );
+	iOperationManager.AddL( organizeAO );
+	CleanupStack::Pop( organizeAO );// we pop item from cleanupstack because
+	//ownership was transfered to operation manager
+	organizeAO->OrganizeL( aList, aFolderId, aBeforeItemId );
+	}
+
+// ---------------------------------------------------------------------------
+// Set RequestNotification output to output parameter
+// ---------------------------------------------------------------------------
+//   
+EXPORT_C void CMCSService::SetReqNotificationOutputL( TInt aFolderId,
+		TInt aEvent, CLiwGenericParamList& aOutParamList )
+	{
+
+	TBuf8<KMenuMaxAttrNameLen> attrname;
+	CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+
+	attrname.Copy(KMenuAttrId());
+	map->InsertL( attrname, TLiwVariant( (TInt32)aFolderId));
+
+	if(aEvent & RMenuNotifier::EItemsAddedRemoved)
+		{
+		map->InsertL( KAddRemove, TLiwVariant( (TBool) ETrue) );
+
+		}
+	if( aEvent & RMenuNotifier::EItemsReordered)
+		{
+		map->InsertL( KReorder, TLiwVariant( (TBool) ETrue) );
+		}
+	if( aEvent & RMenuNotifier::EItemAttributeChanged)
+		{
+		map->InsertL( KAttributeChange, TLiwVariant( (TBool) ETrue) );
+		}
+
+	aOutParamList.AppendL( TLiwGenericParam( KReturnValue, TLiwVariant( map ) ) );
+	CleanupStack::PopAndDestroy( map );
+	}
+
+
+// ---------------------------------------------------------------------------
+// Stop Notification for changes in mcs
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::UnRegisterObserverL()
+	{
+	if ( iReqNotifier == NULL )
+		{
+		User::Leave( KErrNotFound );  
+		}
+	iReqNotifier->StopNotificationL();
+
+	delete iReqNotifier;
+	iReqNotifier = NULL;
+	iIsRegistered = EFalse;
+	}
+
+// ---------------------------------------------------------------------------
+// Start Notification for changes in mcs
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CMCSService::RegisterObserverL(TInt aFolderId,TInt aEvents,MMCSCallback* aCallBack )
+	{
+	if( !aCallBack )
+		User::Leave( KErrArgument );
+
+	if(!iIsRegistered)
+		{
+		iReqNotifier = CMCSReqNotification::NewL( iMCS );
+		iIsRegistered = ETrue;
+		}
+	iReqNotifier->StartNotificationL(aFolderId, aEvents, aCallBack);
+	}
+