clfwrapper/ClientSrc/CCLFItemListModelImpl.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /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    <MCLFOperationObserver.h>
+#include    <MCLFItem.h>
+#include    <MCLFSortingStyle.h>
+#include    "MGTracePrint.h"
+#include    <ContentListingFactory.h>
+#include    <barsread.h>
+#include    <collate.h>
+#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<TInt>& aMediaTypes )
+    {
+    const TInt count( aMediaTypes.Count() );
+    if( count > 0 )
+        {
+        CArrayFix<TInt>* array =
+                        new ( ELeave ) CArrayFixFlat<TInt>( 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<TInt>* array =
+                new ( ELeave ) CArrayFixFlat<TInt>( 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<MCLFItem> 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<MCLFItem*>& aSource,
+                                        RPointerArray<MCLFItem>& 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<TInt>* array =
+                        new ( ELeave ) CArrayFixFlat<TInt>(
+                                            KCLFEmptyArrayGranularity );
+    delete iMediaTypeArray;
+    iMediaTypeArray = array;
+    }
+
+// -----------------------------------------------------------------------------
+// CCLFItemListModelImpl::ChangedItemsL
+// -----------------------------------------------------------------------------
+//
+void CCLFItemListModelImpl::NewChangedItemsL()
+    {
+    if( iIsItemsFetched )
+        {
+        const TInt count( iItemArray.Count() );
+        RArray<TCLFItemId> 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