diff -r 000000000000 -r c53acadfccc6 clfwrapper/ClientSrc/CCLFItemListModelImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clfwrapper/ClientSrc/CCLFItemListModelImpl.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,556 @@ +/* +* 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 "CCLFItemListModelImpl.h" +#include "CCLFDbItemProvider.h" +#include "CCLFDefaultOperation.h" +#include +#include +#include +#include "MGTracePrint.h" +#include +#include +#include +#include "MGDebugPrint.h" + +// CONSTANTS +const TInt KCLFResourceVersionNumber( 1 ); +const TInt KCLFEmptyArrayGranularity( 1 ); +const TInt KCLFSortingStyleArrayGranularity( 3 ); +const TInt KCLFResourceVersion1( 1 ); +const TInt KCLFResourceVersion2( 2 ); + +_LIT( KCLFAllMimeTypeMatchString, "*" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::CCLFItemListModelImpl +// ----------------------------------------------------------------------------- +// +CCLFItemListModelImpl::CCLFItemListModelImpl( + CCLFDbItemProvider* aItemProvider, + MCLFOperationObserver& aObserver, + MCLFChangedItemProvider& aChangedItemProvider ) + : iMimeTypeArray( NULL ), + iMediaTypeArray( NULL ), + iGrouper( NULL ), + iSorter( NULL ), + iPostFilter( NULL ), + iItemProvider( aItemProvider ), + iOperationObserver( aObserver ), + iSortingStyleArray( KCLFSortingStyleArrayGranularity ), + iChangedItemProvider( aChangedItemProvider ), + iIsItemsFetched( EFalse ) + { + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ConstructL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::ConstructL() + { + iMediaTypeArray = new ( ELeave ) CArrayFixFlat< TInt >( KCLFEmptyArrayGranularity ); + iMimeTypeArray = new ( ELeave ) CDesCArrayFlat( KCLFEmptyArrayGranularity ); + iDefaultOperation = CCLFDefaultOperation::NewL(); + iSorter = iDefaultOperation; + iGrouper = iDefaultOperation; + iPostFilter = iDefaultOperation; + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ConstructL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::ConstructL( TResourceReader& aResource ) + { + ConstructL(); + const TInt version( aResource.ReadInt16() ); + + // resource versions are defined in Content Listing framework .rh file + if( version != KCLFResourceVersion1 && + version != KCLFResourceVersion2 ) + { + User::Leave( KErrNotSupported ); + } + SetGroupingStyle( TCLFGrouping( aResource.ReadInt32() ) ); + SetWantedMimeTypesL( aResource ); + SetWantedMediaTypesL( aResource ); + + + const TInt count( + version == KCLFResourceVersion2 ? aResource.ReadInt16() - 1 : 0 ); + + MCLFSortingStyle* sortingStyle = + ContentListingFactory::NewSortingStyleLC( aResource ); + iSortingStyleArray.AppendL( sortingStyle ); // takes ownership + CleanupStack::Pop(); // sortingStyle + iDefaultOperation->SetSortingStyle( sortingStyle); + + for( TInt i = 0 ; i < count ; ++i ) + { + MCLFSortingStyle* sortingStyle = + ContentListingFactory::NewSortingStyleLC( aResource ); + iSortingStyleArray.AppendL( sortingStyle ); // takes ownership + CleanupStack::Pop(); // sortingStyle + iDefaultOperation->AppendSortingStyleL( *sortingStyle ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::NewLC +// ----------------------------------------------------------------------------- +// +CCLFItemListModelImpl* CCLFItemListModelImpl::NewLC( + CCLFDbItemProvider* aItemProvider, + MCLFOperationObserver& aObserver, + MCLFChangedItemProvider& aChangedItemProvider ) + { + CCLFItemListModelImpl* self = new( ELeave ) CCLFItemListModelImpl( aItemProvider, aObserver, aChangedItemProvider ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::NewLC +// ----------------------------------------------------------------------------- +// +CCLFItemListModelImpl* CCLFItemListModelImpl::NewLC( + CCLFDbItemProvider* aItemProvider, + MCLFOperationObserver& aObserver, + MCLFChangedItemProvider& aChangedItemProvider, + TResourceReader& aResource) + { + CCLFItemListModelImpl* self = new( ELeave ) CCLFItemListModelImpl( aItemProvider, aObserver, aChangedItemProvider ); + CleanupStack::PushL( self ); + self->ConstructL( aResource ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::~CCLFItemListModelImpl +// Destructor +// ----------------------------------------------------------------------------- +// +CCLFItemListModelImpl::~CCLFItemListModelImpl() + { + iChangedItemProvider.RemoveChangedItemProviderObserver( this ); + delete iMimeTypeArray; + delete iMediaTypeArray; + iItemArray.ResetAndDestroy(); + delete iItemProvider; + iResultArray.Close(); + delete iDefaultOperation; + iSortingStyleArray.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::Item +// ----------------------------------------------------------------------------- +// +const MCLFItem& CCLFItemListModelImpl::Item( TInt aIndex ) const + { + return *( iResultArray[aIndex] ); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ItemCount +// ----------------------------------------------------------------------------- +// +TInt CCLFItemListModelImpl::ItemCount() const + { + return iResultArray.Count(); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetSortingStyle +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetSortingStyle( MCLFSortingStyle* aSortingStyle ) + { + iDefaultOperation->SetSortingStyle( aSortingStyle ); + iSortingStyleArray.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::AppendSecondarySortingStyleL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::AppendSecondarySortingStyleL( + MCLFSortingStyle& aSortingStyle ) + { + iDefaultOperation->AppendSortingStyleL( aSortingStyle ); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetCustomSorter +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetCustomSorter( MCLFCustomSorter* aCustomSorter ) + { + if( aCustomSorter ) + { + iSorter = aCustomSorter; + } + else + { + iSorter = iDefaultOperation; + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetGroupingStyle +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetGroupingStyle( TCLFGrouping aGrouping ) + { + iDefaultOperation->SetGrouping( aGrouping ); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetCustomGrouper +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetCustomGrouper( + MCLFCustomGrouper* aCustomGrouper ) + { + if( aCustomGrouper ) + { + iGrouper = aCustomGrouper; + } + else + { + iGrouper = iDefaultOperation; + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetPostFilter +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetPostFilter( MCLFPostFilter* aPostFilter ) + { + if( aPostFilter ) + { + iPostFilter = aPostFilter; + } + else + { + iPostFilter = iDefaultOperation; + } + } + + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetWantedMimeTypesL +// Method makes new array, because if we can't make new then old array is used +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetWantedMimeTypesL( const MDesCArray& aMimeTypes ) + { + const TInt mimeTypeCount( aMimeTypes.MdcaCount() ); + + if( mimeTypeCount > 0 ) + { + if( mimeTypeCount == 1 ) + { + TCollationMethod m = *Mem::CollationMethodByIndex( 0 ); + m.iFlags = ( TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase ); + + const TDesC& mimeType = aMimeTypes.MdcaPoint( 0 ); + if ( mimeType.CompareC( KCLFAllMimeTypeMatchString, 3, &m ) == 0 ) + { + ResetMimeTypeArrayL(); + return; + } + } + CDesCArray* array = new (ELeave) CDesCArrayFlat( mimeTypeCount ); + CleanupStack::PushL( array ); + for( TInt i = 0 ; i < mimeTypeCount ; ++i ) + { + array->AppendL( aMimeTypes.MdcaPoint( i ) ); + } + CleanupStack::Pop( array ); + delete iMimeTypeArray; + iMimeTypeArray = array; + } + else + { + ResetMimeTypeArrayL(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetWantedMimeTypesL +// Method makes new array, because if we can't make new then old array is used +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetWantedMimeTypesL( TResourceReader& aResource ) + { + CheckVersionL( aResource, KCLFResourceVersionNumber ); + const TInt numMimeTypes( aResource.ReadInt16() ); + if ( numMimeTypes > 0 ) + { + // TResourceReader re-reads the length, have to rewind + aResource.Rewind( sizeof( TInt16 ) ); + CDesCArray* array = aResource.ReadDesCArrayL(); + delete iMimeTypeArray; + iMimeTypeArray = array; + } + else + { + ResetMimeTypeArrayL(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetWantedMediaTypesL +// Method makes new array, because if we can't make new then old array is used +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetWantedMediaTypesL( + const TArray& aMediaTypes ) + { + const TInt count( aMediaTypes.Count() ); + if( count > 0 ) + { + CArrayFix* array = + new ( ELeave ) CArrayFixFlat( count ); + CleanupStack::PushL( array ); + for( TInt i = 0 ; i < count ; ++i ) + { + array->AppendL( aMediaTypes[i] ); + } + CleanupStack::Pop( array ); + delete iMediaTypeArray; + iMediaTypeArray = array; + } + else + { + ResetMediaTypeArrayL(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::SetWantedMediaTypesL +// Method makes new array, because if we can't make new then old array is used +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::SetWantedMediaTypesL( TResourceReader& aResource ) + { + CheckVersionL( aResource, KCLFResourceVersionNumber ); + const TInt numMediaTypes( aResource.ReadInt16() ); + if ( numMediaTypes > 0 ) + { + CArrayFix* array = + new ( ELeave ) CArrayFixFlat( numMediaTypes ); + CleanupStack::PushL( array ); + for( TInt i = 0 ; i < numMediaTypes ; ++i ) + { + array->AppendL( aResource.ReadInt32() ); + } + CleanupStack::Pop( array ); + delete iMediaTypeArray; + iMediaTypeArray = array; + } + else + { + ResetMediaTypeArrayL(); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::RefreshL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::RefreshL() + { + MG_TRACE1( KCLFTrace, "CLF list model refresh start" ) + + iIsItemsFetched = EFalse; + iItemArray.ResetAndDestroy(); + iItemProvider->PrepareItemsL( *iMimeTypeArray, + iMediaTypeArray->Array(), + *this ); + + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::RefreshL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::RefreshL( TInt32 aRefreshType ) + { + RPointerArray tmpArray; + CleanupClosePushL( tmpArray ); + + MG_TRACE1( KCLFTrace, "CLF list model refresh post filter start" ) + + if( aRefreshType & ECLFRefreshPostFilter ) + { + iPostFilter->FilterItemsL( iItemArray.Array(), tmpArray ); + } + else + { + CopyArrayL( iItemArray.Array(), tmpArray ); + } + iResultArray.Reset(); + + MG_TRACE1( KCLFTrace1, "CLF list model refresh grouping start" ) + + if( aRefreshType & ECLFRefreshGrouping ) + { + iGrouper->GroupItemsL( tmpArray.Array(), iResultArray ); + } + else + { + CopyArrayL( tmpArray.Array(), iResultArray ); + } + CleanupStack::PopAndDestroy( &tmpArray ); + + MG_TRACE1( KCLFTrace2, "CLF list model refresh sorting start" ) + + if( aRefreshType & ECLFRefreshSorting ) + { + iSorter->SortItemsL( iResultArray ); + } + + MG_TRACE1( KCLFTrace3, "CLF list model refresh sorting done" ) + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::CopyArrayL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::CopyArrayL( const TArray& aSource, + RPointerArray& aDest ) + { + MG_DEBUG3( AI1, "CCLFItemListModelImpl::CopyArrayL start, aSource: 0x%08x, aDest: 0x%08x", + &aSource, &aDest ); + + const TInt count( aSource.Count() ); + for( TInt i = 0 ; i < count ; ++i ) + { + MG_DEBUG3( AI2, "aSource[ %d ]: 0x%08x", i, aSource[ i ] ); + aDest.AppendL( aSource[i] ); + } + + MG_DEBUG1( AI3, "CCLFItemListModelImpl::CopyArrayL end" ); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::CancelRefresh +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::CancelRefresh() + { + iItemProvider->Cancel(); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::OperationCompleteL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::OperationCompleteL( TInt aError ) + { + MG_TRACE1( KCLFTrace, "CLF list model items ready" ) + + TInt error( aError ); + if ( error == KErrNone ) + { + iIsItemsFetched = ETrue; + iResultArray.Reset(); // reset result array before items are deleted + iItemArray.ResetAndDestroy(); + error = iItemProvider->GetItems( iItemArray ); + if ( error == KErrNone ) + { + TRAP( error, RefreshL( ECLFRefreshAll ) ); + } + } + iOperationObserver.HandleOperationEventL( ECLFRefreshComplete, error ); + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::CheckVersionL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::CheckVersionL( TResourceReader& aResource, + TInt aVersion ) + { + const TInt version( aResource.ReadInt16() ); + if( version != aVersion ) + { + User::Leave( KErrNotSupported ); + } + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ResetMimeTypeArrayL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::ResetMimeTypeArrayL() + { + CDesCArray* array = + new (ELeave) CDesCArrayFlat( KCLFEmptyArrayGranularity ); + delete iMimeTypeArray; + iMimeTypeArray = array; + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ResetMediaTypeArrayL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::ResetMediaTypeArrayL() + { + CArrayFix* array = + new ( ELeave ) CArrayFixFlat( + KCLFEmptyArrayGranularity ); + delete iMediaTypeArray; + iMediaTypeArray = array; + } + +// ----------------------------------------------------------------------------- +// CCLFItemListModelImpl::ChangedItemsL +// ----------------------------------------------------------------------------- +// +void CCLFItemListModelImpl::NewChangedItemsL() + { + if( iIsItemsFetched ) + { + const TInt count( iItemArray.Count() ); + RArray idArray( count == 0 ? 1 : count ); + CleanupClosePushL( idArray ); + for( TInt i = 0 ; i < count ; ++i ) + { + idArray.AppendL( iItemArray[i]->ItemId() ); + } + + if( iChangedItemProvider.IsItemsForModel( *iMimeTypeArray, + iMediaTypeArray->Array(), + idArray.Array() ) ) + { + iOperationObserver.HandleOperationEventL( ECLFModelOutdated, KErrNone ); + } + CleanupStack::PopAndDestroy( &idArray ); + } + } + +// End of File