clfwrapper/ClientSrc/CCLFItemListModelImpl.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
equal deleted inserted replaced
-1:000000000000 0:c53acadfccc6
       
     1 /*
       
     2 * Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // INCLUDE FILES
       
    20 #include    "CCLFItemListModelImpl.h"
       
    21 #include    "CCLFDbItemProvider.h"
       
    22 #include    "CCLFDefaultOperation.h"
       
    23 #include    <MCLFOperationObserver.h>
       
    24 #include    <MCLFItem.h>
       
    25 #include    <MCLFSortingStyle.h>
       
    26 #include    "MGTracePrint.h"
       
    27 #include    <ContentListingFactory.h>
       
    28 #include    <barsread.h>
       
    29 #include    <collate.h>
       
    30 #include    "MGDebugPrint.h"
       
    31 
       
    32 // CONSTANTS
       
    33 const TInt KCLFResourceVersionNumber( 1 );
       
    34 const TInt KCLFEmptyArrayGranularity( 1 );
       
    35 const TInt KCLFSortingStyleArrayGranularity( 3 );
       
    36 const TInt KCLFResourceVersion1( 1 );
       
    37 const TInt KCLFResourceVersion2( 2 );
       
    38 
       
    39 _LIT( KCLFAllMimeTypeMatchString, "*" );
       
    40 
       
    41 // ============================ MEMBER FUNCTIONS ===============================
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // CCLFItemListModelImpl::CCLFItemListModelImpl
       
    45 // -----------------------------------------------------------------------------
       
    46 //
       
    47 CCLFItemListModelImpl::CCLFItemListModelImpl(
       
    48                                         CCLFDbItemProvider* aItemProvider,
       
    49                                         MCLFOperationObserver& aObserver,
       
    50                                         MCLFChangedItemProvider& aChangedItemProvider )
       
    51     : iMimeTypeArray( NULL ),
       
    52       iMediaTypeArray( NULL ),
       
    53       iGrouper( NULL ),
       
    54       iSorter( NULL ),
       
    55       iPostFilter( NULL ),
       
    56       iItemProvider( aItemProvider ),
       
    57       iOperationObserver( aObserver ),
       
    58       iSortingStyleArray( KCLFSortingStyleArrayGranularity ),
       
    59       iChangedItemProvider( aChangedItemProvider ),
       
    60       iIsItemsFetched( EFalse )
       
    61     {
       
    62     }
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // CCLFItemListModelImpl::ConstructL
       
    66 // -----------------------------------------------------------------------------
       
    67 //
       
    68 void CCLFItemListModelImpl::ConstructL()
       
    69     {
       
    70     iMediaTypeArray = new ( ELeave ) CArrayFixFlat< TInt >( KCLFEmptyArrayGranularity );
       
    71     iMimeTypeArray = new ( ELeave ) CDesCArrayFlat( KCLFEmptyArrayGranularity );
       
    72     iDefaultOperation = CCLFDefaultOperation::NewL();
       
    73     iSorter = iDefaultOperation;
       
    74     iGrouper = iDefaultOperation;
       
    75     iPostFilter = iDefaultOperation;
       
    76     }
       
    77 
       
    78 // -----------------------------------------------------------------------------
       
    79 // CCLFItemListModelImpl::ConstructL
       
    80 // -----------------------------------------------------------------------------
       
    81 //
       
    82 void CCLFItemListModelImpl::ConstructL( TResourceReader& aResource )
       
    83    {
       
    84     ConstructL();
       
    85     const TInt version( aResource.ReadInt16() );
       
    86 
       
    87     // resource versions are defined in Content Listing framework .rh file
       
    88     if( version != KCLFResourceVersion1 &&
       
    89         version != KCLFResourceVersion2 )
       
    90         {
       
    91         User::Leave( KErrNotSupported );
       
    92         }
       
    93     SetGroupingStyle( TCLFGrouping( aResource.ReadInt32() ) );
       
    94     SetWantedMimeTypesL( aResource );
       
    95     SetWantedMediaTypesL( aResource );
       
    96 
       
    97 
       
    98     const TInt count(
       
    99         version == KCLFResourceVersion2 ? aResource.ReadInt16() - 1 : 0 );
       
   100 
       
   101     MCLFSortingStyle* sortingStyle =
       
   102                         ContentListingFactory::NewSortingStyleLC( aResource );
       
   103     iSortingStyleArray.AppendL( sortingStyle ); // takes ownership
       
   104     CleanupStack::Pop(); // sortingStyle
       
   105     iDefaultOperation->SetSortingStyle( sortingStyle);
       
   106 
       
   107     for( TInt i = 0 ; i < count ; ++i )
       
   108         {
       
   109         MCLFSortingStyle* sortingStyle =
       
   110                         ContentListingFactory::NewSortingStyleLC( aResource );
       
   111         iSortingStyleArray.AppendL( sortingStyle ); // takes ownership
       
   112         CleanupStack::Pop(); // sortingStyle
       
   113         iDefaultOperation->AppendSortingStyleL( *sortingStyle );
       
   114         }
       
   115     }
       
   116 
       
   117 // -----------------------------------------------------------------------------
       
   118 // CCLFItemListModelImpl::NewLC
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 CCLFItemListModelImpl* CCLFItemListModelImpl::NewLC(
       
   122                                             CCLFDbItemProvider* aItemProvider,
       
   123                                             MCLFOperationObserver& aObserver,
       
   124                                             MCLFChangedItemProvider& aChangedItemProvider )
       
   125     {
       
   126     CCLFItemListModelImpl* self = new( ELeave ) CCLFItemListModelImpl( aItemProvider, aObserver, aChangedItemProvider );
       
   127     CleanupStack::PushL( self );
       
   128     self->ConstructL();
       
   129     return self;
       
   130     }
       
   131 
       
   132 // -----------------------------------------------------------------------------
       
   133 // CCLFItemListModelImpl::NewLC
       
   134 // -----------------------------------------------------------------------------
       
   135 //
       
   136 CCLFItemListModelImpl* CCLFItemListModelImpl::NewLC(
       
   137                                             CCLFDbItemProvider* aItemProvider,
       
   138                                             MCLFOperationObserver& aObserver,
       
   139                                             MCLFChangedItemProvider& aChangedItemProvider,
       
   140                                             TResourceReader& aResource)
       
   141     {
       
   142     CCLFItemListModelImpl* self = new( ELeave ) CCLFItemListModelImpl( aItemProvider, aObserver, aChangedItemProvider );
       
   143     CleanupStack::PushL( self );
       
   144     self->ConstructL( aResource );
       
   145     return self;
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // CCLFItemListModelImpl::~CCLFItemListModelImpl
       
   150 // Destructor
       
   151 // -----------------------------------------------------------------------------
       
   152 //
       
   153 CCLFItemListModelImpl::~CCLFItemListModelImpl()
       
   154     {
       
   155     iChangedItemProvider.RemoveChangedItemProviderObserver( this );
       
   156     delete iMimeTypeArray;
       
   157     delete iMediaTypeArray;
       
   158     iItemArray.ResetAndDestroy();
       
   159     delete iItemProvider;
       
   160     iResultArray.Close();
       
   161     delete iDefaultOperation;
       
   162     iSortingStyleArray.ResetAndDestroy();
       
   163     }
       
   164 
       
   165 // -----------------------------------------------------------------------------
       
   166 // CCLFItemListModelImpl::Item
       
   167 // -----------------------------------------------------------------------------
       
   168 //
       
   169 const MCLFItem& CCLFItemListModelImpl::Item( TInt aIndex ) const
       
   170     {
       
   171     return *( iResultArray[aIndex] );
       
   172     }
       
   173 
       
   174 // -----------------------------------------------------------------------------
       
   175 // CCLFItemListModelImpl::ItemCount
       
   176 // -----------------------------------------------------------------------------
       
   177 //
       
   178 TInt CCLFItemListModelImpl::ItemCount() const
       
   179     {
       
   180     return iResultArray.Count();
       
   181     }
       
   182 
       
   183 // -----------------------------------------------------------------------------
       
   184 // CCLFItemListModelImpl::SetSortingStyle
       
   185 // -----------------------------------------------------------------------------
       
   186 //
       
   187 void CCLFItemListModelImpl::SetSortingStyle( MCLFSortingStyle* aSortingStyle )
       
   188     {
       
   189     iDefaultOperation->SetSortingStyle( aSortingStyle );
       
   190     iSortingStyleArray.ResetAndDestroy();
       
   191     }
       
   192 
       
   193 // -----------------------------------------------------------------------------
       
   194 // CCLFItemListModelImpl::AppendSecondarySortingStyleL
       
   195 // -----------------------------------------------------------------------------
       
   196 //
       
   197 void CCLFItemListModelImpl::AppendSecondarySortingStyleL(
       
   198                                             MCLFSortingStyle& aSortingStyle )
       
   199     {
       
   200     iDefaultOperation->AppendSortingStyleL( aSortingStyle );
       
   201     }
       
   202 
       
   203 // -----------------------------------------------------------------------------
       
   204 // CCLFItemListModelImpl::SetCustomSorter
       
   205 // -----------------------------------------------------------------------------
       
   206 //
       
   207 void CCLFItemListModelImpl::SetCustomSorter( MCLFCustomSorter* aCustomSorter )
       
   208     {
       
   209     if( aCustomSorter )
       
   210         {
       
   211         iSorter = aCustomSorter;
       
   212         }
       
   213     else
       
   214         {
       
   215         iSorter = iDefaultOperation;
       
   216         }
       
   217     }
       
   218 
       
   219 // -----------------------------------------------------------------------------
       
   220 // CCLFItemListModelImpl::SetGroupingStyle
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 void CCLFItemListModelImpl::SetGroupingStyle( TCLFGrouping aGrouping )
       
   224     {
       
   225     iDefaultOperation->SetGrouping( aGrouping );
       
   226     }
       
   227 
       
   228 // -----------------------------------------------------------------------------
       
   229 // CCLFItemListModelImpl::SetCustomGrouper
       
   230 // -----------------------------------------------------------------------------
       
   231 //
       
   232 void CCLFItemListModelImpl::SetCustomGrouper(
       
   233                                             MCLFCustomGrouper* aCustomGrouper )
       
   234     {
       
   235     if( aCustomGrouper )
       
   236         {
       
   237         iGrouper = aCustomGrouper;
       
   238         }
       
   239     else
       
   240         {
       
   241         iGrouper = iDefaultOperation;
       
   242         }
       
   243     }
       
   244 
       
   245 // -----------------------------------------------------------------------------
       
   246 // CCLFItemListModelImpl::SetPostFilter
       
   247 // -----------------------------------------------------------------------------
       
   248 //
       
   249 void CCLFItemListModelImpl::SetPostFilter( MCLFPostFilter* aPostFilter )
       
   250     {
       
   251     if( aPostFilter )
       
   252         {
       
   253         iPostFilter = aPostFilter;
       
   254         }
       
   255     else
       
   256         {
       
   257         iPostFilter = iDefaultOperation;
       
   258         }
       
   259     }
       
   260 
       
   261 
       
   262 // -----------------------------------------------------------------------------
       
   263 // CCLFItemListModelImpl::SetWantedMimeTypesL
       
   264 // Method makes new array, because if we can't make new then old array is used
       
   265 // -----------------------------------------------------------------------------
       
   266 //
       
   267 void CCLFItemListModelImpl::SetWantedMimeTypesL( const MDesCArray& aMimeTypes )
       
   268     {
       
   269     const TInt mimeTypeCount( aMimeTypes.MdcaCount() );
       
   270     
       
   271     if( mimeTypeCount > 0 )
       
   272         {
       
   273         if( mimeTypeCount == 1 )
       
   274             {
       
   275             TCollationMethod m = *Mem::CollationMethodByIndex( 0 );
       
   276             m.iFlags = ( TCollationMethod::EIgnoreNone | TCollationMethod::EFoldCase );   
       
   277             
       
   278             const TDesC& mimeType = aMimeTypes.MdcaPoint( 0 );
       
   279             if ( mimeType.CompareC( KCLFAllMimeTypeMatchString, 3, &m ) == 0 )
       
   280                 {
       
   281                 ResetMimeTypeArrayL();
       
   282                 return;
       
   283                 }
       
   284             }
       
   285         CDesCArray* array = new (ELeave) CDesCArrayFlat( mimeTypeCount );
       
   286         CleanupStack::PushL( array );
       
   287         for( TInt i = 0 ; i < mimeTypeCount ; ++i )
       
   288             {
       
   289             array->AppendL( aMimeTypes.MdcaPoint( i ) );
       
   290             }
       
   291         CleanupStack::Pop( array );
       
   292         delete iMimeTypeArray;
       
   293         iMimeTypeArray = array;
       
   294         }
       
   295     else
       
   296         {
       
   297         ResetMimeTypeArrayL();
       
   298         }
       
   299     }
       
   300 
       
   301 // -----------------------------------------------------------------------------
       
   302 // CCLFItemListModelImpl::SetWantedMimeTypesL
       
   303 // Method makes new array, because if we can't make new then old array is used
       
   304 // -----------------------------------------------------------------------------
       
   305 //
       
   306 void CCLFItemListModelImpl::SetWantedMimeTypesL( TResourceReader& aResource )
       
   307     {
       
   308     CheckVersionL( aResource, KCLFResourceVersionNumber );
       
   309     const TInt numMimeTypes( aResource.ReadInt16() );
       
   310     if ( numMimeTypes > 0 )
       
   311         {
       
   312         // TResourceReader re-reads the length, have to rewind
       
   313         aResource.Rewind( sizeof( TInt16 ) );
       
   314         CDesCArray* array = aResource.ReadDesCArrayL();
       
   315         delete iMimeTypeArray;
       
   316         iMimeTypeArray = array;
       
   317         }
       
   318     else
       
   319         {
       
   320         ResetMimeTypeArrayL();
       
   321         }
       
   322     }
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CCLFItemListModelImpl::SetWantedMediaTypesL
       
   326 // Method makes new array, because if we can't make new then old array is used
       
   327 // -----------------------------------------------------------------------------
       
   328 //
       
   329 void CCLFItemListModelImpl::SetWantedMediaTypesL(
       
   330                             const TArray<TInt>& aMediaTypes )
       
   331     {
       
   332     const TInt count( aMediaTypes.Count() );
       
   333     if( count > 0 )
       
   334         {
       
   335         CArrayFix<TInt>* array =
       
   336                         new ( ELeave ) CArrayFixFlat<TInt>( count );
       
   337         CleanupStack::PushL( array );
       
   338         for( TInt i = 0 ; i < count ; ++i )
       
   339             {
       
   340             array->AppendL( aMediaTypes[i] );
       
   341             }
       
   342         CleanupStack::Pop( array );
       
   343         delete iMediaTypeArray;
       
   344         iMediaTypeArray = array;
       
   345         }
       
   346     else
       
   347         {
       
   348         ResetMediaTypeArrayL();
       
   349         }
       
   350     }
       
   351 
       
   352 // -----------------------------------------------------------------------------
       
   353 // CCLFItemListModelImpl::SetWantedMediaTypesL
       
   354 // Method makes new array, because if we can't make new then old array is used
       
   355 // -----------------------------------------------------------------------------
       
   356 //
       
   357 void CCLFItemListModelImpl::SetWantedMediaTypesL( TResourceReader& aResource )
       
   358     {
       
   359     CheckVersionL( aResource, KCLFResourceVersionNumber );
       
   360     const TInt numMediaTypes( aResource.ReadInt16() );
       
   361     if ( numMediaTypes > 0 )
       
   362         {
       
   363         CArrayFix<TInt>* array =
       
   364                 new ( ELeave ) CArrayFixFlat<TInt>( numMediaTypes );
       
   365         CleanupStack::PushL( array );
       
   366         for( TInt i = 0 ; i < numMediaTypes ; ++i )
       
   367             {
       
   368             array->AppendL( aResource.ReadInt32() );
       
   369             }
       
   370         CleanupStack::Pop( array );
       
   371         delete iMediaTypeArray;
       
   372         iMediaTypeArray = array;
       
   373         }
       
   374     else
       
   375         {
       
   376         ResetMediaTypeArrayL();
       
   377         }
       
   378     }
       
   379 
       
   380 // -----------------------------------------------------------------------------
       
   381 // CCLFItemListModelImpl::RefreshL
       
   382 // -----------------------------------------------------------------------------
       
   383 //
       
   384 void CCLFItemListModelImpl::RefreshL()
       
   385     {
       
   386     MG_TRACE1( KCLFTrace, "CLF list model refresh start" )
       
   387 
       
   388     iIsItemsFetched = EFalse;
       
   389     iItemArray.ResetAndDestroy();
       
   390     iItemProvider->PrepareItemsL( *iMimeTypeArray,
       
   391                              iMediaTypeArray->Array(),
       
   392                              *this );
       
   393 
       
   394     }
       
   395 
       
   396 // -----------------------------------------------------------------------------
       
   397 // CCLFItemListModelImpl::RefreshL
       
   398 // -----------------------------------------------------------------------------
       
   399 //
       
   400 void CCLFItemListModelImpl::RefreshL( TInt32 aRefreshType )
       
   401     {
       
   402     RPointerArray<MCLFItem> tmpArray;
       
   403     CleanupClosePushL( tmpArray );
       
   404 
       
   405     MG_TRACE1( KCLFTrace, "CLF list model refresh post filter start" )
       
   406 
       
   407     if( aRefreshType & ECLFRefreshPostFilter )
       
   408         {
       
   409         iPostFilter->FilterItemsL( iItemArray.Array(), tmpArray );
       
   410         }
       
   411     else
       
   412         {
       
   413         CopyArrayL( iItemArray.Array(), tmpArray );
       
   414         }
       
   415     iResultArray.Reset();
       
   416 
       
   417     MG_TRACE1( KCLFTrace1, "CLF list model refresh grouping start" )
       
   418 
       
   419     if( aRefreshType & ECLFRefreshGrouping )
       
   420         {
       
   421         iGrouper->GroupItemsL( tmpArray.Array(), iResultArray );
       
   422         }
       
   423     else
       
   424         {
       
   425         CopyArrayL( tmpArray.Array(), iResultArray );
       
   426         }
       
   427     CleanupStack::PopAndDestroy( &tmpArray );
       
   428 
       
   429     MG_TRACE1( KCLFTrace2, "CLF list model refresh sorting start" )
       
   430 
       
   431     if( aRefreshType & ECLFRefreshSorting )
       
   432         {
       
   433         iSorter->SortItemsL( iResultArray );
       
   434         }
       
   435 
       
   436     MG_TRACE1( KCLFTrace3, "CLF list model refresh sorting done" )
       
   437     }
       
   438 
       
   439 // -----------------------------------------------------------------------------
       
   440 // CCLFItemListModelImpl::CopyArrayL
       
   441 // -----------------------------------------------------------------------------
       
   442 //
       
   443 void CCLFItemListModelImpl::CopyArrayL( const TArray<MCLFItem*>& aSource,
       
   444                                         RPointerArray<MCLFItem>& aDest )
       
   445     {
       
   446     MG_DEBUG3( AI1, "CCLFItemListModelImpl::CopyArrayL start, aSource: 0x%08x, aDest: 0x%08x",
       
   447                &aSource, &aDest );
       
   448 
       
   449     const TInt count( aSource.Count() );
       
   450     for( TInt i = 0 ; i < count ; ++i )
       
   451         {
       
   452         MG_DEBUG3( AI2, "aSource[ %d ]: 0x%08x", i, aSource[ i ] );
       
   453         aDest.AppendL( aSource[i] );
       
   454         }
       
   455 
       
   456     MG_DEBUG1( AI3, "CCLFItemListModelImpl::CopyArrayL end" );
       
   457     }
       
   458 
       
   459 // -----------------------------------------------------------------------------
       
   460 // CCLFItemListModelImpl::CancelRefresh
       
   461 // -----------------------------------------------------------------------------
       
   462 //
       
   463 void CCLFItemListModelImpl::CancelRefresh()
       
   464     {
       
   465     iItemProvider->Cancel();
       
   466     }
       
   467 
       
   468 // -----------------------------------------------------------------------------
       
   469 // CCLFItemListModelImpl::OperationCompleteL
       
   470 // -----------------------------------------------------------------------------
       
   471 //
       
   472 void CCLFItemListModelImpl::OperationCompleteL( TInt aError )
       
   473     {
       
   474     MG_TRACE1( KCLFTrace, "CLF list model items ready" )
       
   475 
       
   476     TInt error( aError );
       
   477     if ( error == KErrNone )
       
   478         {
       
   479         iIsItemsFetched = ETrue;
       
   480         iResultArray.Reset(); // reset result array before items are deleted
       
   481         iItemArray.ResetAndDestroy();
       
   482         error = iItemProvider->GetItems( iItemArray );
       
   483         if ( error == KErrNone )
       
   484             {
       
   485             TRAP( error, RefreshL( ECLFRefreshAll ) );
       
   486             }
       
   487         }
       
   488     iOperationObserver.HandleOperationEventL( ECLFRefreshComplete, error );
       
   489     }
       
   490 
       
   491 // -----------------------------------------------------------------------------
       
   492 // CCLFItemListModelImpl::CheckVersionL
       
   493 // -----------------------------------------------------------------------------
       
   494 //
       
   495 void CCLFItemListModelImpl::CheckVersionL( TResourceReader& aResource,
       
   496                                            TInt aVersion )
       
   497     {
       
   498     const TInt version( aResource.ReadInt16() );
       
   499     if( version != aVersion )
       
   500         {
       
   501         User::Leave( KErrNotSupported );
       
   502         }
       
   503     }
       
   504 
       
   505 // -----------------------------------------------------------------------------
       
   506 // CCLFItemListModelImpl::ResetMimeTypeArrayL
       
   507 // -----------------------------------------------------------------------------
       
   508 //
       
   509 void CCLFItemListModelImpl::ResetMimeTypeArrayL()
       
   510     {
       
   511     CDesCArray* array =
       
   512                 new (ELeave) CDesCArrayFlat( KCLFEmptyArrayGranularity );
       
   513     delete iMimeTypeArray;
       
   514     iMimeTypeArray = array;
       
   515     }
       
   516 
       
   517 // -----------------------------------------------------------------------------
       
   518 // CCLFItemListModelImpl::ResetMediaTypeArrayL
       
   519 // -----------------------------------------------------------------------------
       
   520 //
       
   521 void CCLFItemListModelImpl::ResetMediaTypeArrayL()
       
   522     {
       
   523     CArrayFix<TInt>* array =
       
   524                         new ( ELeave ) CArrayFixFlat<TInt>(
       
   525                                             KCLFEmptyArrayGranularity );
       
   526     delete iMediaTypeArray;
       
   527     iMediaTypeArray = array;
       
   528     }
       
   529 
       
   530 // -----------------------------------------------------------------------------
       
   531 // CCLFItemListModelImpl::ChangedItemsL
       
   532 // -----------------------------------------------------------------------------
       
   533 //
       
   534 void CCLFItemListModelImpl::NewChangedItemsL()
       
   535     {
       
   536     if( iIsItemsFetched )
       
   537         {
       
   538         const TInt count( iItemArray.Count() );
       
   539         RArray<TCLFItemId> idArray( count == 0 ? 1 : count );
       
   540         CleanupClosePushL( idArray );
       
   541         for( TInt i = 0 ; i < count ; ++i )
       
   542             {
       
   543             idArray.AppendL( iItemArray[i]->ItemId() );
       
   544             }
       
   545         
       
   546         if( iChangedItemProvider.IsItemsForModel( *iMimeTypeArray,
       
   547                                                   iMediaTypeArray->Array(),
       
   548                                                   idArray.Array() ) )
       
   549             {
       
   550             iOperationObserver.HandleOperationEventL( ECLFModelOutdated, KErrNone );
       
   551             }
       
   552         CleanupStack::PopAndDestroy( &idArray );
       
   553         }
       
   554     }
       
   555 
       
   556 //  End of File