--- /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 <e32base.h>
+#include <mpxplaylistengine.h>
+#include <mpxmedia.h>
+#include <mpxmediaarray.h>
+#include <mpxcollectiontype.h>
+#include <mpxmediageneraldefs.h>
+#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<CMPXCollectionType>& 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<CMPXCollectionType>& 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; i<iNewPlPending; ++i )
+ {
+ iPlEngine->InternalizePlaylistL( (*iPlList)[i] );
+ }
+ for( TInt i=0; i<iUpdatePlPending; ++i )
+ {
+ iPlEngine->InternalizePlaylistL( (*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 <count; ++i)
+ {
+ TInt index2(KErrNotFound);
+ const CDesCArray& exts = iSupportedTypes[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();
+ }
+