engine/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmdscommand.cpp
changeset 36 6481344a6d67
parent 23 74c9f037fd5d
child 71 27f2d7aec52a
--- a/engine/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmdscommand.cpp	Thu May 27 12:51:42 2010 +0300
+++ b/engine/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmdscommand.cpp	Fri Jun 11 13:38:23 2010 +0300
@@ -90,18 +90,28 @@
 _LIT(KColonBackslash, ":\\");
 _LIT(KFileNameFormatString, "(%+02u)");
 
+// Items to be deleted from File server at a time before calling scheduler wait
+const TInt KDeletedItemCount = 10;
+const TInt KDeleteOperationInterval = 1000;
+
 // ----------------------------------------------------------------------------
 // Destructor
 // ----------------------------------------------------------------------------
 //
 CGlxDataSourceTaskMdeCommand::~CGlxDataSourceTaskMdeCommand()
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::~CGlxDataSourceTaskMdeCommand()")
+    TRACER("CGlxDataSourceTaskMdeCommand::~CGlxDataSourceTaskMdeCommand()");
 	iLeftIds.Close();
     iRightIds.Close();
     delete iTitle;
     delete iObjectToRename;
     delete iStringCache;
+    if(iTimer && iTimer->IsActive())
+		{
+		iTimer->Cancel();
+		}
+	delete iTimer;
+    delete iSchedulerWait;    
     }
 
 
@@ -114,7 +124,7 @@
        CGlxDataSource* aDataSource)
     : CGlxDataSourceTaskMde(aRequest, aObserver, aDataSource) 
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::CGlxDataSourceTaskMdeCommand()")
+    TRACER("CGlxDataSourceTaskMdeCommand::CGlxDataSourceTaskMdeCommand()");
 	// No implementation required
 	}
 
@@ -124,13 +134,16 @@
 //
 void CGlxDataSourceTaskMdeCommand::ConstructL()
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::ConstructL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::ConstructL()");
 	iResponse = CMPXCommand::NewL(static_cast<CGlxCommandRequest*>(iRequest)->Command());
 #ifdef USE_S60_TNM
     DataSource()->CancelFetchThumbnail();
 #else    
     DataSource()->ThumbnailCreator().CancelRequest( TGlxMediaId(0) );
-#endif
+#endif    
+    
+    iTimer = CPeriodic::NewL(CActive::EPriorityStandard);
+    iSchedulerWait = new (ELeave) CActiveSchedulerWait();
 	}
 
 /// @todo minor: Rowland Cook 12/06/2007 Add method decription.
@@ -140,7 +153,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::ExecuteRequestL()
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::ExecuteRequestL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::ExecuteRequestL()");
     __ASSERT_DEBUG(DataSource()->NamespaceDef(), Panic(EGlxPanicIllegalState));
     
 	const CMPXCommand& command = static_cast<CGlxCommandRequest*>(iRequest)->Command();
@@ -164,7 +177,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::AddContainerL(const TDesC& aContainerName)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::AddContainerL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::AddContainerL()");
 	iTitle = aContainerName.AllocL();
 	AppendContainerTitleCountQueryL(ECommandAddContainer, aContainerName);
     ExecuteQueryL();
@@ -174,19 +187,24 @@
 // Add items to container by id
 // ----------------------------------------------------------------------------
 //
-void CGlxDataSourceTaskMdeCommand::AddToContainerL(const RArray<TGlxMediaId>& aSourceIds, const RArray<TGlxMediaId>& aTargetContainers)
+void CGlxDataSourceTaskMdeCommand::AddToContainerL(const RArray<TGlxMediaId>& aSourceIds,
+        const RArray<TGlxMediaId>& aTargetContainers)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::AddToContainerL(const RArray<TGlxMediaId>& aSourceIds, const RArray<TGlxMediaId>& aTargetContainers)")	
-	__ASSERT_DEBUG(aSourceIds.Count() && aTargetContainers.Count(), Panic(EGlxPanicEmptyArray));
+    TRACER("CGlxDataSourceTaskMdeCommand::AddToContainerL(const RArray<TGlxMediaId>& aSourceIds,const RArray<TGlxMediaId>& aTargetContainers)");	
+	__ASSERT_DEBUG(aSourceIds.Count() && aTargetContainers.Count(), 
+	        Panic(EGlxPanicEmptyArray));
 	
     iLeftIds.Reset();
     iRightIds.Reset();
 
-	CMdEQuery* query = DataSource()->Session().NewRelationQueryL(*DataSource()->NamespaceDef(), this); 
+	CMdEQuery* query = DataSource()->Session().NewRelationQueryL(
+	        *DataSource()->NamespaceDef(), this); 
 	AppendQueryL(query, ECommandAddToContainer);
     
     CMdELogicCondition& rootCondition = query->Conditions();
-    CMdERelationCondition& containerRelationCondition = rootCondition.AddRelationConditionL(DataSource()->ContainsDef(), ERelationConditionSideLeft);
+    CMdERelationCondition& containerRelationCondition = 
+    rootCondition.AddRelationConditionL(DataSource()->ContainsDef(),
+            ERelationConditionSideLeft);
     CMdELogicCondition& leftLogicCondition = containerRelationCondition.LeftL();
     CMdELogicCondition& rightLogicCondition = containerRelationCondition.RightL();
     leftLogicCondition.SetOperator(ELogicConditionOperatorOr);
@@ -236,7 +254,7 @@
 void CGlxDataSourceTaskMdeCommand::AddToContainerL(const TDesC& aSourceUri, 
 		                        const RArray< TGlxMediaId >& aTargetContainers)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::AddToContainerL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::AddToContainerL()");
     CMdEObject* sourceObject = DataSource()->Session().GetObjectL(aSourceUri);
     if (!sourceObject)
         {
@@ -254,10 +272,10 @@
 // Copy files to another drive.
 // ----------------------------------------------------------------------------
 //
-/// @todo minor: Rowland Cook 12/06/2007 Has this method been tested? If so remove comments
-void CGlxDataSourceTaskMdeCommand::CopyL(const RArray<TGlxMediaId>& aSourceIds, const TDesC& aDrive)
+void CGlxDataSourceTaskMdeCommand::CopyL(const RArray<TGlxMediaId>& aSourceIds, 
+        const TDesC& aDrive)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::CopyL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::CopyL()");
     FileOperationL(aSourceIds.Array(), aDrive, ECopy);
     }
 
@@ -265,10 +283,10 @@
 // Move files to another drive.
 // ----------------------------------------------------------------------------
 //
-/// @todo minor: Rowland Cook 12/06/2007 Has this method been tested? If so remove comments
-void CGlxDataSourceTaskMdeCommand::MoveL(const RArray<TGlxMediaId>& aSourceIds, const TDesC& aDrive)
+void CGlxDataSourceTaskMdeCommand::MoveL(const RArray<TGlxMediaId>& aSourceIds, 
+        const TDesC& aDrive)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::MoveL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::MoveL()");
     FileOperationL(aSourceIds.Array(), aDrive, EMove);
     }
 
@@ -276,9 +294,10 @@
 // Remove items from a container.
 // ----------------------------------------------------------------------------
 //
-void CGlxDataSourceTaskMdeCommand::RemoveFromContainerL(const RArray<TGlxMediaId>& aItemIds, const TGlxMediaId& aContainerId)
+void CGlxDataSourceTaskMdeCommand::RemoveFromContainerL(
+        const RArray<TGlxMediaId>& aItemIds, const TGlxMediaId& aContainerId)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::RemoveFromContainerL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::RemoveFromContainerL()");
     // Answer to question in @bug above: No
     
 	CMdEObject* object = NULL;
@@ -289,12 +308,15 @@
     	User::Leave(KErrNotFound);
     	}
 	
-	CMdEQuery* query = DataSource()->Session().NewRelationQueryL(*DataSource()->NamespaceDef(), this); 
+	CMdEQuery* query = DataSource()->Session().NewRelationQueryL(
+	        *DataSource()->NamespaceDef(), this); 
 	AppendQueryL(query, ECommandRemoveFromContainer); // query is now owned by the query array.
     
     CMdELogicCondition& rootCondition = query->Conditions();
 
-    CMdERelationCondition& containerRelationCondition = rootCondition.AddRelationConditionL(DataSource()->ContainsDef(), ERelationConditionSideLeft);
+    CMdERelationCondition& containerRelationCondition = 
+    rootCondition.AddRelationConditionL(
+            DataSource()->ContainsDef(), ERelationConditionSideLeft);
     CMdELogicCondition* containerLogicCondition = NULL;
     CMdELogicCondition* itemLogicCondition = NULL;
     // Containers are on the left for albums, right for tags
@@ -326,7 +348,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::DeleteL(const RArray<TGlxMediaId>& aItemIds)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::DeleteL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DeleteL()");
     CMdEObjectDef* containerObjectDef = NULL;
     TInt err = ContainerObjectDef(containerObjectDef);
     if (err == KErrNone)
@@ -348,10 +370,10 @@
 //
 // ----------------------------------------------------------------------------
 //
-/// @todo minor: Rowland Cook 12/06/2007 Has this method been tested? If so remove comments
-void CGlxDataSourceTaskMdeCommand::RenameL(const TGlxMediaId& aSourceItemId, const TDesC& aTitle)
+void CGlxDataSourceTaskMdeCommand::RenameL(const TGlxMediaId& aSourceItemId, 
+        const TDesC& aTitle)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::RenameL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::RenameL()");
     delete iTitle;
     iTitle = NULL;
 	iTitle = aTitle.AllocL();
@@ -370,10 +392,12 @@
 // Set description.
 // ----------------------------------------------------------------------------
 //
-void CGlxDataSourceTaskMdeCommand::SetDescriptionL(const RArray<TGlxMediaId>& aItemIds, const TDesC& aDescription)
+void CGlxDataSourceTaskMdeCommand::SetDescriptionL(const RArray<TGlxMediaId>& aItemIds, 
+        const TDesC& aDescription)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::SetDescriptionL()")
-    CMdEPropertyDef& descriptionPropertyDef = DataSource()->MediaDef().GetPropertyDefL(KPropertyDefNameDescription);
+    TRACER("CGlxDataSourceTaskMdeCommand::SetDescriptionL()");
+    CMdEPropertyDef& descriptionPropertyDef = DataSource()->MediaDef().GetPropertyDefL(
+            KPropertyDefNameDescription);
     if (descriptionPropertyDef.PropertyType() != EPropertyText)
     	{
     	User::Leave(KErrCorrupt);
@@ -430,9 +454,10 @@
 // Set capture location.
 // ----------------------------------------------------------------------------
 //
-void CGlxDataSourceTaskMdeCommand::SetCaptureLocationL(const RArray<TGlxMediaId>& aItemIds, const TCoordinate& aCoordinate)
+void CGlxDataSourceTaskMdeCommand::SetCaptureLocationL(const RArray<TGlxMediaId>& aItemIds, 
+        const TCoordinate& aCoordinate)
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::SetCaptureLocationL()")    
+    TRACER("CGlxDataSourceTaskMdeCommand::SetCaptureLocationL()") ;   
     if (!Math::IsNaN(aCoordinate.Latitude()) || !Math::IsNaN(aCoordinate.Longitude()))
     	{
     	User::Leave(KErrArgument);
@@ -443,7 +468,8 @@
     
     CMdELogicCondition& rootCondition = query->Conditions();
 
-    CMdERelationCondition& containerRelationCondition = rootCondition.AddRelationConditionL(ERelationConditionSideLeft);
+    CMdERelationCondition& containerRelationCondition = rootCondition.AddRelationConditionL(
+            ERelationConditionSideLeft);
     CMdELogicCondition& locationLogicCondition = containerRelationCondition.RightL();
     CMdELogicCondition& itemLogicCondition = containerRelationCondition.LeftL();
     locationLogicCondition.AddObjectConditionL(DataSource()->LocationDef());
@@ -463,7 +489,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::ThumbnailCleanupL()
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::ThumbnailCleanupL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::ThumbnailCleanupL()");
 #ifndef USE_S60_TNM
     CGlxDataSourceMde* ds = DataSource();
     ds->ThumbnailCreator().CleanupThumbnailsL(&ds->ThumbnailDatabase());
@@ -477,7 +503,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::DoHandleQueryCompletedL(CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleQueryCompletedL()");
     TGlxQueryType queryType = iQueryTypes[0];
 	
     switch (queryType)
@@ -502,7 +528,8 @@
 			
 			if (queryCount)
 				{
-				User::LeaveIfError(DataSource()->Session().RemoveRelationsL(relationsToRemove, successfullyRemovedReleations));
+				User::LeaveIfError(DataSource()->Session().RemoveRelationsL(
+				        relationsToRemove, successfullyRemovedReleations));
 				}
 			
 			CleanupStack::PopAndDestroy(&successfullyRemovedReleations);
@@ -547,7 +574,7 @@
 //
 void CGlxDataSourceTaskMdeCommand::DoNextQueryL()
     {
-    TRACER("CGlxDataSourceTaskMdeCommand::DoNextQueryL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoNextQueryL()");
     if (iQueries.Count())
         {
         ExecuteQueryL();
@@ -562,9 +589,10 @@
 // CGlxDataSourceTaskMdeCommand::FileOperationL
 // ----------------------------------------------------------------------------
 //
-void CGlxDataSourceTaskMdeCommand::FileOperationL(const TArray<TGlxMediaId>& aSourceIds, const TDesC& aDrive, TFileOperation aFileOperation)
+void CGlxDataSourceTaskMdeCommand::FileOperationL(const TArray<TGlxMediaId>& aSourceIds, 
+        const TDesC& aDrive, TFileOperation aFileOperation)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::FileOperationL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::FileOperationL()");
 	ContentAccess::CManager *manager = ContentAccess::CManager::NewL();
 	CleanupStack::PushL(manager);
 	// The following line causes a code scanner warning advising use of EikonEnv RFs instance.
@@ -593,7 +621,8 @@
     		// the drive that it is located on. (For the C:, the root is C:\data, 
     		// for the D: the root is D:\)
     		{
-    		fileNameWithoutRoot.Set(sourceFileName.Right(sourceFileName.Length() - sourceRootPath.Length()));
+    		fileNameWithoutRoot.Set(sourceFileName.Right(sourceFileName.Length() - 
+    		        sourceRootPath.Length()));
     		}
     	else
     		{
@@ -606,7 +635,6 @@
     	// Append the file name
     	destinationFileName.Append(fileNameWithoutRoot);
     	
-/// @todo minor: Rowland Cook 12/06/2007 majic number.
     	if (destinationFileName.CompareF(sourceFileName) != 0)
     		{
     		// If source and destination are not identical, perform the copy.	
@@ -615,7 +643,8 @@
 				// If the destination file name already exists find an available file name.
 				TParse destinationFileNameParse;
 				destinationFileNameParse.Set(destinationFileName,NULL,NULL); // this is a copy of the data
-				TInt destinationFileNameWithoutExtensionLength = destinationFileName.Length() - destinationFileNameParse.Ext().Length();
+				TInt destinationFileNameWithoutExtensionLength = destinationFileName.Length()
+				- destinationFileNameParse.Ext().Length();
 				TInt i = 1;
 				do
 					{
@@ -658,16 +687,7 @@
 TItemId CGlxDataSourceTaskMdeCommand::ContainerItemId(const TGlxMediaId& aMediaId)
     {
     TRACER("TMdEItemId CGlxDataSourceTaskMdeCommand::ContainerItemId()");    
-    TItemId containerId = aMediaId.Value();
-    if (aMediaId == KGlxCollectionRootId)
-        {
-        // Check the collection plugin uid
-        if (iCollectionUid == TUid::Uid(KGlxCollectionPluginCameraImplementationUid))
-            {
-          //  containerId = DataSource()->CameraAlbumId().Value();
-            }  
-        }
-    return containerId;
+    return aMediaId.Value();
     }
 
 // ----------------------------------------------------------------------------
@@ -676,16 +696,19 @@
 //
 void CGlxDataSourceTaskMdeCommand::RootPath(const TDesC& aDrive, TDes& aRootPath)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::RootPath()")
-	if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::PhoneMemoryRootPath().Left(KDriveLetterLength)) == 0)
+    TRACER("CGlxDataSourceTaskMdeCommand::RootPath()");
+	if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::PhoneMemoryRootPath().Left(
+	        KDriveLetterLength)) == 0)
 		{
 		aRootPath = PathInfo::PhoneMemoryRootPath();
 		}
-	else if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::MemoryCardRootPath().Left(KDriveLetterLength)) == 0)
+	else if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::MemoryCardRootPath().Left(
+	        KDriveLetterLength)) == 0)
 		{
 		aRootPath = PathInfo::MemoryCardRootPath();
 		}
-	else if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::RomRootPath().Left(KDriveLetterLength)) == 0)
+	else if (aDrive.Left(KDriveLetterLength).CompareF(PathInfo::RomRootPath().Left(
+	        KDriveLetterLength)) == 0)
 		{
 		aRootPath = PathInfo::RomRootPath();
 		}
@@ -702,19 +725,23 @@
 //
 void CGlxDataSourceTaskMdeCommand::SendProgressMessageL(TInt aCurrentStep, TInt aStepCount)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::SendProgressMessageL()")
-	MGlxDataSourceUpdateObserver& observer = static_cast<CGlxCommandRequest*>(iRequest)->DataSourceUpdateObserver();
+    TRACER("CGlxDataSourceTaskMdeCommand::SendProgressMessageL()");
+	MGlxDataSourceUpdateObserver& observer = 
+	static_cast<CGlxCommandRequest*>(iRequest)->DataSourceUpdateObserver();
 	
 	const CMPXCommand& command = static_cast<CGlxCommandRequest*>(iRequest)->Command();
-	__ASSERT_DEBUG(command.IsSupported(KMPXCommandGeneralSessionId), Panic(EGlxPanicCommandHasNoGeneralSessionId));
+	__ASSERT_DEBUG(command.IsSupported(KMPXCommandGeneralSessionId), Panic(
+	        EGlxPanicCommandHasNoGeneralSessionId));
 	
 	TAny* sessionId = command.ValueTObjectL<TAny*>(KMPXCommandGeneralSessionId);
 	
 	CMPXMessage* progressMessage = CMPXMessage::NewL();
 	CleanupStack::PushL(progressMessage);
 	progressMessage->SetTObjectValueL<TInt>(KMPXMessageGeneralId, KMPXMessageContentIdProgress);	
-	progressMessage->SetTObjectValueL<TInt>(TMPXAttribute(KMPXMessageContentIdProgress, EMPXMessageProgressCurrentCount), aCurrentStep);
-	progressMessage->SetTObjectValueL<TInt>(TMPXAttribute(KMPXMessageContentIdProgress, EMPXMessageProgressTotalCount), aStepCount);
+	progressMessage->SetTObjectValueL<TInt>(TMPXAttribute(KMPXMessageContentIdProgress, 
+	        EMPXMessageProgressCurrentCount), aCurrentStep);
+	progressMessage->SetTObjectValueL<TInt>(TMPXAttribute(KMPXMessageContentIdProgress,
+	        EMPXMessageProgressTotalCount), aStepCount);
 	progressMessage->SetTObjectValueL<TAny*>(KMPXCommandGeneralSessionId, sessionId);
 	
 	observer.HandleMessage(*progressMessage);
@@ -728,8 +755,7 @@
 //
 TInt CGlxDataSourceTaskMdeCommand::ContainerObjectDef(CMdEObjectDef*& aContainerObjectDef)
 {
-    TRACER("CGlxDataSourceTaskMdeCommand::ContainerObjectDef()")
-    //__ASSERT_DEBUG( (iCollectionUid == TUid::Uid(KGlxTagCollectionPluginImplementationUid) || iCollectionUid == TUid::Uid(KGlxCollectionPluginAlbumsImplementationUid)), Panic(EGlxPanicInvalidCollectionUid));
+    TRACER("CGlxDataSourceTaskMdeCommand::ContainerObjectDef()");
     TInt err = KErrNone;
 	if (iCollectionUid == TUid::Uid(KGlxTagCollectionPluginImplementationUid))
         {
@@ -757,7 +783,7 @@
 void CGlxDataSourceTaskMdeCommand::DoHandleAddToContainerQueryCompletedL
 															(CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleAddToContainerQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleAddToContainerQueryCompletedL()");
 	RPointerArray<CMdEInstanceItem> relations;
 	CleanupClosePushL(relations);
 	 
@@ -783,7 +809,8 @@
             
             if (!alreadyExists)
                 {
-                CMdERelation* relation = DataSource()->Session().NewRelationL(DataSource()->ContainsDef(), iLeftIds[leftPos], iRightIds[rightPos]);
+                CMdERelation* relation = DataSource()->Session().NewRelationL(
+                        DataSource()->ContainsDef(), iLeftIds[leftPos], iRightIds[rightPos]);
                 CleanupStack::PushL(relation);
                 relations.AppendL(relation);
                 CleanupStack::Pop(relation);
@@ -811,13 +838,14 @@
 															(CMdEQuery& aQuery)
 
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleAddContainerQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleAddContainerQueryCompletedL()");
    	
    	//Duplicate albums check for the default albums i.e. Favourites 
    	//as title property is left blank in MDS 2.5
    	if(iCollectionUid == TUid::Uid(KGlxCollectionPluginAlbumsImplementationUid))
    		{
-   		if(SearchStringL(R_ALBUM_FAVORITES_TITLE) == 0)
+   		if(SearchStringL(R_ALBUM_FAVORITES_TITLE) == 0 || 
+   				SearchStringL(R_ALBUM_CAMERA_TITLE) == 0 )
     		{
     		User::Leave(KErrAlreadyExists);	
     		}        	
@@ -837,7 +865,8 @@
     object = DataSource()->Session().NewObjectLC(*containerObjectDef, KNullDesC);
     
     // A title property def of type text is required.
-    CMdEPropertyDef& titlePropertyDef = containerObjectDef->GetPropertyDefL(KPropertyDefNameTitle);
+    CMdEPropertyDef& titlePropertyDef = containerObjectDef->GetPropertyDefL(
+            KPropertyDefNameTitle);
     if (titlePropertyDef.PropertyType() != EPropertyText)
         {
         User::Leave(KErrCorrupt);
@@ -846,7 +875,8 @@
     object->AddTextPropertyL(titlePropertyDef, *iTitle);
     
       //ItemType property def of type text is required.
-    CMdEPropertyDef& itemTypePropertyDef = containerObjectDef->GetPropertyDefL(KPropertyDefItemType);
+    CMdEPropertyDef& itemTypePropertyDef = containerObjectDef->GetPropertyDefL(
+            KPropertyDefItemType);
     if (itemTypePropertyDef.PropertyType() != EPropertyText)
     	{
     	User::Leave(KErrCorrupt);
@@ -865,7 +895,8 @@
    
     // A size property is required.
   
-    CMdEPropertyDef& sizePropertyDef = containerObjectDef->GetPropertyDefL(KPropertyDefNameSize);
+    CMdEPropertyDef& sizePropertyDef = containerObjectDef->GetPropertyDefL(
+            KPropertyDefNameSize);
     if (sizePropertyDef.PropertyType() != EPropertyUint32)
         {
         User::Leave(KErrCorrupt);
@@ -874,14 +905,16 @@
 
     
     // A creation date property is required.
-    CMdEPropertyDef& creationDateDef = containerObjectDef->GetPropertyDefL(KPropertyDefNameCreationDate);
+    CMdEPropertyDef& creationDateDef = containerObjectDef->GetPropertyDefL(
+            KPropertyDefNameCreationDate);
     if (creationDateDef.PropertyType() != EPropertyTime)
         {
         User::Leave(KErrCorrupt);
         }
 
     // A last modified date property is required.
-    CMdEPropertyDef& lmDateDef = containerObjectDef->GetPropertyDefL(KPropertyDefNameLastModifiedDate);
+    CMdEPropertyDef& lmDateDef = containerObjectDef->GetPropertyDefL(
+            KPropertyDefNameLastModifiedDate);
     if (lmDateDef.PropertyType() != EPropertyTime)
         {
         User::Leave(KErrCorrupt);
@@ -897,7 +930,8 @@
     
     iResponse->SetTObjectValueL<TMPXItemId>(KMPXMediaGeneralId, id);
     iResponse->SetTObjectValueL<TMPXItemId>(KMPXMessageMediaGeneralId, id);  
-    iResponse->SetTObjectValueL<TMPXChangeEventType>(KMPXMessageChangeEventType, EMPXItemInserted); 
+    iResponse->SetTObjectValueL<TMPXChangeEventType>(KMPXMessageChangeEventType,
+            EMPXItemInserted); 
 	}
 // ----------------------------------------------------------------------------
 // CGlxDataSourceTaskMdeCommand::DoHandleDeleteContainersQueryCompletedL
@@ -906,8 +940,9 @@
 void CGlxDataSourceTaskMdeCommand::DoHandleDeleteContainersQueryCompletedL
 															(CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleDeleteContainersQueryCompletedL()")
-    CMdEPropertyDef& albumTypeProperty = DataSource()->AlbumDef().GetPropertyDefL(KPropertyDefNameAlbumType);
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleDeleteContainersQueryCompletedL()");
+    CMdEPropertyDef& albumTypeProperty = DataSource()->AlbumDef().GetPropertyDefL(
+            KPropertyDefNameAlbumType);
     TInt queryCount = aQuery.Count();
     
     RArray<TItemId> objectsForRemoval;
@@ -928,8 +963,8 @@
         if (KErrNotFound != albumTypeIndex)
             {
             TInt albumTypeValue = static_cast<CMdEUint16Property*>(albumType)->Value();
-            
-            if ((albumTypeValue == MdeConstants::Album::EAlbumSystemFavourite) || (albumTypeValue == MdeConstants::Album::EAlbumSystemCamera))
+            if ((albumTypeValue == MdeConstants::Album::EAlbumSystemFavourite) || 
+            		(albumTypeValue == MdeConstants::Album::EAlbumSystemCamera))
                {
                User::Leave(KErrAccessDenied); 
                }
@@ -939,7 +974,8 @@
     
     if (queryCount)
     	{
-    	User::LeaveIfError(DataSource()->Session().RemoveObjectsL(objectsForRemoval, sucessfullyRemovedObjects));
+    	User::LeaveIfError(DataSource()->Session().RemoveObjectsL(objectsForRemoval, 
+    	        sucessfullyRemovedObjects));
     	}
     
     CleanupStack::PopAndDestroy(&sucessfullyRemovedObjects);
@@ -952,7 +988,8 @@
 void CGlxDataSourceTaskMdeCommand::DoHandleDeleteItemsQueryCompletedL
 															(CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleDeleteItemsQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleDeleteItemsQueryCompletedL()");
+    TInt deleteItemCounter = 0;
     ContentAccess::CManager *manager = ContentAccess::CManager::NewL();
     CleanupStack::PushL(manager);
     TInt queryCount = aQuery.Count();
@@ -971,7 +1008,10 @@
     User::LeaveIfError( fs.Connect() );
     
     TInt lastErr = KErrNone;
-    for(TInt queryPos = queryCount - 1; queryPos >= 0; queryPos--)
+    
+    // If Delete operation is cancelled before completion, 
+    // iCancelled because ETrue, break out of for loop.
+    for(TInt queryPos = queryCount - 1; (queryPos >= 0 && !iCancelled); queryPos--)
         {
         CMdEObject& object = static_cast<CMdEObject&>(aQuery.ResultItem(queryPos));
         //Removes the Read Only attributes of the file 
@@ -981,7 +1021,22 @@
         	{
         	lastErr = err;
         	}    
-        objectsForRemoval.AppendL(object.Id());
+        else
+            {    
+            // On successful deletion, delete the same from database
+            objectsForRemoval.AppendL(object.Id());
+            }
+			 
+        // After every 50 items are deleted, break from the for loop 
+        // and process other pending requests if any
+        if(deleteItemCounter == KDeletedItemCount)
+			{	
+			iTimer->Start( KDeleteOperationInterval, KDeleteOperationInterval,
+							TCallBack( &SchedulerStopCallback, (TAny *)this ) );	
+			iSchedulerWait->Start();  
+			deleteItemCounter = 0;
+			}     
+        deleteItemCounter++;     
         }
     // Calling Close() on file server session 
     CleanupStack::PopAndDestroy( &fs );
@@ -1007,7 +1062,7 @@
 void CGlxDataSourceTaskMdeCommand::DoHandleRenameConainerQueryCompletedL
                                                             (CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleRenameConainerQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleRenameConainerQueryCompletedL()");
 	__ASSERT_DEBUG(iObjectToRename, Panic(EGlxPanicLogicError));
 	if (aQuery.Count())
 		{
@@ -1035,8 +1090,8 @@
             // the type to be a non-localised user defined album
             static_cast<CMdEUint16Property*>(albumType)->SetValueL(MdeConstants::Album::EAlbumUser);
             }
-        
-		else if ((albumTypeValue == MdeConstants::Album::EAlbumSystemFavourite) || (albumTypeValue == MdeConstants::Album::EAlbumSystemCamera))
+		else if ((albumTypeValue == MdeConstants::Album::EAlbumSystemFavourite) || 
+				(albumTypeValue == MdeConstants::Album::EAlbumSystemCamera))
 		    {
             // Cannot rename system albums
 		    User::Leave(KErrAccessDenied); 
@@ -1107,7 +1162,7 @@
 void CGlxDataSourceTaskMdeCommand::DoHandleRenameQueryCompletedL
                                                            (CMdEQuery& aQuery)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleRenameQueryCompletedL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::DoHandleRenameQueryCompletedL()");
 	__ASSERT_DEBUG(aQuery.Count() == 1, Panic(EGlxPanicUnexpectedQueryResultCount ));
 	delete iObjectToRename;
 	iObjectToRename = static_cast<CMdEObject*>(aQuery.TakeOwnershipOfResult(0));
@@ -1127,20 +1182,23 @@
 void  CGlxDataSourceTaskMdeCommand::AppendContainerTitleCountQueryL
                         (const TGlxQueryType& aQueryType, const TDesC& aTitle)
 	{
-    TRACER("CGlxDataSourceTaskMdeCommand::AppendContainerTitleCountQueryL()")
+    TRACER("CGlxDataSourceTaskMdeCommand::AppendContainerTitleCountQueryL()");
 	// Test to see if a container alerady exists in the database with aContainerName
     CMdEObjectDef* containerObjectDef = NULL;
     TInt err = ContainerObjectDef(containerObjectDef);
     __ASSERT_ALWAYS(err == KErrNone, Panic(EGlxPanicInvalidCollectionUid));
     
-    CMdEQuery* query = DataSource()->Session().NewObjectQueryL(*DataSource()->NamespaceDef(), *containerObjectDef, this);
+    CMdEQuery* query = DataSource()->Session().NewObjectQueryL(*DataSource()->NamespaceDef(),
+            *containerObjectDef, this);
     CleanupStack::PushL(query);
     
-    CMdEPropertyDef& titlePropertyDef = DataSource()->ObjectDef().GetPropertyDefL(KPropertyDefNameTitle);
+    CMdEPropertyDef& titlePropertyDef = DataSource()->ObjectDef().GetPropertyDefL(
+            KPropertyDefNameTitle);
     
     query->SetResultMode(EQueryResultModeCount);
     
-    query->Conditions().AddPropertyConditionL(titlePropertyDef, ETextPropertyConditionCompareEquals, aTitle);
+    query->Conditions().AddPropertyConditionL(titlePropertyDef, 
+            ETextPropertyConditionCompareEquals, aTitle);
     
     CleanupStack::Pop(query);
     
@@ -1153,7 +1211,7 @@
 //	
 TInt CGlxDataSourceTaskMdeCommand::SearchStringL(TInt aResourceId)
 	{
-	
+	TRACER("CGlxDataSourceTaskMdeCommand::SearchStringL()");
 	_LIT(KResourceFile, "z:glxpluginalbums.rsc");	
    	
    	if (!iStringCache)
@@ -1170,3 +1228,39 @@
     return result;    
         	
 	}
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMdeCommand::SchedulerStopCallback
+// ----------------------------------------------------------------------------
+//
+TInt CGlxDataSourceTaskMdeCommand::SchedulerStopCallback(TAny* aPtr)
+    {
+    TRACER("CGlxDataSourceTaskMdeCommand::SchedulerStopCallback");
+    
+    CGlxDataSourceTaskMdeCommand* self = (CGlxDataSourceTaskMdeCommand*) aPtr;
+    if ( self )
+        {
+        self->SchedulerStopComplete();
+        }
+
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// SchedulerStopComplete
+// -----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMdeCommand::SchedulerStopComplete()
+    {
+    TRACER("CGlxDataSourceTaskMdeCommand::SchedulerStopComplete");  
+    
+    if(iTimer && iTimer->IsActive())
+    	{
+    	iTimer->Cancel();
+    	}
+    
+    if(iSchedulerWait)
+		{		
+		iSchedulerWait->AsyncStop();    
+		}  
+    }