--- a/upnpsharing/upnpcontentserver/src/upnpcontentmetadatautility.cpp Fri Sep 17 08:31:21 2010 +0300
+++ b/upnpsharing/upnpcontentserver/src/upnpcontentmetadatautility.cpp Mon Nov 01 12:37:49 2010 +0200
@@ -1,727 +1,275 @@
-/*
-* Copyright (c) 2006-2007 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: CUpnpContentMetadataUtility class implementation
- *
-*/
-
-
-
-
-
-
-// INCLUDE FILES
-// System
-#include <e32base.h>
-#include <MCLFContentListingEngine.h>
-#include <ContentListingFactory.h>
-#include <MCLFItemListModel.h>
-#include <CLFContentListing.hrh>
-#include <MCLFItem.h>
-#include <f32file.h>
-
-// upnp stack api
-#include <upnpitem.h>
-#include <upnpcontainer.h>
-#include <upnpstring.h>
-
-// upnpframework / avcontroller helper api
-#include "upnpfileutility.h"
-
-// upnpframework / internal api's
-#include "upnpcommonutils.h"
-#include "upnpmetadatautility.h"
-
-#include "upnpdlnaprofiler.h"
-#include "upnpcdsreselementutility.h"
-
-// homeconnect internal
-#include "upnpcontentmetadatautility.h"
-#include "upnpcustomgrouper.h"
-#include "upnppostfilter.h"
-
-#include "upnpcontentserverdefs.h"
-
-_LIT( KComponentLogfile, "contentserver.txt");
-#include "upnplog.h"
-
-// CONSTANTS
-_LIT( KUPnPFileListSeparator, "\t" );
-const TInt KMediaTypeArrGranularity(1);
-
-using namespace UpnpContentServer;
-
-// ============================ MEMBER FUNCTIONS ============================
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::CUpnpContentMetadataUtility()
-// Default constructor
-// --------------------------------------------------------------------------
-//
-CUpnpContentMetadataUtility::CUpnpContentMetadataUtility()
- : iRefreshOngoing( ETrue )
- {
- }
-
-void CUpnpContentMetadataUtility::ConstructL()
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- // Create Content Listing Engine and a list model
- iEngine = ContentListingFactory::NewContentListingEngineLC();
- CleanupStack::Pop(); // iEngine
- iMusicModel = iEngine->CreateListModelLC( *this );
- CleanupStack::Pop(); // iMusicModel
-
- iImageModel = iEngine->CreateListModelLC( *this );
- CleanupStack::Pop(); // iImageModel
-
- iVideoModel = iEngine->CreateListModelLC( *this );
- CleanupStack::Pop(); // iVideoModel
-
- iCollectionModel = iEngine->CreateListModelLC( *this );
- CleanupStack::Pop(); // iCollectionModel
- // Set music media type filter to CLF
- RArray<TInt> musicArray( KMediaTypeArrGranularity );
-
- CleanupClosePushL( musicArray );
- musicArray.AppendL( ECLFMediaTypeMusic );
- iMusicModel->SetWantedMediaTypesL( musicArray.Array() );
- CleanupStack::PopAndDestroy( &musicArray );
-
- // Set image media type filter to CLF
- RArray<TInt> imageArray( KMediaTypeArrGranularity );
-
- CleanupClosePushL( imageArray );
- imageArray.AppendL( ECLFMediaTypeImage );
- iImageModel->SetWantedMediaTypesL( imageArray.Array() );
- CleanupStack::PopAndDestroy( &imageArray );
-
- // Set video media type filter to CLF
- RArray<TInt> videoArray( KMediaTypeArrGranularity );
- CleanupClosePushL( videoArray );
- videoArray.AppendL( ECLFMediaTypeVideo );
- iVideoModel->SetWantedMediaTypesL( videoArray.Array() );
- CleanupStack::PopAndDestroy( &videoArray );
-
- // Set Collection media type filter to CLF
- RArray<TInt> collectionArray( KMediaTypeArrGranularity );
-
- CleanupClosePushL( collectionArray );
- collectionArray.AppendL( ECLFMediaTypeCollection );
- iCollectionModel->SetWantedMediaTypesL( collectionArray.Array() );
- CleanupStack::PopAndDestroy( &collectionArray );
-
- // Group items by collection name
- iCustomGrouper = CUpnpCustomGrouper::NewL( ECLFFieldIdCollectionName );
- iCollectionModel->SetCustomGrouper( iCustomGrouper );
-
- // Start to refresh the music files (HandleOperationEventL
- // callback comes when finished)
- iMusicModel->RefreshL();
-
- // Create metadata utility
- iMetaDataUtility = CUPnPMetaDataUtility::NewL();
-
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::NewL()
-// 2 phased constructor
-// --------------------------------------------------------------------------
-//
-CUpnpContentMetadataUtility* CUpnpContentMetadataUtility::NewL()
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- CUpnpContentMetadataUtility* self
- = new( ELeave ) CUpnpContentMetadataUtility;
-
- CleanupStack::PushL( self );
- self->ConstructL();
- CleanupStack::Pop();
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- return self;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::~CUpnpContentMetadataUtility()
-// Default destructor
-// --------------------------------------------------------------------------
-//
-CUpnpContentMetadataUtility::~CUpnpContentMetadataUtility()
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- delete iMusicModel;
- delete iImageModel;
- delete iVideoModel;
- delete iCollectionModel;
- delete iPostFilter;
- delete iCustomGrouper;
- delete iEngine;
- delete iMetaDataUtility;
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::HandleOperationEventL
-// Callback implementation for MCLFOperationObserver
-// --------------------------------------------------------------------------
-//
-void CUpnpContentMetadataUtility::HandleOperationEventL(
- TCLFOperationEvent aOperationEvent,
- TInt /*aError*/ )
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- // Waiting is stopped when an event for refresh completion is received
- if( aOperationEvent == ECLFRefreshComplete )
-
- {
- switch ( iRefreshCounter )
- {
- case 0 :
- {
- iVideoModel->RefreshL();
- break;
- }
- case 1 :
- {
- iImageModel->RefreshL();
- break;
- }
- case 2 :
- {
- iCollectionModel->RefreshL();
- break;
- }
- case 3 :
- {
-
- iRefreshOngoing = EFalse;
- iRefreshCounter = 0;
- if ( iHandler )
- {
- iHandler->RefreshDoneL();
- }
- __LOG("CUpnpContentMetadataUtility::HandleOperationEventL: \
-Refresh done");
- break;
-
- }
- default :
- {
- __LOG("CUpnpContentMetadataUtility::HandleOperationEventL: \
-default: error");
- break;
- }
-
- }
- if ( iRefreshOngoing )
- {
- iRefreshCounter++;
- }
- }
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::HandleItemChangeL
-// CLF content is changed --> model needs to be refreshed
-// --------------------------------------------------------------------------
-//
-void CUpnpContentMetadataUtility::HandleItemChangeL(
- const TArray<TCLFItemId>& /*aItemIDArray*/ )
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- // Start to refresh the music files (HandleOperationEventL
- // callback comes when finished)
- iRefreshOngoing = ETrue;
- iMusicModel->RefreshL();
- iImageModel->RefreshL();
- iVideoModel->RefreshL();
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::HandleError
-// Method is used to handle errors in changed item event.
-// --------------------------------------------------------------------------
-//
-void CUpnpContentMetadataUtility::HandleError( TInt /*aError*/ )
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- }
-
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::MusicFiles
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-const MCLFItemListModel& CUpnpContentMetadataUtility::MusicFiles() const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- return *iMusicModel;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::ImageFiles
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-const MCLFItemListModel& CUpnpContentMetadataUtility::ImageFiles() const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- return *iImageModel;
- }
-
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::VideoFiles
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-const MCLFItemListModel& CUpnpContentMetadataUtility::VideoFiles() const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- return *iVideoModel;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::Collections
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-const MCLFItemListModel& CUpnpContentMetadataUtility::Collections() const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- return *iCollectionModel;
- }
-
-
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::GetCollectionFileNamesL
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-void CUpnpContentMetadataUtility::GetCollectionFileNamesL(
- CDesCArray& aFileArray,
- const TDesC& aFiles ) const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
-
- TInt collectionLength( aFiles.Length() );
- TInt position( 0 );
- TInt dataPos( 0 );
- do
- {
- // Put filenames from ":" separeted row to aFileArray
- TPtrC data( aFiles.Right( collectionLength - position ) );
- dataPos = data.Find( KUPnPFileListSeparator );
- if( dataPos > 0 )
- {
- ++position; // skip KUPnPFileListSeparator
- position += dataPos;
- aFileArray.AppendL( data.Left( dataPos ) );
- }
- } while ( dataPos > 0 );
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::CollectionItemsL()
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-//
-void CUpnpContentMetadataUtility::CollectionItemsL(
- const TDesC& aNameOfCollection )
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- __LOG1( "CUpnpContentMetadataUtility: collection: %S",
- &aNameOfCollection );
-
- //clear previous filtering
- iCollectionModel->SetPostFilter( NULL );
-
- // Delete old post filter if any
-
- delete iPostFilter;
- iPostFilter = NULL;
-
- // Create and activate a post filter for collection filtering
- // so that the model will contain only files
- // from selected collection
- iPostFilter = CUpnpPostFilter::NewL( ECLFFieldIdCollectionName,
- aNameOfCollection, EFalse );
- iCollectionModel->SetPostFilter( iPostFilter );
-
- iCollectionModel->RefreshL( ECLFRefreshPostFilter );
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::CreateItemL
-// Create the item with mandatory fields
-// --------------------------------------------------------------------------
-//
-CUpnpItem* CUpnpContentMetadataUtility::CreateItemL(
- const MCLFItem& aCLFItem,
- const TDesC8& aParentId ) const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
-
- TPtrC fullFileName;
- TInt err( aCLFItem.GetField( ECLFFieldIdFileNameAndPath,
- fullFileName ));
-
- TInt32 filesize( 0 );
- TInt err1( aCLFItem.GetField( ECLFFieldIdFileSize, filesize ) );
-
- CUpnpItem* newItem( NULL );
-
- if ( !err && !err1 && filesize )
- {
- newItem = CreateItemL( fullFileName, aParentId );
- }
- else
- {
- __LOG8_1( "MCLFItem ECLFFieldIdFileNameAndPath err= %d", err );
- __LOG8_1( "MCLFItem ECLFFieldIdFileSize err= %d", err1 );
- }
-
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- return newItem;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::CreateItemL
-// Update the basic fields, based on list of filenames
-// --------------------------------------------------------------------------
-//
-CUpnpItem* CUpnpContentMetadataUtility::CreateItemL(
- const TDesC& aFullFilename,
- const TDesC8& aParentId
- ) const
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
-
- CUpnpItem* newItem( NULL );
-
- TFileName path( aFullFilename );
- TBool isProtected( EFalse );
- TRAPD( err,
- isProtected = UPnPFileUtility::IsFileProtectedL( path ) );
-
- if ( !isProtected && !err )
- {
- // title
- HBufC8* itemName( NULL );
- iMetaDataUtility->LoadTitleL( path );
- if( iMetaDataUtility->Title().Length() > 0 )
- {
- itemName = UpnpString::FromUnicodeL(
- iMetaDataUtility->Title() );
- }
- else
- {
- // If does not find the title, using filename instead
- TParse fileParser;
- fileParser.Set( path, NULL, NULL );
- itemName = UpnpString::FromUnicodeL( fileParser.Name() );
- }
-
- if ( itemName )
- {
- CleanupStack::PushL( itemName );
-
- newItem = CUpnpItem::NewL();
- CleanupStack::PushL( newItem );
- newItem->SetTitleL( *itemName );
- newItem->SetObjectClassL( KClassItem );
- newItem->SetParentIdL( aParentId );
- CleanupStack::Pop( newItem );
-
- CleanupStack::PopAndDestroy( itemName );
- }
- }
- else
- {
- __LOG8_1( "UPnPFileUtility::IsFileProtectedL err= %d", err );
- }
-
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- return newItem;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::RefreshOngoing() const
-// Used to check if refresh is ongoing.
-// --------------------------------------------------------------------------
-//
-
-TBool CUpnpContentMetadataUtility::RefreshOngoing() const
- {
- return iRefreshOngoing;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::UpdateMetaDataL
-// Updates meta data for the item
-// --------------------------------------------------------------------------
-//
-TBool CUpnpContentMetadataUtility::UpdateMetadataL(
- const TUpnpMediaType& aMediaType,
- CUpnpItem* aItem,
- const TDesC& aFileName )
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
-
- // 1st use correct model according to item type
- MCLFItemListModel* model = NULL;
- switch( aMediaType )
- {
- case EMusicFile :
- {
- model = iMusicModel;
- break;
- }
- case EVideoFile :
- {
- model = iVideoModel;
- break;
- }
- case EPhotoFile :
- {
- model = iImageModel;
- break;
- }
- default:
- {
- break;
- }
- }
- // Then find the CLF item and update data from it
- TBool found = EFalse;
- TBool end = EFalse;
- TInt beginLoop = iClfIndex;
-
- // increment. If passed item count, start from beginning.
- iClfIndex = 0;
- beginLoop = -1;
-
- while ( model->ItemCount() &&
- !found &&
- !end )
- {
- // Get the item
- const MCLFItem& myItem = model->Item( iClfIndex );
- TPtrC fileName;
- TInt error = myItem.GetField( ECLFFieldIdFileNameAndPath,
- fileName );
-
- // if there was no error and file name matched
- if ( !error && aFileName.CompareF( fileName ) == 0 )
- {
- found = ETrue;
-
- // Get the mediatype
- TInt32 mediaType;
- TInt errorType = myItem.GetField( ECLFFieldIdMediaType,
- mediaType );
- // If it is music file, fill the meta data for it
- if ( !errorType && mediaType == ECLFMediaTypeMusic )
- {
- // Get title, artist, album & genre tag info of the item
- // Test update the class as it is in 1.x
- aItem->SetObjectClassL(
- KClassAudioMusicTrack );
-
- TPtrC songArtist;
- TInt errorArtist( myItem.GetField( ECLFFieldIdArtist,
- songArtist ) );
- if ( !errorArtist )
- {
- CUpnpElement* elArtist = CUpnpElement::NewL(
- KElementArtist );
- CleanupStack::PushL( elArtist );
- HBufC8* artist = UpnpString::FromUnicodeL(
- songArtist );
- CleanupStack::PushL( artist );
- elArtist->SetValueL( *artist );
- // UPnP stack needs filepath
- elArtist->SetFilePathL( aFileName );
- CleanupStack::PopAndDestroy( artist );
- aItem->AddElementL( elArtist ); // transfer own..
- CleanupStack::Pop( elArtist );
- }
- TPtrC songAlbum;
- TInt errorAlbum( myItem.GetField( ECLFFieldIdAlbum,
- songAlbum ) );
- if ( !errorAlbum )
- {
- CUpnpElement* elAlbum = CUpnpElement::NewL(
- KElementAlbum );
- CleanupStack::PushL( elAlbum );
- HBufC8* album = UpnpString::FromUnicodeL( songAlbum );
-
- CleanupStack::PushL( album );
- elAlbum->SetValueL( *album );
- // UPnP stack needs filepath
- elAlbum->SetFilePathL( aFileName );
- CleanupStack::PopAndDestroy( album );
- aItem->AddElementL( elAlbum ); // transfer own..
- CleanupStack::Pop( elAlbum );
- }
- TPtrC songGenre;
- TInt errorGenre( myItem.GetField( ECLFFieldIdGenre,
- songGenre ) );
- if ( !errorGenre )
- {
- CUpnpElement* elGenre = CUpnpElement::NewL(
- KElementGenre );
- CleanupStack::PushL( elGenre );
- HBufC8* genre = UpnpString::FromUnicodeL( songGenre );
-
- CleanupStack::PushL( genre );
- elGenre->SetValueL( *genre );
- // UPnP stack needs filepath
- elGenre->SetFilePathL( aFileName );
- CleanupStack::PopAndDestroy( genre );
- aItem->AddElementL( elGenre ); // transfer own..
- CleanupStack::Pop( elGenre );
-
- }
- }
- else if ( !errorType && mediaType == ECLFMediaTypeImage )
- {
- // Just set correct object class
- aItem->SetObjectClassL( KImageItemObjectClass );
- }
- else if ( !errorType && mediaType == ECLFMediaTypeVideo )
- {
- // Just set correct object class
- aItem->SetObjectClassL( KVideoItemObjectClass );
- }
-
- // Below this happens to ALL media types
- TTime dateTime;
- TInt errorDate( myItem.GetField( ECLFFieldIdFileDate,
- dateTime ) );
-
- if ( !errorDate )
- {
- HBufC* date = NULL;
- TRAP( errorDate, date =
- UPnPCommonUtils::TTimeToUPnPDateL(dateTime));
-
-
- if(date && errorDate == KErrNone)
- {
- CleanupStack::PushL( date );
-
- CUpnpElement* elDate = CUpnpElement::NewL(
- KElementDate );
- CleanupStack::PushL( elDate );
-
-
- HBufC8* date8 = UpnpString::FromUnicodeL( *date );
- CleanupStack::PushL( date8 );
- elDate->SetValueL( *date8 );
-
- CleanupStack::PopAndDestroy( date8 );
-
- elDate->SetFilePathL( aFileName );
- aItem->AddElementL( elDate ); // transfer own..
-
- CleanupStack::Pop( elDate );
- CleanupStack::Pop( date );
- }
-
-
- if(date)
- {
- delete date;
- date = NULL;
- }
- }
-
- }
- else
- {
- // The item was not found
- if ( iClfIndex != beginLoop )
- {
- if ( ++iClfIndex >= model->ItemCount() )
- {
- iClfIndex = 0;
- end = ETrue;
- }
- }
- else
- {
- end = ETrue;
- __LOG("end=ETRue");
- }
- }
- } // while
- if( found )
- {
- __LOG("CUpnpContentMetadataUtility:: item found");
- }
- else
- {
- __LOG("CUpnpContentMetadataUtility:: item not found");
- }
-
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- return found;
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::ClearPostFiltersL
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-void CUpnpContentMetadataUtility::ClearPostFiltersL()
- {
- __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
- //clear previous filtering
- iCollectionModel->SetPostFilter( NULL );
-
- // Delete old post filter if any
-
- delete iPostFilter;
- iPostFilter = NULL;
-
- iCollectionModel->RefreshL( ECLFRefreshPostFilter );
-
- // Set the default postfilter
- iPostFilter = CUpnpPostFilter::NewL( ECLFFieldIdCollectionName,
- KNullDesC, ETrue );
- iCollectionModel->SetPostFilter( iPostFilter );
-
- iCollectionModel->RefreshL( ECLFRefreshPostFilter );
- __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
- }
-
-// --------------------------------------------------------------------------
-// CUpnpContentMetadataUtility::SetCallback
-// ( other items are commented in header )
-// --------------------------------------------------------------------------
-void CUpnpContentMetadataUtility::SetCallback(
- MUpnpMetadataObserver* aObserver )
- {
- iHandler = aObserver;
-
- }
-
-// End of File
+/*
+* Copyright (c) 2006-2007 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: CUpnpContentMetadataUtility class implementation
+ *
+*/
+
+
+
+
+
+
+// INCLUDE FILES
+// System
+#include <e32base.h>
+#include <MCLFContentListingEngine.h>
+#include <ContentListingFactory.h>
+#include <MCLFItemListModel.h>
+#include <CLFContentListing.hrh>
+#include <MCLFItem.h>
+#include <f32file.h>
+// Internal
+#include "upnpcontentmetadatautility.h"
+#include "upnpcontentserverdefs.h"
+
+_LIT( KComponentLogfile, "contentserver.txt");
+#include "upnplog.h"
+
+// CONSTANTS
+const TInt KMediaTypeArrGranularity(1);
+
+using namespace UpnpContentServer;
+
+// ============================ MEMBER FUNCTIONS ============================
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::CUpnpContentMetadataUtility()
+// Default constructor
+// --------------------------------------------------------------------------
+//
+CUpnpContentMetadataUtility::CUpnpContentMetadataUtility()
+ {
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::ConstructL()
+// ConstructL
+// --------------------------------------------------------------------------
+//
+void CUpnpContentMetadataUtility::ConstructL()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ // Create iWait
+ iWait = new (ELeave) CActiveSchedulerWait;
+
+ // Create Content Listing Engine
+ iEngine = ContentListingFactory::NewContentListingEngineLC();
+ CleanupStack::Pop(); // iEngine
+
+ // Create list models
+ iMusicModel = iEngine->CreateListModelLC( *this );
+ CleanupStack::Pop(); // iMusicModel
+ iImageModel = iEngine->CreateListModelLC( *this );
+ CleanupStack::Pop(); // iImageModel
+ iVideoModel = iEngine->CreateListModelLC( *this );
+ CleanupStack::Pop(); // iVideoModel
+
+ // Set music media type filter to CLF
+ RArray<TInt> musicArray( KMediaTypeArrGranularity );
+ CleanupClosePushL( musicArray );
+ musicArray.AppendL( ECLFMediaTypeMusic );
+ iMusicModel->SetWantedMediaTypesL( musicArray.Array() );
+ CleanupStack::PopAndDestroy( &musicArray );
+
+ // Set image media type filter to CLF
+ RArray<TInt> imageArray( KMediaTypeArrGranularity );
+ CleanupClosePushL( imageArray );
+ imageArray.AppendL( ECLFMediaTypeImage );
+ iImageModel->SetWantedMediaTypesL( imageArray.Array() );
+ CleanupStack::PopAndDestroy( &imageArray );
+
+ // Set video media type filter to CLF
+ RArray<TInt> videoArray( KMediaTypeArrGranularity );
+ CleanupClosePushL( videoArray );
+ videoArray.AppendL( ECLFMediaTypeVideo );
+ iVideoModel->SetWantedMediaTypesL( videoArray.Array() );
+ CleanupStack::PopAndDestroy( &videoArray );
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::NewL()
+// 2 phased constructor
+// --------------------------------------------------------------------------
+//
+CUpnpContentMetadataUtility* CUpnpContentMetadataUtility::NewL()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ CUpnpContentMetadataUtility* self
+ = new( ELeave ) CUpnpContentMetadataUtility;
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::~CUpnpContentMetadataUtility()
+// Default destructor
+// --------------------------------------------------------------------------
+//
+CUpnpContentMetadataUtility::~CUpnpContentMetadataUtility()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ delete iMusicModel;
+ delete iImageModel;
+ delete iVideoModel;
+ delete iEngine;
+ delete iWait;
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::HandleOperationEventL
+// Callback implementation for MCLFOperationObserver
+// --------------------------------------------------------------------------
+//
+void CUpnpContentMetadataUtility::HandleOperationEventL(
+ TCLFOperationEvent aOperationEvent,
+ TInt /*aError*/ )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ // Waiting is stopped when an event for refresh completion is received
+ if( aOperationEvent == ECLFRefreshComplete )
+ {
+ // stop iWait
+ if ( iWait->IsStarted() )
+ {
+ iWait->AsyncStop();
+ }
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::MusicFiles
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+const MCLFItemListModel* CUpnpContentMetadataUtility::MusicFiles()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ MCLFItemListModel* ret = iMusicModel;
+ TRAPD( err, RefreshModelL( ECLFMediaTypeMusic ) );
+ if ( !err )
+ {
+ WaitForRefreshToComplete();
+ }
+ else
+ {
+ ret = NULL;
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::ImageFiles
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+const MCLFItemListModel* CUpnpContentMetadataUtility::ImageFiles()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ MCLFItemListModel* ret = iImageModel;
+ TRAPD( err, RefreshModelL( ECLFMediaTypeImage ) );
+ if ( !err )
+ {
+ WaitForRefreshToComplete();
+ }
+ else
+ {
+ ret = NULL;
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::VideoFiles
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+//
+const MCLFItemListModel* CUpnpContentMetadataUtility::VideoFiles()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ MCLFItemListModel* ret = iVideoModel;
+ TRAPD( err, RefreshModelL( ECLFMediaTypeVideo ) );
+ if ( !err )
+ {
+ WaitForRefreshToComplete();
+ }
+ else
+ {
+ ret = NULL;
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ return ret;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::RefreshModelL
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+void CUpnpContentMetadataUtility::RefreshModelL(
+ TCLFMediaType aCLFMediaType )
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+ switch ( aCLFMediaType )
+ {
+ case ECLFMediaTypeImage:
+ {
+ iImageModel->RefreshL();
+ break;
+ }
+ case ECLFMediaTypeVideo:
+ {
+ iVideoModel->RefreshL();
+ break;
+ }
+ case ECLFMediaTypeMusic:
+ {
+ iMusicModel->RefreshL();
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotSupported );
+ break;
+ }
+ }
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpContentMetadataUtility::WaitForRefreshToComplete
+// ( other items are commented in header )
+// --------------------------------------------------------------------------
+void CUpnpContentMetadataUtility::WaitForRefreshToComplete()
+ {
+ __LOG8_1( "%s begin.", __PRETTY_FUNCTION__ );
+
+ // start iWait
+ if ( !iWait->IsStarted() )
+ {
+ iWait->Start();
+ }
+
+ __LOG8_1( "%s end.", __PRETTY_FUNCTION__ );
+ }
+
+// End of File