--- /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);
+ }
+