diff -r 8e5f6eea9c9f -r 5b3385a43d68 photosgallery/collectionframework/datasource/plugins/glxdatasourcemde2.5/src/glxdatasourcetaskmds.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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(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 selection = aFilterProperties.iPath->Selection(); + TInt selectionCount = selection.Count(); + RArray 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& 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& aObjectIds) + { + TRACER("CGlxDataSourceTaskMde::QueueTagObjectQueryL()"); + QueueObjectQueryL(DataSource()->TagDef(), aObjectIds, EImageVideoQuery); + } + +// ---------------------------------------------------------------------------- +// CGlxDataSourceTask::QueueAlbumObjectQueryL +// ---------------------------------------------------------------------------- +// +void CGlxDataSourceTaskMde::QueueAlbumObjectQueryL(const RArray& aObjectIds) + { + TRACER("CGlxDataSourceTaskMde::QueueAlbumObjectQueryL()"); + QueueObjectQueryL(DataSource()->AlbumDef(), aObjectIds, EImageVideoQuery); + } + +// ---------------------------------------------------------------------------- +// CGlxDataSourceTask::QueueObjectQueryL +// ---------------------------------------------------------------------------- +// +void CGlxDataSourceTaskMde::QueueObjectQueryL(CMdEObjectDef& aObjectDef, + const RArray& 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(); + } + + +