diff -r 000000000000 -r c53acadfccc6 clfwrapper/ClientSrc/CCLFDbItemProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clfwrapper/ClientSrc/CCLFDbItemProvider.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,409 @@ +/* +* Copyright (c) 2002-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: +* +*/ + + +// INCLUDE FILES +#include "CCLFDbItemProvider.h" +#include "CCLFItemImpl.h" +#include "MCLFItemProviderObserver.h" +#include "CCLFDbItemContainer.h" +#include "CLFPanics.h" +#include "MGDebugPrint.h" +#include "CCLFQueryAdapter.h" +#include "CLFUtils.h" +#include +#include + +const TInt KCLFItemArrayGranularity( 25 ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::CCLFDbItemProvider +// ----------------------------------------------------------------------------- +// +CCLFDbItemProvider::CCLFDbItemProvider( CCLFDbItemContainer& aDbItemContainer, + CCLFQueryAdapter& aQueryAdapter, CMdESession* aMdESession ) + : CActive( EPriorityStandard ), + iProviderState( EItemsReady ), + iObserver( NULL ), + iItemArray( KCLFItemArrayGranularity ), + iDbItemContainer( aDbItemContainer ), + iQueryAdapter( aQueryAdapter ), + iObjectQuery( NULL ), + iObjDefStr( &KNullDesC ), + iMdESession( aMdESession ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::ConstructL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::NewL +// ----------------------------------------------------------------------------- +// +CCLFDbItemProvider* CCLFDbItemProvider::NewL( CCLFDbItemContainer& aDbItemContainer, + CCLFQueryAdapter& aQueryAdapter, CMdESession* aMdESession ) + { + CCLFDbItemProvider* self = new( ELeave ) CCLFDbItemProvider( aDbItemContainer, + aQueryAdapter, + aMdESession ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::~CCLFDbItemProvider +// Destructor +// ----------------------------------------------------------------------------- +// +CCLFDbItemProvider::~CCLFDbItemProvider() + { + Cancel(); + delete iObjectQuery; + iItemArray.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::DoCancel +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::DoCancel() + { + MG_DEBUG1( dr1, "[CLF]\t CCLFDbItemProvider::DoCancel" ); + + if ( iObjectQuery ) + { + iObjectQuery->Cancel(); + } + + iObjDefStr = &KNullDesC; + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::RunL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::RunL() + { + MG_DEBUG2( r1, "[CLF]\t CCLFDbItemProvider::RunL %d", iStatus.Int() ); + + TInt error( iStatus.Int() ); + if ( error == KErrNone ) + { + DoRunL(); + } + if ( EItemsReady == iProviderState ) + { + iObserver->OperationCompleteL( KErrNone ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::DoRunL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::DoRunL() + { + switch ( iProviderState ) + { + case EPrepareItemIds: + { + DoFetchMdSIdDataCachedL(); + break; + } + case EPrepareItems: + { + DoFetchMdSDataL(); + break; + } + default: + { + User::Leave( ECLFIncorrectCommand ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::RunError +// ----------------------------------------------------------------------------- +// +TInt CCLFDbItemProvider::RunError( const TInt aError ) + { + MG_DEBUG2( re1, "[CLF]\t CCLFDbItemProvider::RunError: %d", aError ); + + if ( (EItemsReady == iProviderState || aError) && iObserver ) + { + TRAP_IGNORE( iObserver->OperationCompleteL( aError ) ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::PrepareItemsL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::PrepareItemsL( const MDesCArray& aMimeTypeArray, + const TArray< TInt >& aMediaTypeArray, + MCLFItemProviderObserver& aObserver ) + { + MG_DEBUG1( PI1, "[CLF]\t CCLFDbItemProvider::PrepareItemsL 1" ); + + Cancel(); + iObserver = &aObserver; + iItemArray.ResetAndDestroy(); + + TBool image = EFalse; + TBool video = EFalse; + TBool audio = EFalse; + TBool other = EFalse; + + // find all mediatypes + const TInt typeCount( aMediaTypeArray.Count() ); + for ( TInt i = 0; i < typeCount; i++ ) + { + iObjDefStr = &KNullDesC; + iObjDefStr = &CLFUtils::MapClfType( aMediaTypeArray[ i ] ); + + if (iObjDefStr->Compare(MdeConstants::Image::KImageObject) == 0) + { + image = ETrue; + } + else if (iObjDefStr->Compare(MdeConstants::Video::KVideoObject) == 0) + { + video = ETrue; + } + else if (iObjDefStr->Compare(MdeConstants::Audio::KAudioObject) == 0) + { + audio = ETrue; + } + else + { + other = ETrue; + } + } + + // images & videos (gallery) + if (image && video && !audio) + { + iObjDefStr = &MdeConstants::Object::KBaseObject; + } + // images + else if(image && !video && !audio && !other) + { + iObjDefStr = &MdeConstants::Image::KImageObject; + } + // videos + else if (!image && video && !audio && !other) + { + iObjDefStr = &MdeConstants::Video::KVideoObject; + } + // audio + else if (!image && !video && audio && !other) + { + iObjDefStr = &MdeConstants::Audio::KAudioObject; + } + // other + else + { + iObjDefStr = &MdeConstants::Object::KBaseObject; + } + + iProviderState = EPrepareItemIds; + + delete iObjectQuery; + iObjectQuery = NULL; + iQueryAdapter.QueryMdEObjectsL( aMimeTypeArray, aMediaTypeArray, iObjectQuery, iStatus ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::PrepareItemsL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::PrepareItemsL( const TArray< TCLFItemId >& aItemIDArray, + MCLFItemProviderObserver& aObserver ) + { + MG_DEBUG1( PI1, "[CLF]\t CCLFDbItemProvider::PrepareItemsL 2" ); + + Cancel(); + iObserver = &aObserver; + iItemArray.ResetAndDestroy(); + iProviderState = EPrepareItems; + + const TDesC& objDefStr = CLFUtils::MapClfType( ECLFMediaTypeUnknown ); + delete iObjectQuery; + iObjectQuery = NULL; + iQueryAdapter.QueryMdEObjectsL( aItemIDArray, objDefStr, iObjectQuery, iStatus ); + SetActive(); + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::GetItems +// ----------------------------------------------------------------------------- +// +TInt CCLFDbItemProvider::GetItems( RPointerArray< MCLFItem >& aItemArray ) + { + MG_DEBUG1( df1, "[CLF]\t CCLFDbItemProvider::GetItems" ); + + const TInt KCLFItemIndex( 0 ); // do not change + + while ( iItemArray.Count() ) + { + const TInt error( aItemArray.Append( + iItemArray[ KCLFItemIndex ] ) ); // takes ownership + if ( error ) + { + return error; + } + iItemArray.Remove( KCLFItemIndex ); + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::DoFetchMdSIdDataCachedL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::DoFetchMdSIdDataCachedL() + { + MG_DEBUG1( df1, "[CLF]\t CCLFDbItemProvider::DoFetchMdSIdDataCachedL" ); + + RArray< TCLFItemId > itemIdArray; + CleanupClosePushL( itemIdArray ); + DoFetchMdSIdDataL( itemIdArray ); + + // Check if items are in cache + TInt idCount( itemIdArray.Count() ); + for ( TInt i = 0 ; i < idCount ; ++i ) + { + CCLFContainerItem* containerItem = + iDbItemContainer.ItemById( itemIdArray[ i ] ); + if ( containerItem ) + { + // found in cache + CreateCLFItemL( *containerItem ); // reserve item for this model + + // remove handled item ID + itemIdArray.Remove( i ); + --i; + --idCount; + } + } + iProviderState = EPrepareItems; + + delete iObjectQuery; + iObjectQuery = NULL; + iQueryAdapter.QueryMdEObjectsL( itemIdArray.Array(), *iObjDefStr, iObjectQuery, iStatus ); + SetActive(); + CleanupStack::PopAndDestroy( &itemIdArray ); + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::DoFetchMdSDataL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::DoFetchMdSDataL() + { +#ifdef _DEBUG + MG_DEBUG1( df1, "[CLF]\t CCLFDbItemProvider::DoFetchDataL" ); + + _LIT( KCLFWIPPanicText, "DoFetchMdSDataL"); + __ASSERT_DEBUG( iObjectQuery, User::Panic( KCLFWIPPanicText, KErrNotReady )); +#endif + + const TInt count( iObjectQuery->Count() ); + for ( TInt index( 0 ); index < count; index++ ) + { + const TInt64 id = (TInt64)iObjectQuery->ResultId( index ); + CMdEObject* object = iMdESession->GetFullObjectL( id ); + + if( !object ) + { + continue; + } + + // check if other model is already put this item to container + CCLFContainerItem* containerItem = + iDbItemContainer.ItemById( id ); + if ( containerItem ) + { + delete object; + object = NULL; + continue; + } + else + { + // create container item + containerItem = CCLFContainerItem::NewLC( object ); + + // append container item to container + // container takes ownership of container item + iDbItemContainer.AddL( containerItem ); + CleanupStack::Pop( containerItem ); + } + CreateCLFItemL( *containerItem ); + } + iProviderState = EItemsReady; + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::DoFetchMdSIdDataL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::DoFetchMdSIdDataL( RArray< TCLFItemId >& aItemIDArray ) + { +#ifdef _DEBUG + MG_DEBUG1( df1, "[CLF]\t CCLFDbItemProvider::DoFetchDataL" ); + + _LIT( KCLWIPPanicString, "DoFetchMdSIdDataL" ); + __ASSERT_DEBUG( iObjectQuery, + User::Panic( KCLWIPPanicString, KErrAbort )); +#endif + + const TInt count( iObjectQuery->Count() ); + for ( TInt index( 0 ); index < count; index++ ) + { + aItemIDArray.AppendL( (TInt64)iObjectQuery->ResultId( index )); + } + } + +// ----------------------------------------------------------------------------- +// CCLFDbItemProvider::CreateCLFItemL +// ----------------------------------------------------------------------------- +// +void CCLFDbItemProvider::CreateCLFItemL( CCLFContainerItem& aCItem ) + { + MG_DEBUG1( cci1, "[CLF]\t CCLFDbItemProvider::CreateCLFItemL" ); + + // CLF item releases reference in destructor + CCLFItemImpl* item = CCLFItemImpl::NewLC( aCItem, iDbItemContainer ); + iItemArray.AppendL( item ); // array takes ownership of the item + CleanupStack::Pop( item ); + } + +// End of File