mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp
branchRCL_3
changeset 24 6c1dfe4da5dd
parent 23 e42293e811d8
child 25 63223d4fd956
--- a/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Thu Aug 19 10:24:28 2010 +0300
+++ b/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp	Tue Aug 31 15:41:40 2010 +0300
@@ -12,7 +12,7 @@
 * Contributors:
 *
 * Description:  Extracts metadata from a file
-*  Version     : %version: da1mmcf#38.1.4.2.6.1.15 % << Don't touch! Updated by Synergy at check-out.
+*  Version     : %version: da1mmcf#38.1.4.2.6.1.5.3.8 % << Don't touch! Updated by Synergy at check-out.
 *
 */
 
@@ -52,7 +52,7 @@
 #ifdef RD_MPX_TNM_INTEGRATION
 _LIT( KImageFileType, "image/jpeg" );
 const TInt KMPXTimeoutTimer = 3000000; // 3 seconds
-const TInt KMPXMaxThumbnailRequest = 2; 
+const TInt KMPXMaxThumbnailRequest = 2;
 #endif //RD_MPX_TNM_INTEGRATION
 
 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
@@ -186,10 +186,10 @@
     aNewProperty = NULL;
     iFileName = aFile;
     iMetadataOnly = aMetadataOnly;
-    
+
     // populate the task array
     AddTasksL();
-    
+
     // execute all tasks in the array
     while ( iArrayTasks.Count() )
         {
@@ -211,10 +211,10 @@
                 }
             break;
             }
-        
+
         iArrayTasks.Remove( 0 );
         }
-    
+
     aNewProperty = iMedia;
     iMedia = NULL;  // ownership transferred.
     CleanUp();
@@ -236,9 +236,6 @@
     // Album
     aMediaProp.SetTextValueL( KMPXMediaMusicAlbum,
                               KNullDesC );
-    // Year
-    aMediaProp.SetTObjectValueL<TInt64>( KMPXMediaMusicYear,
-                                         (TInt64) 0 );
     // Track
     aMediaProp.SetTextValueL( KMPXMediaMusicAlbumTrack,
                               KNullDesC );
@@ -254,6 +251,10 @@
     // URL
     aMediaProp.SetTextValueL( KMPXMediaMusicURL,
                               KNullDesC );
+    // AlbumArtist
+    aMediaProp.SetTextValueL( KMPXMediaMusicAlbumArtist,
+                              KNullDesC );
+    
     }
 
 // ---------------------------------------------------------------------------
@@ -267,20 +268,20 @@
     const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
     HBufC8* mimeType8 = HBufC8::NewLC( mimeType.Length() );
     mimeType8->Des().Append( mimeType );
-    
+
     // Continue to extract metadata even if fail.
     MPX_TRAPD( metadataerror, iMetadataUtility->OpenFileL( iFile, *mimeType8 ) );
     CleanupStack::PopAndDestroy( mimeType8 );
-    
+
     // Get MetadataUtility Container
     const CMetaDataFieldContainer& metaCont = iMetadataUtility->MetaDataFieldsL();
 
     // Get DRM data
     // Need the protected flag from metadataUtility Container
     MPX_TRAPD( drmerror, SetDrmMediaPropertiesL( metaCont ) );
-    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, result=%d getting drm data", 
+    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, result=%d getting drm data",
             drmerror );
-        
+
     // Get metadata fields
     TInt count( metaCont.Count() );
     for( TInt i=0; i<count; ++i )
@@ -289,19 +290,19 @@
 
         HBufC* value = NULL;
         metaCont.FieldIdAt( i, fieldType );  // get the field type
-        
+
         // get the value, except for album art
         if ( fieldType != EMetaDataJpeg )
            {
             MPX_TRAPD( err, value = metaCont.At( i, fieldType ).AllocL() );
            if ( KErrNone != err )
                {
-               MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error = %i", err);           
+               MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error = %i", err);
                continue;
-               }     
+               }
            CleanupStack::PushL( value );
            }
-        
+
         switch( fieldType )
             {
             case EMetaDataSongTitle:
@@ -409,70 +410,82 @@
                                       *value );
                 break;
                 }
-            case EMetaDataDuration:     
-                {                  
+            case EMetaDataDuration:
+                {
                 const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
-                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);   
-                
+                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);
+
                 // Verify if WMA, get the duration
                 if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
                     {
-                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");                         
+                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");
 
                     // Perform the duration conversion
                     TLex lexer( *value );
                     TInt32 duration ( 0 );
-                    lexer.Val( duration );   // [second]      
+                    lexer.Val( duration );   // [second]
                     duration *= 1000;        // [msec]
-                
+
                     iMedia->SetTObjectValueL<TInt32>( KMPXMediaGeneralDuration,
-                                                duration );      
-                
-                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- duration = %i", duration);  
+                                                duration );
+
+                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- duration = %i", duration);
                     }
                 break;
                 }
-            case EMetaDataSampleRate:     
-                {                  
+            case EMetaDataSampleRate:
+                {
                 const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
-                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);   
-                
+                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);
+
                 // Verify if WMA, get the sample rate
                 if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
                     {
-                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");                         
+                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");
 
                     // Perform the sample rate conversion
                     TLex lexer( *value );
                     TInt32 sampleRate ( 0 );
-                    lexer.Val( sampleRate );         
-                    
+                    lexer.Val( sampleRate );
+
                     iMedia->SetTObjectValueL<TUint>( KMPXMediaAudioSamplerate,
                                                       sampleRate );
-                           
-                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- sample rate = %i", sampleRate);  
+
+                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- sample rate = %i", sampleRate);
                     }
                 break;
                 }
-            case EMetaDataBitRate:     
-                {                  
+            case EMetaDataBitRate:
+                {
                 const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
-                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);   
-                
+                MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL, mimeType = %S", &mimeType);
+
                 // Verify if WMA, get the duration
                 if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
                     {
-                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");                         
+                    MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");
 
                     // Perform the duration conversion
                     TLex lexer( *value );
                     TInt32 bitRate ( 0 );
-                    lexer.Val( bitRate );   
-                
+                    lexer.Val( bitRate );
+
                     iMedia->SetTObjectValueL<TUint>( KMPXMediaAudioBitrate,
                                                      bitRate );
-                
-                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- duration = %i", bitRate);  
+
+                    MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- duration = %i", bitRate);
+                    }
+                break;
+                }
+            case EMetaDataAlbumArtist:
+                {
+                TPtr valptr = value->Des();
+                valptr.Trim();
+                TInt vallen = value->Length();
+                if (vallen>0)
+                    {
+                    FindAndReplaceForbiddenChars(valptr, vallen);
+                    iMedia->SetTextValueL(KMPXMediaMusicAlbumArtist, *value);
                     }
                 break;
                 }
@@ -493,7 +506,7 @@
             }
         if (fieldType != EMetaDataJpeg)
             {
-            CleanupStack::PopAndDestroy( value );       
+            CleanupStack::PopAndDestroy( value );
             }
         }
     }
@@ -513,25 +526,25 @@
     if( iFileOpenError == KErrNone )
         {
         const TDesC& mimeType = iMedia->ValueText( KMPXMediaGeneralMimeType );
-        MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);   
+        MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);
         iFile.Size( size );
         iMedia->SetTObjectValueL<TInt>( KMPXMediaGeneralSize, size );
-        
+
         // Verify if WMA, skip getting info from MMF
         if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
             {
             // No need to get MMF support
-            MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, skip MMF ");   
+            MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, skip MMF ");
             }
         else
             {
-            MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, get MMF controller");   
+            MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, get MMF controller");
             // Duration, bitrate, samplerate, etc
             //
             if( !iMetadataOnly )
             {
                 MPX_TRAPD(err2, iFileInfoUtil->OpenFileL(
-                          iFile, 
+                          iFile,
                           iMedia->ValueText(KMPXMediaGeneralMimeType)));
                 MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, file info util error %i", err2);
                 if( KErrNone == err2 )
@@ -546,7 +559,7 @@
 
                     MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL -- duration %i", duration);
                     }
-                
+
                 iFileInfoUtil->Reset();
                 }
             }
@@ -582,22 +595,22 @@
 // CMPXMetadataExtractor::ThumbnailPreviewReady
 // Callback but not used here
 // ---------------------------------------------------------------------------
-void CMPXMetadataExtractor::ThumbnailPreviewReady( 
+void CMPXMetadataExtractor::ThumbnailPreviewReady(
         MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ )
     {
     MPX_FUNC("CMPXMetadataExtractor::ThumbnailPreviewReady()");
     }
-        
+
 
 // ---------------------------------------------------------------------------
 // CMPXMetadataExtractor::ThumbnailReady
 // Callback but not used here
 // ---------------------------------------------------------------------------
-void CMPXMetadataExtractor::ThumbnailReady( TInt /*aError*/, 
+void CMPXMetadataExtractor::ThumbnailReady( TInt /*aError*/,
         MThumbnailData& /*aThumbnail*/, TThumbnailRequestId aId )
     {
     MPX_FUNC("CMPXMetadataExtractor::ThumbnailReady()");
-    
+
     // Remove thumbnail id from array.
     TInt index = iArrayTNRequestId.Find( aId );
     if ( index >= 0 )
@@ -622,8 +635,8 @@
 
     CMPXMetadataExtractor* ptr =
         static_cast<CMPXMetadataExtractor*>(aPtr);
-        
-    // Timer expired before thumbnail callback occurred. Stop wait loop to unblock. 
+
+    // Timer expired before thumbnail callback occurred. Stop wait loop to unblock.
     ptr->StopWaitLoop();
     return KErrNone;
     }
@@ -636,7 +649,7 @@
     MPX_FUNC("CMPXMetadataExtractor::StopWaitLoop()");
     // Cancel timer
     CancelTimeoutTimer();
-    
+
     // Stop wait loop to unblock.
     if ( iTNSyncWait->IsStarted() )
         {
@@ -646,12 +659,12 @@
     }
 
 // ----------------------------------------------------------------------------
-// Cancel timer. 
+// Cancel timer.
 // ----------------------------------------------------------------------------
 void CMPXMetadataExtractor::CancelTimeoutTimer()
     {
     MPX_FUNC("CMPXMetadataExtractor::CancelTimeoutTimer()");
-    
+
     // Cancel timer.
     if ( iTimer && iTimer->IsActive() )
         {
@@ -668,12 +681,12 @@
     MPX_FUNC("CMPXMetadataExtractor::ExtractAlbumArtL()");
     TInt err = KErrNone;
     iCancelled = EFalse;
-    
+
     if ( !aMedia->IsSupported(KMPXMediaGeneralUri) )
         {
         return KErrArgument;
         }
-    
+
     // Get full file name.
     const TDesC& path = aMedia->ValueText(KMPXMediaGeneralUri);
     MPX_DEBUG2("CMPXMetadataExtractor::ExtractAlbumArtL Filename:%S ", &path );
@@ -695,7 +708,7 @@
             HBufC8* value8 = ((HBufC8*)sampleData)->Des().AllocLC();   // make a local copy of sampleData
             source = CThumbnailObjectSource::NewLC(
                 value8, mimeType, path );    // give up ownership of value8
-            
+
             MPX_DEBUG1("CMPXMetadataExtractor::ExtractAlbumArtL source created from buffer");
             TThumbnailRequestId tnId = iTNManager->CreateThumbnails( *source );
             iArrayTNRequestId.Append( tnId );
@@ -706,7 +719,7 @@
             {
             source = CThumbnailObjectSource::NewLC(
                 path, KImageFileType  );
-            
+
             MPX_DEBUG1("CMPXMetadataExtractor::ExtractAlbumArtL source created from path");
             TThumbnailRequestId tnId = iTNManager->CreateThumbnails( *source );
             iArrayTNRequestId.Append( tnId );
@@ -721,7 +734,7 @@
     RArray<TMetaDataFieldId> wantedFields;
     CleanupClosePushL( wantedFields );
     wantedFields.Append(EMetaDataJpeg);
-    
+
     // Open file
     if ( aMedia->IsSupported(KMPXMediaGeneralMimeType) )
         {
@@ -737,7 +750,7 @@
         MPX_TRAP( err, iMetadataUtility->OpenFileL( path, wantedFields ) );
         }
     CleanupStack::PopAndDestroy( &wantedFields );
-    
+
     if ( !err )
         {
         //check if can send TN request, If thumbnail creation is ongoing, wait til it is done
@@ -756,28 +769,28 @@
 // ----------------------------------------------------------------------------
 // Add album art to media object.
 // ----------------------------------------------------------------------------
-void CMPXMetadataExtractor::AddMediaAlbumArtL( CMPXMedia& aMedia, 
+void CMPXMetadataExtractor::AddMediaAlbumArtL( CMPXMedia& aMedia,
                                                const TDesC& aFile )
     {
     MPX_FUNC("CMPXMetadataExtractor::AddMediaAlbumArtL()");
-    
+
     // get metadata container.
     const CMetaDataFieldContainer& metaCont = iMetadataUtility->MetaDataFieldsL();
     TPtrC8 data8 = metaCont.Field8( EMetaDataJpeg );
-   
+
     if ( data8.Length() )
         {
         MPX_DEBUG1("CMPXMetadataExtractor::GetMediaAlbumArtL(): Album art exist.");
 #ifdef RD_MPX_TNM_INTEGRATION
-        HBufC8* value8 = NULL; 
+        HBufC8* value8 = NULL;
         MPX_TRAPD( err, value8 = data8.AllocL() );
         if ( KErrNone != err )
             {
             MPX_DEBUG2("CMPXMetadataExtractor::GetMediaAlbumArtL - error jpeg = %i", err);
             return;
-            }              
+            }
         CleanupStack::PushL( value8 );
-    
+
         TBuf<256> mimeType;
         mimeType.Copy( KImageFileType );
         CThumbnailObjectSource* source = CThumbnailObjectSource::NewL(
@@ -786,9 +799,9 @@
         iArrayTNRequestId.Append( tnId ); // add thumbnail id to array
         CleanupStack::Pop( value8 );
         delete source;
-        
+
         aMedia.SetTextValueL( KMPXMediaMusicOriginalAlbumArtFileName, aFile );
-#endif // RD_MPX_TNM_INTEGRATION          
+#endif // RD_MPX_TNM_INTEGRATION
         aMedia.SetTextValueL( KMPXMediaMusicAlbumArtFileName, aFile );
         }
     }
@@ -926,10 +939,23 @@
         {
         TDataType dataType;
         TUid dummyUid(KNullUid);
-        iAppArc.AppForDocument(iFileName, dummyUid, dataType);
+        // File handle based mime type recogniton required , because AppArc does 
+        // not have All Files capa required for files in private folders 
+        TDataRecognitionResult result;
+        RFs fs;
+		RFile rFile;
+        User::LeaveIfError(fs.Connect());
+		CleanupClosePushL(fs);
+        User::LeaveIfError(fs.ShareProtected());
+        User::LeaveIfError(rFile.Open(fs, iFileName, EFileShareReadersOrWriters));
+		CleanupClosePushL(rFile);
+        User::LeaveIfError(iAppArc.RecognizeData(rFile, result)); 
+        CleanupStack::PopAndDestroy(&rFile);
+        CleanupStack::PopAndDestroy(&fs);
+        dataType = result.iDataType;
         iMedia->SetTextValueL( KMPXMediaGeneralMimeType,dataType.Des() );
         }
-        
+
     // Initially set default tags.
     SetDefaultL( *iMedia );
     }
@@ -981,23 +1007,23 @@
         MPX_DEBUG1("CMPXMetadataExtractor::CreateMediaAsyncL Request ongoing. Abort!" );
         User::Leave( KErrAbort );
         }
-    
+
     iCancelled = EFalse;
     iFileOpenError = KErrNone;
     iFileName = aFile;
     iObs = aObs;
     iMetadataOnly = aMetadataOnly;
-    
+
     // populate the task array
     AddTasksL();
-    
+
     // Start task timer to execute task
     if ( iArrayTasks.Count() )
         {
         if ( iTaskTimer->IsActive() )
             {
             iTaskTimer->Cancel();
-            }   
+            }
         iTaskTimer->Start( 0, 0, TCallBack(TaskTimerCallback, this ));
         }
     }
@@ -1009,7 +1035,7 @@
 TInt CMPXMetadataExtractor::OpenFile()
     {
     MPX_FUNC("CMPXMetadataExtractor::OpenFile()");
-    
+
     // Open the file
     iFile.Close();
     TInt error = iFile.Open( iFs, iFileName, EFileRead | EFileShareReadersOrWriters );
@@ -1025,7 +1051,7 @@
     {
     MPX_FUNC("CMPXMetadataExtractor::AddTasks()");
     iFileOpenError = OpenFile();
-    
+
     // Do not change the order of the task below.
     iArrayTasks.Reset();
     if ( iFileOpenError == KErrNone )
@@ -1066,7 +1092,7 @@
 void CMPXMetadataExtractor::HandleTaskTimerExpired()
     {
     MPX_FUNC("CMPXMetadataExtractor::HandleTaskTimerExpired()");
-    
+
     if ( iTaskTimer && iTaskTimer->IsActive() )
         {
         iTaskTimer->Cancel();
@@ -1083,13 +1109,13 @@
             }
         iArrayTasks.Reset();
         }
-    
+
     // Remove task at index 0.
     if ( iArrayTasks.Count() )
         {
         iArrayTasks.Remove( 0 );
         }
-    
+
     // check if we have any more task to run
     if ( iArrayTasks.Count() )
         {
@@ -1104,7 +1130,7 @@
             iObs->HandleCreateMediaComplete( iMedia, error );
             iMedia = NULL;  // ownership transferred.
             }
-        
+
         CleanUp();
         }
     }
@@ -1135,7 +1161,7 @@
     // Validate the objects to be used
     MPX_ASSERT(iMedia);
     MPX_ASSERT(iDrmMediaUtility);
-    
+
     // File Path
     TParsePtrC parse( iFileName );
     iMedia->SetTextValueL( KMPXMediaGeneralUri, iFileName );
@@ -1143,7 +1169,7 @@
     MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL - Filename=%S", &iFileName);
 
     // get the protected flag from MetadataUtility Container
-    TPtrC ptr = aMetaCont.Field( EMetaDataProtected );  
+    TPtrC ptr = aMetaCont.Field( EMetaDataProtected );
     MPX_DEBUG2("CMPXMetadataExtractor::SetDrmMediaPropertiesL -- status=%S", &ptr);
     _LIT( KNonProtected, "0" );
     if ( ptr.Compare( KNonProtected ) == 0 )
@@ -1154,7 +1180,7 @@
         iMedia->SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
         iMedia->SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
         }
-    else  
+    else
         {  // DRM file
 
         // DRM Rights
@@ -1206,20 +1232,20 @@
 
         iMedia->SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
         iMedia->SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
-    
+
         iDrmMediaUtility->Close();
-    
+
         }  // DRM file
 
-    
+
     // verify the file open status
     if( iFileOpenError == KErrNotFound || iFileOpenError == KErrPathNotFound )
         {
         dbFlags |= KMPXMediaGeneralFlagsIsInvalid;
         }
-    
+
     // Finally set the db flag
     //
     iMedia->SetTObjectValueL( KMPXMediaGeneralFlags, dbFlags );
-   
+
     }