photosgallery/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmds.cpp
branchRCL_3
changeset 60 5b3385a43d68
child 64 34937ec34dac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/photosgallery/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmds.cpp	Wed Sep 01 12:33:26 2010 +0100
@@ -0,0 +1,642 @@
+/*
+* Copyright (c) 2008-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:    Data Source Task MDS class
+*
+*/
+
+
+
+
+/**
+ * @internal reviewed 11/07/2007 by M Byrne
+ * @internal reviewed 24/07/2007 by K Hoikka, SCO 403-8472 removal of all view
+ */
+
+#include "glxdatasourcetaskmds.h"
+
+#include <glxcollectionplugincamera.hrh>
+#include <glxcollectionpluginalbums.hrh>
+#include <glxcollectionpluginall.hrh>
+#include <glxcollectionplugintags.hrh>
+#include <glxerrors.h>
+#include <glxfilterfactory.h>
+#include <glxgetrequest.h>
+#include <glxidlistrequest.h>
+#include <glxlog.h>
+#include <glxmediacollectioninternaldefs.h>
+#include <glxmediageneraldefs.h>
+#include <glxrequest.h>
+#include <glxthumbnailattributeinfo.h>
+#include <glxthumbnailrequest.h>
+#include <glxtndatabase.h>
+#include <glxtnfileinfo.h>
+#include <glxtnthumbnailcreator.h>
+#include <glxtracer.h>
+#include <lbsposition.h>
+#include <mdeconstants.h>
+#include <mdelogiccondition.h>
+#include <mdeobject.h>
+#include <mdeobjectdef.h>
+#include <mdeobjectquery.h>
+#include <mdepropertydef.h>
+#include <mderelationdef.h>
+#include <mdesession.h>
+#include <mdetextproperty.h>
+#include <mpxmedia.h>
+#include <mpxmediaarray.h> 
+#include <mpxmediacollectiondetaildefs.h>
+#include <mpxmediacontainerdefs.h>
+#include <mpxmediadrmdefs.h>
+#include <mpxmediageneraldefs.h>
+
+#include "glxdatasourcemds.h"
+#include "glxdatasourcemds.hrh"
+#include "glxdatasourcemdsutility.h"
+
+// CONSTANTS
+_LIT(KPropertyDefNameCreationDate, "CreationDate");
+_LIT(KPropertyDefNameLastModifiedDate, "LastModifiedDate");
+_LIT(KPropertyDefNameTitle, "Title");
+_LIT(KPropertyDefNameFrameCount, "FrameCount");
+_LIT(KPropertyDefNameOrigin, "Origin");
+
+// ----------------------------------------------------------------------------
+//  Constructor
+// ----------------------------------------------------------------------------
+//  
+CGlxDataSourceTaskMde:: CGlxDataSourceTaskMde(CGlxRequest* aRequest, 
+        MGlxDataSourceRequestObserver& aObserver, CGlxDataSource* aDataSource)
+    : CGlxDataSourceTask(aRequest, aObserver, aDataSource)
+    {
+    TRACER("CGlxDataSourceTaskMde::CGlxDataSourceTaskMde()");
+    // No implementation required
+    }
+
+// ----------------------------------------------------------------------------
+//  Destructor
+// ----------------------------------------------------------------------------
+//  
+CGlxDataSourceTaskMde::~CGlxDataSourceTaskMde()
+    {
+    TRACER("CGlxDataSourceTaskMde::~CGlxDataSourceTaskMde()");
+    DestroyQueries();
+    }
+
+// ----------------------------------------------------------------------------
+//  Second stage constructor
+// ----------------------------------------------------------------------------
+//  	
+void CGlxDataSourceTaskMde::ConstructL()
+    {
+    TRACER("CGlxDataSourceTaskMde::ConstructL()");
+    CreateResponseL();
+#ifdef USE_S60_TNM
+    DataSource()->CancelFetchThumbnail();
+#else    
+    DataSource()->ThumbnailCreator().CancelRequest( TGlxMediaId(0) );
+#endif
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::CancelRequest
+// ----------------------------------------------------------------------------
+//  
+void CGlxDataSourceTaskMde::CancelRequest()
+    {
+    TRACER("CGlxDataSourceTaskMde::CancelRequest()");
+    iCancelled = ETrue;
+    DestroyQueries();    
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::HandleQueryNewResults
+// ----------------------------------------------------------------------------
+//      
+void CGlxDataSourceTaskMde::HandleQueryNewResults( CMdEQuery& /*aQuery*/,
+                                                     TInt /*aFirstNewItemIndex*/,
+                                                     TInt /*aNewItemCount*/ )
+    {
+    TRACER("CGlxDataSourceTaskMde::HandleQueryNewResults()");
+    // Not used.
+    }
+
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::HandleQueryNewResults
+// ----------------------------------------------------------------------------
+//    
+void CGlxDataSourceTaskMde::HandleQueryNewResults( CMdEQuery& /*aQuery*/,
+                                TInt /*aNewObjectItemCount*/,
+                                TInt /*aNewRelationItemCount*/,
+                                TInt /*aNewEventItemCount*/)
+    {
+    TRACER("CGlxDataSourceTaskMde::HandleQueryNewResults()");
+    // Not used.
+    }
+
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTaskMde::HandleQueryCompleted
+// ----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMde::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError)
+    {
+    TRACER("CGlxDataSourceTaskMde::HandleQueryCompleted()");
+    __ASSERT_ALWAYS(&aQuery == iQueries[0], Panic(EGlxPanicQueryLogicError));
+
+    TInt err = aError;
+    if (err == KErrNone)
+        {
+        TRAP(err, HandleQueryCompletedL(aQuery));
+        }
+
+    if (err != KErrNone && !iCancelled)
+        {
+        HandleRequestComplete(err);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::DataSource
+// ----------------------------------------------------------------------------
+//   
+CGlxDataSourceMde* CGlxDataSourceTaskMde::DataSource()
+    {
+    TRACER("CGlxDataSourceTaskMde::DataSource()");
+    return static_cast<CGlxDataSourceMde*>(iDataSource);
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::SetQueryConditionsL
+// ----------------------------------------------------------------------------
+//    
+void CGlxDataSourceTaskMde::SetQueryConditionsL(CMdEQuery& aQuery,
+        const TGlxFilterProperties& aFilterProperties, const TGlxMediaId aContainerId,
+            CMdEObjectDef& aObjectDef)
+    {
+    TRACER("CGlxDataSourceTaskMde::SetQueryConditionsL()");
+    
+    CMdELogicCondition& rootCondition = aQuery.Conditions();
+    CMdEObjectDef* objectDef = &aObjectDef;
+
+    SetQueryFilterConditionsL(rootCondition, *objectDef, aFilterProperties);
+
+    if (aQuery.ResultMode() != EQueryResultModeCount)
+        {
+        SetSortOrderL(aQuery, aObjectDef, aFilterProperties);
+        }
+    
+    if( KGlxCollectionRootId != aContainerId.Value() )
+        {
+        CMdELogicCondition* containerCondition = NULL;
+        CMdERelationCondition* relationCondition = NULL;
+        objectDef = &DataSource()->ObjectDef();
+        if( DataSource()->ContainerIsLeft(aObjectDef) )
+            {
+            relationCondition = &rootCondition.AddRelationConditionL(
+                    DataSource()->ContainsDef(), ERelationConditionSideRight);
+            containerCondition = &relationCondition->LeftL();
+            }
+        else
+            {
+            relationCondition = &rootCondition.AddRelationConditionL(
+                    DataSource()->ContainsDef(), ERelationConditionSideLeft);
+            containerCondition = &relationCondition->RightL();
+            }
+        containerCondition->AddObjectConditionL(aContainerId.Value());
+        }
+
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::SetQueryFilterConditionsL
+// ----------------------------------------------------------------------------
+//  
+void CGlxDataSourceTaskMde::SetQueryFilterConditionsL(CMdELogicCondition& 
+                                   aLogicCondition, CMdEObjectDef& aObjectDef,
+                                 const TGlxFilterProperties& aFilterProperties)
+    {
+    TRACER("CGlxDataSourceTaskMde::SetQueryFilterConditionsL()");
+    
+    if( aFilterProperties.iUri )
+        {
+        aLogicCondition.AddObjectConditionL(EObjectConditionCompareUri, 
+                                                     *aFilterProperties.iUri);
+        }
+
+    if( 0 == aObjectDef.Compare(DataSource()->ObjectDef()) ) 
+        {
+        // Filter on content type
+        if ( EGlxFilterVideoAndImages == aFilterProperties.iItemType )
+            {
+            CMdELogicCondition& logicCondition = 
+                aLogicCondition.AddLogicConditionL(ELogicConditionOperatorOr);
+            logicCondition.AddObjectConditionL( DataSource()->ImageDef() ); 
+            logicCondition.AddObjectConditionL( DataSource()->VideoDef() );
+            }
+        }
+    
+    if( ( aFilterProperties.iMinCount > 0 ) && ( 
+            CGlxDataSource::EContainerTypeNotAContainer != DataSource()->ContainerType(
+                    &aObjectDef) ) )
+        {        
+		TMdEUintRange range(aFilterProperties.iMinCount,
+		        aFilterProperties.iMinCount,EMdERangeTypeGreaterOrEqual);
+		aLogicCondition.AddObjectConditionL(range);
+        }
+
+    if( 0 != aFilterProperties.iContainsItem.Value() )
+        {
+        
+        if( DataSource()->ContainerIsLeft(aObjectDef) )
+            {
+            CMdERelationCondition& relationCondition = 
+                    aLogicCondition.AddRelationConditionL(
+                            DataSource()->ContainsDef(), ERelationConditionSideLeft);
+            relationCondition.RightL().AddObjectConditionL(
+                    aFilterProperties.iContainsItem.Value());
+            }
+        else
+            {
+            CMdERelationCondition& relationCondition = aLogicCondition.AddRelationConditionL(
+                    DataSource()->ContainsDef(), ERelationConditionSideRight);
+            relationCondition.LeftL().AddObjectConditionL(aFilterProperties.iContainsItem.Value());
+            }
+        }
+        
+    if( EGlxFilterOriginNotUsed != aFilterProperties.iOrigin )
+        {
+        CMdEPropertyDef& originProperty = aObjectDef.GetPropertyDefL(KPropertyDefNameOrigin);
+        if( EGlxFilterOriginDownload == aFilterProperties.iOrigin )
+            {
+            // The download collection shows all but captured items
+            aLogicCondition.AddPropertyConditionL(originProperty, TMdEUintNotEqual(
+                    MdeConstants::Object::ECamera));
+            }
+		else if(EGlxFilterOriginCamera == aFilterProperties.iOrigin )            
+			{
+			// The camera collection Shows the captured Items
+			aLogicCondition.AddPropertyConditionL(originProperty, TMdEUintEqual(
+			        MdeConstants::Object::ECamera));            
+			}
+		else if(EGlxFilterOriginAll == aFilterProperties.iOrigin )            
+			{
+			// Filter for all Images and Videos
+            CMdELogicCondition& logicCondition = 
+                aLogicCondition.AddLogicConditionL(ELogicConditionOperatorOr);
+            logicCondition.AddObjectConditionL( DataSource()->ImageDef() ); 
+            logicCondition.AddObjectConditionL( DataSource()->VideoDef() );          
+			}        
+        }
+        
+    if( aFilterProperties.iExcludeAnimation )
+        {
+        // Exclude any image with a frame count > 1
+        const TInt excludeAllImagesAboveOrEqualToThisFrameCount = 2;
+        CMdEPropertyDef& frameCountProperty = DataSource()->ImageDef().GetPropertyDefL(
+                KPropertyDefNameFrameCount);
+        aLogicCondition.AddPropertyConditionL(frameCountProperty, TMdEIntLess(
+                excludeAllImagesAboveOrEqualToThisFrameCount));
+        }
+        
+    if( aFilterProperties.iNoDRM )
+        {
+        __ASSERT_DEBUG((EGlxFilterImage == aFilterProperties.iItemType), Panic(
+                EGlxPanicIllegalArgument));
+        }
+        
+    if( aFilterProperties.iPath )          // If this is set. Then we need to filter on the Ids it supplies
+        {
+        TArray<TInt> selection = aFilterProperties.iPath->Selection();
+        TInt selectionCount = selection.Count();
+        RArray<TItemId> itemList;
+        CleanupClosePushL(itemList);
+        GLX_DEBUG2("Reading Ids from Path, count = %d", selectionCount);
+        if( selectionCount )
+            {
+            for( TInt i = 0; i < selectionCount; i++ )
+                {
+                const TMPXItemId& itemId = aFilterProperties.iPath->IdOfIndex(selection[i]);
+                itemList.AppendL(itemId);
+                }
+            aLogicCondition.AddObjectConditionL(itemList);
+            }
+        CleanupStack::Pop(&itemList);
+        }
+        
+    if( !aFilterProperties.iIncludeCameraAlbum )
+        {
+        CMdEObjectCondition& objectCondition = aLogicCondition.AddObjectConditionL(
+        		DataSource()->CameraAlbumId().Value());
+        objectCondition.SetNegate(ETrue);
+        }
+    
+    if( TTime(0) != aFilterProperties.iStartDate )
+        {
+        CMdEPropertyDef& creationDateDef = aObjectDef.GetPropertyDefL(
+                KPropertyDefNameCreationDate);
+        if (creationDateDef.PropertyType() != EPropertyTime)
+            {
+            User::Leave(KErrCorrupt);
+            }
+
+        aLogicCondition.AddPropertyConditionL(creationDateDef, TMdETimeBetween(
+                aFilterProperties.iStartDate, aFilterProperties.iEndDate));
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::SetSortOrderL
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::SetSortOrderL(CMdEQuery& aQuery, CMdEObjectDef& aObjectDef, 
+                                         const TGlxFilterProperties& aFilterProperties)
+    {
+    TRACER("CGlxDataSourceTaskMde::SetSortOrderL()");
+    switch(aFilterProperties.iSortOrder)
+        {
+        case EGlxFilterSortOrderAlphabetical:
+            {
+            CMdEPropertyDef& titleProperty = aObjectDef.GetPropertyDefL(KPropertyDefNameTitle);
+            TMdEOrderRule orderRule(titleProperty, aFilterProperties.iSortDirection ==
+            EGlxFilterSortDirectionAscending);
+            orderRule.SetType(EOrderRuleTypeProperty);
+            orderRule.SetCaseSensitive(EFalse);
+            aQuery.AppendOrderRuleL(orderRule);
+            break;
+            }
+         case EGlxFilterSortOrderItemCount:
+            {            
+            //Order rule is needed for tags popularity            
+            TMdEOrderRule orderRule(EOrderRuleTypeUsageCount, aFilterProperties.iSortDirection ==
+            EGlxFilterSortDirectionAscending);
+            aQuery.AppendOrderRuleL(orderRule);            
+            break;
+            }
+        case EGlxFilterSortOrderCaptureDate:
+            {
+            CMdEPropertyDef& creationDateProperty = aObjectDef.GetPropertyDefL(
+                    KPropertyDefNameCreationDate);
+            TMdEOrderRule orderRule(creationDateProperty, aFilterProperties.iSortDirection ==
+            EGlxFilterSortDirectionAscending);
+            orderRule.SetType(EOrderRuleTypeProperty);
+            aQuery.AppendOrderRuleL(orderRule);
+            TMdEOrderRule orderRule2(EOrderRuleTypeItemID, aFilterProperties.iSortDirection ==
+            EGlxFilterSortDirectionAscending);
+            aQuery.AppendOrderRuleL(orderRule2);
+            break;
+            }
+         case EGlxFilterSortOrderModifiedDate:
+            {
+            CMdEPropertyDef& modifiedDateProperty = aObjectDef.GetPropertyDefL(
+                    KPropertyDefNameLastModifiedDate);
+            TMdEOrderRule orderRule(modifiedDateProperty, aFilterProperties.iSortDirection == 
+            EGlxFilterSortDirectionAscending);
+            orderRule.SetType(EOrderRuleTypeProperty);
+            aQuery.AppendOrderRuleL(orderRule);
+            TMdEOrderRule orderRule2(EOrderRuleTypeItemID, aFilterProperties.iSortDirection == 
+            EGlxFilterSortDirectionAscending);
+            aQuery.AppendOrderRuleL(orderRule2);
+            break;
+            }
+        case EGlxFilterSortOrderNotUsed:
+            {
+            break;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::MaxQueryResultsCount
+// ----------------------------------------------------------------------------
+// 
+TInt CGlxDataSourceTaskMde::MaxQueryResultsCount(const TGlxFilterProperties& 
+        aFilterProperties) const
+    {
+    TRACER("CGlxDataSourceTaskMde::MaxQueryResultsCount()");
+    TInt ret = KMdEQueryDefaultMaxCount;
+    if (aFilterProperties.iLastCaptureDate || aFilterProperties.iMaxCount == 1)
+        {
+        ret = 1;
+        }
+    GLX_DEBUG2("CGlxDataSourceTaskMde::MaxQueryResultsCount ret=%d", ret);   
+    return ret;
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::RemoveQuery
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::RemoveQuery()
+    {
+    TRACER("CGlxDataSourceTaskMde::RemoveQuery()");
+    CMdEQuery* query = iQueries[0];
+    iQueryTypes.Remove(0);
+    iQueries.Remove(0);
+    query->RemoveObserver(*this);
+    delete query;
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::DoQueryL
+// ----------------------------------------------------------------------------
+// 	
+void CGlxDataSourceTaskMde::DoQueryL(CMdEObjectDef& aObjectDef, 
+        TBool aIsContent, TGlxQueryType aQueryType, TQueryResultMode aResultMode, 
+                                                const TGlxMediaId& aContainerId)
+    {
+    TRACER("CGlxDataSourceTaskMde::DoQueryL()");
+    
+    CMdEObjectDef* queryBaseObject = &aObjectDef;
+    if( aIsContent )
+        {
+        switch(iFilterProperties.iItemType)
+            {
+            case EGlxFilterImage: 
+                {
+                queryBaseObject = &DataSource()->ImageDef();
+                break;
+                }
+            case EGlxFilterVideo:
+                {
+                queryBaseObject = &DataSource()->VideoDef();
+                break;
+                }
+            default:
+                {
+                queryBaseObject = &DataSource()->ObjectDef();
+                break;
+                }
+            }
+        }
+
+    CMdEQuery* query = DataSource()->Session().NewObjectQueryL(*DataSource()->NamespaceDef(),
+            *queryBaseObject, this);
+    CleanupStack::PushL(query);
+    
+    query->SetResultMode(aResultMode);
+    SetQueryConditionsL(*query, iFilterProperties, aContainerId, aObjectDef);   
+    
+    CleanupStack::Pop(query);
+    
+    AppendQueryL(query, aQueryType);
+
+    query->FindL(MaxQueryResultsCount(iFilterProperties));    
+    }
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTask::QueueImageVideoObjectQueriesL
+// ----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMde::QueueImageVideoObjectQueriesL(const RArray<TGlxMediaId>& aObjectIds,
+                                          const TGlxFilterProperties& aFilterProperties)
+    {
+    TRACER("CGlxDataSourceTaskMde::QueueImageVideoObjectQueriesL()");
+    if (aFilterProperties.iItemType == EGlxFilterImage)
+        {
+        // Only perform the image query
+        QueueObjectQueryL(DataSource()->ImageDef(), aObjectIds, EImageVideoQuery);
+        }
+    else if (aFilterProperties.iItemType == EGlxFilterVideo)
+        {
+        // Only perform the video query
+        QueueObjectQueryL(DataSource()->VideoDef(), aObjectIds, EImageVideoQuery);
+        }
+    else
+        {
+        QueueObjectQueryL(DataSource()->ImageDef(), aObjectIds, EImageVideoQuery);
+       QueueObjectQueryL(DataSource()->VideoDef(), aObjectIds, EImageVideoQuery);
+        // Perform both the image and video queries
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTask::QueueTagObjectQueryL
+// ----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMde::QueueTagObjectQueryL(const RArray<TGlxMediaId>& aObjectIds)
+    {
+    TRACER("CGlxDataSourceTaskMde::QueueTagObjectQueryL()");
+    QueueObjectQueryL(DataSource()->TagDef(), aObjectIds, EImageVideoQuery);
+    }
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTask::QueueAlbumObjectQueryL
+// ----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMde::QueueAlbumObjectQueryL(const RArray<TGlxMediaId>& aObjectIds)
+    {
+    TRACER("CGlxDataSourceTaskMde::QueueAlbumObjectQueryL()");
+    QueueObjectQueryL(DataSource()->AlbumDef(), aObjectIds, EImageVideoQuery);
+    }
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTask::QueueObjectQueryL
+// ----------------------------------------------------------------------------
+//
+void CGlxDataSourceTaskMde::QueueObjectQueryL(CMdEObjectDef& aObjectDef, 
+        const RArray<TGlxMediaId>& aObjectIds, const TGlxQueryType& aQueryType)
+    {
+    TRACER("CGlxDataSourceTaskMde::QueueObjectQueryL()");
+    CMdEQuery* query = DataSource()->Session().NewObjectQueryL(*DataSource()->NamespaceDef(), 
+            aObjectDef,  this);
+    CleanupStack::PushL(query);
+ 
+    CMdELogicCondition& lc = query->Conditions();
+    NGlxDataSourceMdsUtility::AddObjectConditionL(lc,aObjectIds);
+    
+    query->SetResultMode(EQueryResultModeItem);
+    
+    CleanupStack::Pop(query);
+    AppendQueryL(query, aQueryType);
+    
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::AppendQueryL
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::AppendQueryL(CMdEQuery* aQuery, const TGlxQueryType& aQueryType)
+    {
+    TRACER("CGlxDataSourceTaskMde::AppendQueryL()");
+    CleanupStack::PushL(aQuery);
+    
+    TInt err = iQueryTypes.Append(aQueryType);
+    
+    if (KErrNone == err)
+        {
+        iQueries.AppendL(aQuery);
+        CleanupStack::Pop(aQuery);
+        }
+    else
+        {
+        User::Leave(err);
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CGlxDataSourceTaskMde::ExecuteQueryL
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::ExecuteQueryL()
+    {
+    TRACER("CGlxDataSourceTaskMde::ExecuteQueryL()");
+    __ASSERT_DEBUG(iQueries.Count(), Panic(EGlxPanicQueryLogicError));
+    iQueries[0]->FindL();
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::HandleQueryCompletedL
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::HandleQueryCompletedL(CMdEQuery& aQuery)
+    {
+    TRACER("CGlxDataSourceTaskMde::HandleQueryCompletedL()");
+    DoHandleQueryCompletedL(aQuery);
+    
+    // Both the function calls should be executed if any
+    // request is not cancelled before completion.
+    // All the pending Queries are already destroyed in CancelRequest.
+    // Hence we do not have to call RemoveQuery here. That will lead to
+    // User 130 crash. 
+    // DoNextQuery tries to get iQueries.Count(). Since iQueries is destroyed
+    // in CancelRequest 
+    if (iCancelled)
+    	{ 
+    	GLX_LOG_INFO("***Query already Removed. Hence Return***");
+    	return;  	
+    	}  
+    RemoveQuery();  
+    DoNextQueryL();
+    }
+
+// ----------------------------------------------------------------------------
+//  CGlxDataSourceTaskMde::DestroyQueries
+// ----------------------------------------------------------------------------
+// 
+void CGlxDataSourceTaskMde::DestroyQueries()
+    {
+    TRACER("CGlxDataSourceTaskMde::DestroyQueries()");
+    for (TInt i = 0; i < iQueries.Count(); i++)
+        {
+        // Ensure that there are not any running queries
+        iQueries[i]->RemoveObserver(*this);
+        iQueries[i]->Cancel();
+        }
+    iQueries.ResetAndDestroy();
+    iQueryTypes.Close();
+    }
+
+
+