mmappcomponents/harvester/filehandler/src/mpxplaylistscanner.cpp
changeset 0 a2952bb97e68
--- /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();
+    }
+