diff -r e42293e811d8 -r 6c1dfe4da5dd mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp --- 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( 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; iValueText( 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( 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( 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( 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( 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(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 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( KMPXMediaDrmProtected, prot ); iMedia->SetTObjectValueL( KMPXMediaMTPDrmStatus, (TUint16)prot ); } - else + else { // DRM file // DRM Rights @@ -1206,20 +1232,20 @@ iMedia->SetTObjectValueL( KMPXMediaDrmProtected, prot ); iMedia->SetTObjectValueL( 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 ); - + }