--- 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<CMPXCollectionType>& 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<HBufC>* 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<HBufC>* CMPXMetadataScanner::GetSource()
+ {
+ MPX_FUNC("CMPXMetadataScanner::GetSource()");
TExtractType curType = (TExtractType) iExtractType;
-
- // Pointer re-direction to generalize extraction
- RPointerArray<HBufC>* 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; i<KLoopCount; ++i )
- {
- CMPXMedia* media(NULL);
-
- // TRAP to keep scanning if 1 file fails
- TRAPD( err, iExtractor->CreateMediaL( *(*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();
+ }