diff -r 000000000000 -r a2952bb97e68 mmappcomponents/harvester/filehandler/src/mpxplaylistscanner.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappcomponents/harvester/filehandler/src/mpxplaylistscanner.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,335 @@ +/* +* Copyright (c) 2006 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: Class to handle playlist extraction +* +*/ + + +#include +#include +#include +#include +#include +#include +#include "mpxplaylistscanner.h" +#include "mpxplaylistscanobserver.h" +#include "mpxfilescanstateobserver.h" + +// CONSTANTS +const TInt KExtractionCount = 2; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CMPXPlaylistScanner::CMPXPlaylistScanner( MMPXPlaylistScanObserver& aObs, + MMPXFileScanStateObserver& aStateObs, + RPointerArray& aTypes ) : + iObserver( aObs ), + iStateObserver( aStateObs ), + iSupportedTypes(aTypes) + { + } + + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::ConstructL() + { + iPlEngine = CMPXPlaylistEngine::NewL( *this ); + iPlList = new(ELeave) CDesCArrayFlat(1); // granularity + iPlUpdateList = new(ELeave) CDesCArrayFlat(1); // granularity + + iPropArray = CMPXMediaArray::NewL(); + iUpdatePropArray = CMPXMediaArray::NewL(); + } + + +// --------------------------------------------------------------------------- +// Two Phased Constructor +// --------------------------------------------------------------------------- +// +CMPXPlaylistScanner* CMPXPlaylistScanner::NewL( + MMPXPlaylistScanObserver& aObs, + MMPXFileScanStateObserver& aStateObs, + RPointerArray& aTypes ) + { + CMPXPlaylistScanner* self = new(ELeave) CMPXPlaylistScanner( aObs, + aStateObs, + aTypes ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Virtual destructor +// --------------------------------------------------------------------------- +// +CMPXPlaylistScanner::~CMPXPlaylistScanner() + { + if( iPlList ) + { + iPlList->Reset(); + delete iPlList; + } + if( iPlUpdateList ) + { + iPlUpdateList->Reset(); + delete iPlUpdateList; + } + + if( iPropArray ) + { + iPropArray->Reset(); + } + delete iPropArray; + + if( iUpdatePropArray ) + { + iUpdatePropArray->Reset(); + } + delete iUpdatePropArray; + + if( iPlEngine ) + { + iPlEngine->CancelRequests(); + } + delete iPlEngine; + } + +// --------------------------------------------------------------------------- +// Start the playlist scanning procedure +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::ScanL() + { + iNewPlPending = iPlList->Count(); + iUpdatePlPending = iPlUpdateList->Count(); + + // Add all files in the list to the playlist engine queue. + // + if( iNewPlPending || iUpdatePlPending ) + { + for( TInt i=0; iInternalizePlaylistL( (*iPlList)[i] ); + } + for( TInt i=0; iInternalizePlaylistL( (*iPlUpdateList)[i] ); + } + iExtracting = ETrue; + } + // No files to extract + // + else + { + iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanPlaylists, + KErrNone ); + } + } + +// --------------------------------------------------------------------------- +// Cancel the playlist scanning procedure +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::Cancel() + { + if( iExtracting ) + { + iPlEngine->CancelRequests(); + iExtracting = EFalse; + TRAP_IGNORE(iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanPlaylists, + KErrCancel ); + ); + } + } + +// --------------------------------------------------------------------------- +// Reset the object +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::Reset() + { + iPlList->Reset(); + iPlUpdateList->Reset(); + iPropArray->Reset(); + iUpdatePropArray->Reset(); + } + +// --------------------------------------------------------------------------- +// Add a file to the list to be extracted +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::AddPlaylistToScanL( const TDesC& aFile ) + { + iPlList->AppendL( aFile ); + } + +// --------------------------------------------------------------------------- +// Add a file to the list to be updated +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::AddUpdatedPlaylistToScanL( const TDesC& aFile ) + { + iPlUpdateList->AppendL( aFile ); + } + +// --------------------------------------------------------------------------- +// Handles playlist import +// Note: aCompleted is not in use for Increment 8, for future usage. +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::HandlePlaylistL( CMPXMedia* aPlaylist, + const TInt aError, + const TBool /*aCompleted*/ ) + { + // Only add parsable playlists + // + if( aError == KErrNone ) + { + // We take ownership of the media object + // + CleanupStack::PushL( aPlaylist ); + + // Find what collection this belongs to + // + const TDesC& file = aPlaylist->ValueText( + TMPXAttribute( KMPXMediaIdGeneral, EMPXMediaGeneralUri)); + TParsePtrC parse( file ); + TInt index(KErrNotFound); + TInt count( iSupportedTypes.Count() ); + for (TInt i=0; i Extensions(); + if (!exts.FindIsq(parse.Ext(), index2)) + { // found + index = i; + break; + } + } + + // Found? + if( index == KErrNotFound ) + { + // Unsupported by a collection + // + CleanupStack::PopAndDestroy( aPlaylist ); + } + else + { + // Set collection ID and add to array + // + aPlaylist->SetTObjectValueL( TMPXAttribute( KMPXMediaIdGeneral, + EMPXMediaGeneralCollectionId), + iSupportedTypes[index]->Uid() ); + if( iNewPlPending ) + { + iPropArray->AppendL( aPlaylist ); // owned by array + } + else + { + iUpdatePropArray->AppendL( aPlaylist ); // owned by array + } + CleanupStack::Pop( aPlaylist ); + } + } + else // an error occured + { + // Playlist engine should have set this to NULL + // (Just in case) + delete aPlaylist; + } + + if( iNewPlPending ) + { + iNewPlPending--; + } + else // Some update ones pending + { + iUpdatePlPending--; + } + + // All done! + // + TInt pending = iNewPlPending + iUpdatePlPending; + if( pending == 0 && iExtracting ) + { + CompleteFilesL(); + iExtracting = EFalse; + + iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanPlaylists, + KErrNone ); + } + // Enough to send to the collection + // + else if( iPropArray->Count() + iUpdatePropArray->Count() + == KExtractionCount ) + { + CompleteFilesL(); + } + } //lint !e961 + +// --------------------------------------------------------------------------- +// Handles Playlist export to a file +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::HandlePlaylistL(const TDesC& /*aPlaylistUri*/, + const TInt /*aError*/) + { + // not used + } + +// --------------------------------------------------------------------------- +// Checks if a file is a playlist file +// --------------------------------------------------------------------------- +// +TBool CMPXPlaylistScanner::IsPlaylistFileL( const TDesC& aFile ) + { + return iPlEngine->IsPlaylistL( aFile ); + } + +// --------------------------------------------------------------------------- +// Upload the next list of files +// --------------------------------------------------------------------------- +// +void CMPXPlaylistScanner::CompleteFilesL() + { + TInt err(KErrNone); + if( iPropArray->Count() ) + { + TRAP( err, iObserver.AddPlaylistToCollectionL( *iPropArray ) ); + } + if( iUpdatePropArray->Count() ) + { + TRAP( err, iObserver.UpdatePlaylistToCollectionL( *iUpdatePropArray ) ); + } + + if( err != KErrNone ) + { + // Cancel requests and notify end + iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanPlaylists, + err ); + iPlEngine->CancelRequests(); + } + Reset(); + } +