diff -r 51035f0751c2 -r 4740b34b83ce mmappcomponents/harvester/filehandler/src/mpxmetadatascanner.cpp --- a/mmappcomponents/harvester/filehandler/src/mpxmetadatascanner.cpp Wed Apr 14 16:28:17 2010 +0300 +++ b/mmappcomponents/harvester/filehandler/src/mpxmetadatascanner.cpp Tue Apr 27 17:09:22 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description: Active object to extract metadata -* Version : %version: da1mmcf#16.2.3.1.5 % +* Version : %version: da1mmcf#16.2.3.1.6 % * */ @@ -44,8 +44,9 @@ CMPXMetadataScanner::CMPXMetadataScanner( MMPXMetadataScanObserver& aObs, MMPXFileScanStateObserver& aStateObs ) : CActive( EPriorityNull ), + iExtractType( EMaxFile ), iObserver( aObs ), - iStateObserver( aStateObs ) + iStateObserver( aStateObs ) { CActiveScheduler::Add( this ); } @@ -60,8 +61,7 @@ RPointerArray& aTypesAry ) { iExtractor = CMPXMetadataExtractor::NewL( aFs, aAppArc, aTypesAry ); - iNewFileProps = CMPXMediaArray::NewL(); - iModifiedFileProps = CMPXMediaArray::NewL(); + iTargetProps = CMPXMediaArray::NewL(); } @@ -114,8 +114,7 @@ iNewFiles.Close(); iModifiedFiles.Close(); - delete iNewFileProps; - delete iModifiedFileProps; + delete iTargetProps; delete iExtractor; } @@ -128,14 +127,7 @@ { iNewFiles.ResetAndDestroy(); iModifiedFiles.ResetAndDestroy(); - if(iNewFileProps) - { - iNewFileProps->Reset(); - } - if(iModifiedFileProps) - { - iModifiedFileProps->Reset(); - } + iTargetProps->Reset(); } // --------------------------------------------------------------------------- @@ -144,20 +136,20 @@ // void CMPXMetadataScanner::Start() { - MPX_DEBUG1("MPXMetadataScanner::StartL <---"); + MPX_FUNC("MPXMetadataScanner::StartL()"); if( !IsActive() ) { // Setup iAryPos = 0; iExtractType = ENewFiles; iExtracting = ETrue; - + iTargetProps->Reset(); + // Set Active iStatus = KRequestPending; SetActive(); TRequestStatus* status = &iStatus; User::RequestComplete( status, KErrNone ); - MPX_DEBUG1("MPXMetadataScanner::StartL --->"); } } // --------------------------------------------------------------------------- @@ -166,9 +158,8 @@ // void CMPXMetadataScanner::Stop() { - MPX_DEBUG1("MPXMetadataScanner::Stop <---"); + MPX_FUNC("MPXMetadataScanner::Stop()"); DoCancel(); - MPX_DEBUG1("MPXMetadataScanner::Stop --->"); } // --------------------------------------------------------------------------- @@ -177,6 +168,7 @@ // void CMPXMetadataScanner::AddNewFileToScanL( const TDesC& aFile ) { + MPX_FUNC("MPXMetadataScanner::AddNewFileToScanL()"); HBufC* file = aFile.AllocLC(); iNewFiles.AppendL( file ); CleanupStack::Pop( file ); @@ -188,6 +180,7 @@ // void CMPXMetadataScanner::AddModifiedFileToScanL( const TDesC& aFile ) { + MPX_FUNC("MPXMetadataScanner::AddModifiedFileToScanL()"); HBufC* file = aFile.AllocLC(); iModifiedFiles.AppendL( file ); CleanupStack::Pop( file ); @@ -199,6 +192,7 @@ // CMPXMedia* CMPXMetadataScanner::ExtractFileL( const TDesC& aFile ) { + MPX_FUNC("MPXMetadataScanner::ExtractFileL()"); CMPXMedia* media; iExtractor->CreateMediaL( aFile, media ); return media; @@ -210,10 +204,12 @@ // void CMPXMetadataScanner::DoCancel() { + MPX_FUNC("MPXMetadataScanner::DoCancel()"); if( iExtracting ) { - // Callback to observer + iExtractor->CancelRequest(); Reset(); + // Callback to observer TRAP_IGNORE( iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanMetadata, KErrCancel ) ); iExtracting = EFalse; @@ -226,29 +222,13 @@ // void CMPXMetadataScanner::RunL() { + MPX_FUNC("CMPXMetadataScanner::RunL()"); if ( iExtracting ) { - TBool done(EFalse); - TRAPD( err, done = DoExtractL() ); - if ( !iExtracting ) - { - // If DoCancel() was called during DoExtractL(), do nothing. - MPX_DEBUG1("CMPXMetadataScanner::RunL - Cancel during RunL"); - } - else if( KErrNone != err || done ) + TRAPD( err, DoExtractL() ); + if ( err ) { - // Callback to observer - TRAP_IGNORE( iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanMetadata, - err ) ); - iExtracting = EFalse; - } - else - { - MPX_DEBUG1("CMPXMetadataScanner::RunL -- Run again"); - iStatus = KRequestPending; - SetActive(); - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrNone ); + MetadataScannerComplete( err ); } } } @@ -257,98 +237,185 @@ // Extract metadata // --------------------------------------------------------------------------- // -TBool CMPXMetadataScanner::DoExtractL() +void CMPXMetadataScanner::DoExtractL() + { + MPX_FUNC("CMPXMetadataScanner::DoExtractL()"); + + RPointerArray* source = GetSource(); + if ( source->Count() ) + { + // Call asynchronous CreateMedia to get metadata. + iExtractor->CreateMediaAsyncL( *(*source)[iAryPos], this ); + } + else + { + // Source array is empty, go to next array. + MPX_DEBUG2("CMPXMetadataScanner::DoExtractL Source array is empty ExtractType = %d.", iExtractType); + iAryPos = 0; + iExtractType++; + RunAgain(); + } + } + +// --------------------------------------------------------------------------- +// Callback for CreateMediaAsyncL +// --------------------------------------------------------------------------- +// +void CMPXMetadataScanner::HandleCreateMediaComplete( CMPXMedia* aMedia, TInt aError ) { - MPX_DEBUG1("CMPXMetadataScanner::DoExtractL <---"); - TBool done(EFalse); + MPX_FUNC("CMPXMetadataScanner::HandleCreateMediaComplete()"); + MPX_DEBUG2("CMPXMetadataScanner::HandleCreateMediaComplete error = %d", aError); + TInt err = KErrNone; + + // Scanning cancelled + if ( !iExtracting ) + { + delete aMedia; + return; + } + + // Add media to target array. + if ( ( aError == KErrNone ) && + ( aMedia != NULL ) ) + { + TRAP( err, iTargetProps->AppendL( aMedia ) ); + if ( err ) + { + delete aMedia; + } + } + + iAryPos++; + if( iAryPos >= GetSource()->Count() ) + { + // Finished with this array, go to the next array. + iAryPos = 0; + TRAP( err, AddToCollectionL() ); + if ( err ) + { + MetadataScannerComplete( err ); + } + iExtractType++; + } + else + { + // Batch update collection DBs. + if ( iTargetProps->Count() >= KLoopCount ) + { + TRAP( err, AddToCollectionL() ); + if ( err ) + { + MetadataScannerComplete( err ); + } + } + } + + RunAgain(); + } + +// --------------------------------------------------------------------------- +// Get source array +// --------------------------------------------------------------------------- +// +RPointerArray* CMPXMetadataScanner::GetSource() + { + MPX_FUNC("CMPXMetadataScanner::GetSource()"); TExtractType curType = (TExtractType) iExtractType; - - // Pointer re-direction to generalize extraction - RPointerArray* source; - CMPXMediaArray* mptarget; + if( curType == ENewFiles ) { - source = &iNewFiles; - mptarget = iNewFileProps; + return &iNewFiles; } else if( curType == EModFiles ) { - source = &iModifiedFiles; - mptarget = iModifiedFileProps; + return &iModifiedFiles; } - else // All done! - { - return ETrue; - } - - // Process at most KLoopCount number of files - // - mptarget->Reset(); - if( source->Count() != 0 ) + else + return NULL; + } + +// --------------------------------------------------------------------------- +// Is metadata scanner done +// --------------------------------------------------------------------------- +// +TBool CMPXMetadataScanner::IsDone() + { + MPX_FUNC("CMPXMetadataScanner::IsDone()"); + TExtractType curType = (TExtractType) iExtractType; + + TBool done = EFalse; + if ( curType >= EMaxFile ) { - for( TInt i=0; iCreateMediaL( *(*source)[iAryPos], media ) ); - if ( !iExtracting ) - { - // In case DoCancel() was called while processing iExtractor->CreateMediaL - MPX_DEBUG1("CMPXMetadataScanner::DoExtractL - Cancel during CreateMediaL"); - delete media; - return ETrue; - } - - if( err == KErrNone ) - { - CleanupStack::PushL( media ); - mptarget->AppendL( media ); - CleanupStack::Pop( media ); - } - - iAryPos++; - if( iAryPos == source->Count() ) - { - iAryPos = 0; - iExtractType++; - break; - } - } + done = ETrue; + } + return done; + } + +// --------------------------------------------------------------------------- +// Run Active Object again +// --------------------------------------------------------------------------- +// +void CMPXMetadataScanner::RunAgain() + { + MPX_FUNC("CMPXMetadataScanner::RunAgain()"); + if ( IsDone() ) + { + MetadataScannerComplete( KErrNone ); } - else // No item in the array + else { - iAryPos = 0; - iExtractType++; + MPX_DEBUG1("CMPXMetadataScanner::RunAgain -- Run again"); + iStatus = KRequestPending; + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); } + } + +// --------------------------------------------------------------------------- +// Add metadata to collection +// --------------------------------------------------------------------------- +// +void CMPXMetadataScanner::AddToCollectionL() + { + MPX_FUNC("CMPXMetadataScanner::AddToCollectionL()"); + TExtractType curType = (TExtractType) iExtractType; - // After extraction, get observer to add files to the collection - // switch( curType ) { case ENewFiles: { - if( iNewFileProps->Count() ) + if( iTargetProps->Count() ) { - iObserver.AddFilesToCollectionL( *iNewFileProps ); + iObserver.AddFilesToCollectionL( *iTargetProps ); } break; } case EModFiles: { - if( iModifiedFileProps->Count() ) + if( iTargetProps->Count() ) { - iObserver.UpdatesFilesInCollectionL( *iModifiedFileProps ); + iObserver.UpdatesFilesInCollectionL( *iTargetProps ); } break; } - case EMaxFile: // All done. - done = ETrue; - break; default: ASSERT(0); } - - MPX_DEBUG1("CMPXMetadataScanner::DoExtractL --->"); - return done; + iTargetProps->Reset(); } + +// --------------------------------------------------------------------------- +// Complete metadata scanner +// --------------------------------------------------------------------------- +// +void CMPXMetadataScanner::MetadataScannerComplete( TInt aError ) + { + MPX_FUNC("CMPXMetadataScanner::MetadataScannerCompleteL()"); + MPX_DEBUG2("CMPXMetadataScanner::MetadataScannerCompleteL error = %d", aError); + + // Callback to observer + TRAP_IGNORE( iStateObserver.HandleScanStateCompleteL( MMPXFileScanStateObserver::EScanMetadata, aError ) ); + iExtracting = EFalse; + Reset(); + }