# HG changeset patch # User William Roberts # Date 1270221845 -3600 # Node ID 37df1c05d4276a8621e8ade86a7c49c482617fa7 # Parent 780c925249c1d391336957b8cdc564e24da684f1# Parent 835a21e50645cdbf91089a2fc72e912bf22bb617 Remerge fix for Bug 1961 diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/audiofetcher/inc/audiofetcherdialog.h --- a/mmappcomponents/audiofetcher/inc/audiofetcherdialog.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/audiofetcher/inc/audiofetcherdialog.h Fri Apr 02 16:24:05 2010 +0100 @@ -133,6 +133,13 @@ CGulIcon* IconL(TAknsItemID aId, const TDesC& aFileName, TInt aFileIndex, TInt aFileMaskIndex); + CGulIcon* ColorIconL( const TAknsItemID& aId, + const TDesC& aFileName, + TInt aFilexIndex, + TInt aFileMaskIndex, + const TAknsItemID& aColorId, + TInt aColorIndex ); + void UpdateListBoxL(); /** diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/audiofetcher/src/audiofetcherdialog.cpp --- a/mmappcomponents/audiofetcher/src/audiofetcherdialog.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/audiofetcher/src/audiofetcherdialog.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -388,14 +388,18 @@ EMbmAudiofetcherQgn_prop_sml_sync_off_mask ) ); // memory card icon - icons->AppendL( IconL( KAknsIIDQgnIndiMmcAdd, iIconFileName, + icons->AppendL( ColorIconL( KAknsIIDQgnIndiMmcAdd, iIconFileName, EMbmAudiofetcherQgn_indi_mmc_add, - EMbmAudiofetcherQgn_indi_mmc_add_mask ) ); + EMbmAudiofetcherQgn_indi_mmc_add_mask, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG26 ) ); // mass storage icon - icons->AppendL( IconL( KAknsIIDQgnPropLinkEmbdSmall, iIconFileName, + icons->AppendL( ColorIconL( KAknsIIDQgnPropLinkEmbdSmall, iIconFileName, EMbmAudiofetcherQgn_indi_fmgr_ms_add, - EMbmAudiofetcherQgn_indi_fmgr_ms_add_mask ) ); + EMbmAudiofetcherQgn_indi_fmgr_ms_add_mask, + KAknsIIDQsnIconColors, + EAknsCIQsnIconColorsCG26 ) ); // empty icon icons->AppendL( IconL( KAknsIIDQgnPropEmpty, KAvkonBitmapFile, @@ -455,6 +459,45 @@ return icon; } +// ----------------------------------------------------------------------------- +// CMediaFileDialog::ColorIconL +// +// ----------------------------------------------------------------------------- +// +CGulIcon* CAudioFetcherDialog::ColorIconL( const TAknsItemID& aId, + const TDesC& aFileName, + TInt aFilexIndex, + TInt aFileMaskIndex, + const TAknsItemID& aColorId, + TInt aColorIndex ) + { + WLOG("CAudioFetcherDialog::ColorIconL"); + + CFbsBitmap* bitmap( NULL ); + CFbsBitmap* mask( NULL ); + + if ( aColorId == KAknsIIDNone ) + { + // do not use theme color, use the default color from the file + AknsUtils::CreateIconLC( AknsUtils::SkinInstance(), aId, + bitmap, mask, aFileName, aFilexIndex, aFileMaskIndex ); + } + else + { + // use theme color + AknsUtils::CreateColorIconLC( AknsUtils::SkinInstance(), aId, aColorId, aColorIndex, + bitmap, mask, aFileName, aFilexIndex, aFileMaskIndex, KRgbBlack ); + } + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + icon->SetBitmapsOwnedExternally( EFalse ); + + // icon now owns the bitmaps, no need to keep on cleanup stack. + CleanupStack::Pop( 2 ); // mask, bitmap + + return icon; + } + // ----------------------------------------------------------------------------- // CMediaFileDialog::UpdateListBoxL diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp --- a/mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/collectionhelper/group/mpxcollectionhelper.mmp Fri Apr 02 16:24:05 2010 +0100 @@ -29,6 +29,8 @@ MACRO RD_MPX_TNM_INTEGRATION #define RD_MPX_TNM_INTEGRATION +MACRO ABSTRACTAUDIOALBUM_INCLUDED +#define ABSTRACTAUDIOALBUM_INCLUDED //MACRO RD_MPX_COLLECTION_CACHE SOURCEPATH ../src SOURCE mpxcollectionhelperfactory.cpp diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/collectionhelper/inc/mpxcollectionuihelperimp.h --- a/mmappcomponents/collectionhelper/inc/mpxcollectionuihelperimp.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/collectionhelper/inc/mpxcollectionuihelperimp.h Fri Apr 02 16:24:05 2010 +0100 @@ -649,6 +649,16 @@ void HandleOpenL(const CMPXCollectionPlaylist& aPlaylist,TInt aError); /** + * From MMPXCollectionObserver + * Handles completion of a asynchronous command. + * + * @param aCommandResult result of the command, NULL if error + * @param aError error code + */ + virtual void HandleCommandComplete(CMPXCommand* aCommandResult, + TInt aError); + + /** * From MMPXMoveItemObserver * @param aErr, error for the operation */ diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp --- a/mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/collectionhelper/src/mpxcollectioncachedhelper.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -12,7 +12,7 @@ * Contributors: * * Description: Extended collection helper with an internal caching array -* Version : %version: da1mmcf#27.1.12 % +* Version : %version: da1mmcf#27.1.12.1.1 % * */ @@ -157,9 +157,24 @@ { Commit(); } +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + TBool extract = ETrue; + if( aMedia->IsSupported( KMPXMediaMTPSampleDataFlag ) ) + { + + extract = aMedia->ValueTObjectL( KMPXMediaMTPSampleDataFlag ); + MPX_DEBUG2("CMPXCollectionCachedHelper::AddL KMPXMediaMTPSampleDataFlag is set. extract=%d", extract ); + } + if( extract ) + { + // Extract album art from the file + iMetadataExtractor->ExtractAlbumArtL( aMedia ); + } +#else // Extract album art from the file iMetadataExtractor->ExtractAlbumArtL( aMedia ); +#endif CMPXMedia* copy = CMPXMedia::NewL( *aMedia ); CleanupStack::PushL( copy ); @@ -332,7 +347,20 @@ void CMPXCollectionCachedHelper::SetL( CMPXMedia*& aMedia ) { MPX_DEBUG1("CMPXCollectionCachedHelper::::SetL <--"); - + +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if( aMedia->IsSupported( KMPXMediaMTPSampleDataFlag ) ) + { + TBool flag = aMedia->ValueTObjectL( KMPXMediaMTPSampleDataFlag ); + MPX_DEBUG2("CMPXCollectionCachedHelper::SetL KMPXMediaMTPSampleDataFlag is set. flag=%d", flag ); + if( flag ) + { + iMetadataExtractor->ExtractAlbumArtL( aMedia ); + } + return; + } +#endif + const TDesC& newUri = aMedia->ValueText( KMPXMediaGeneralUri ); TInt count( iCache->Count() ); @@ -719,7 +747,11 @@ MPX_DEBUG1("CMPXCollectionCachedHelper::GetL <--"); +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist && aItemCat != EMPXAbstractAlbum) +#else if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist) +#endif { User::Leave(KErrArgument); } @@ -751,11 +783,20 @@ EMPXMediaGeneralTitle | EMPXMediaGeneralDate | EMPXMediaGeneralDuration | EMPXMediaGeneralComment | EMPXMediaGeneralUri )); +#ifdef ABSTRACTAUDIOALBUM_INCLUDED attributes.AppendL( TMPXAttribute(KMPXMediaIdMusic, EMPXMediaMusicArtist | EMPXMediaMusicAlbum | EMPXMediaMusicAlbumTrack | EMPXMediaMusicComposer | - EMPXMediaMusicYear | EMPXMediaMusicGenre)); + EMPXMediaMusicYear | EMPXMediaMusicGenre | + EMPXMediaMusicAlbumArtist)); +#else + attributes.AppendL( + TMPXAttribute(KMPXMediaIdMusic, + EMPXMediaMusicArtist | EMPXMediaMusicAlbum | + EMPXMediaMusicAlbumTrack | EMPXMediaMusicComposer | + EMPXMediaMusicYear | EMPXMediaMusicGenre)); +#endif attributes.AppendL(KMPXMediaAudioAudioAll); attributes.AppendL(KMPXMediaMTPAll); @@ -997,6 +1038,14 @@ aSrc.ValueTObjectL( KMPXMediaMusicRating ) ); } +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if( atts&EMPXMediaMusicAlbumArtist ) // Text + { + aDestination.SetTextValueL( KMPXMediaMusicAlbumArtist, + aSrc.ValueText(KMPXMediaMusicAlbumArtist ) + ); + } +#endif MPX_DEBUG1("CMPXCollectionCachedHelper::DoAppendMusicL -->"); } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp --- a/mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/collectionhelper/src/mpxcollectionhelperimp.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -168,8 +168,14 @@ // generic way of resolving collections aside from using file extension // or UID. // +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if ( aMedia->ValueTObjectL(KMPXMediaGeneralType) == EMPXItem && + (aMedia->ValueTObjectL(KMPXMediaGeneralCategory) == EMPXPlaylist || + aMedia->ValueTObjectL(KMPXMediaGeneralCategory) == EMPXAbstractAlbum)) +#else if ( aMedia->ValueTObjectL(KMPXMediaGeneralType) == EMPXItem && aMedia->ValueTObjectL(KMPXMediaGeneralCategory) == EMPXPlaylist ) +#endif { aMedia->SetTObjectValueL( KMPXMediaGeneralCollectionId, iMusicCollectionId ); @@ -348,9 +354,13 @@ // TMPXGeneralCategory category = aMedia->ValueTObjectL(KMPXMediaGeneralCategory); - +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if ((aMedia->ValueTObjectL(KMPXMediaGeneralType) != EMPXItem) || + (category != EMPXSong && category != EMPXPlaylist && category != EMPXAbstractAlbum)) +#else if ((aMedia->ValueTObjectL(KMPXMediaGeneralType) != EMPXItem) || (category != EMPXSong && category != EMPXPlaylist)) +#endif { User::Leave( KErrArgument ); } @@ -466,8 +476,11 @@ { MPX_FUNC("CMPXCollectionHelperImp::GetL"); MPX_DEBUG2("aFile %S", &aFile); - +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist && aItemCat != EMPXAbstractAlbum) +#else if (aItemCat != EMPXSong && aItemCat != EMPXPlaylist) +#endif { User::Leave(KErrArgument); } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/collectionhelper/src/mpxcollectionuihelperimp.cpp --- a/mmappcomponents/collectionhelper/src/mpxcollectionuihelperimp.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/collectionhelper/src/mpxcollectionuihelperimp.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -1027,6 +1027,12 @@ // currently only used by incremental add iTaskQueue->CancelRequests(); + if( iTask == ETaskIncAddMedia || iTask == ETaskIncAppendMedia ) + { + // complete task from scheduler + iTaskQueue->CompleteTask(); + } + // clean up iInputMedia if( iInputMedia ) { @@ -1253,6 +1259,62 @@ ASSERT(0); } +// --------------------------------------------------------------------------- +// From MMPXCollectionObserver +// --------------------------------------------------------------------------- +// +void CMPXCollectionUiHelperImp::HandleCommandComplete(CMPXCommand* aCommandResult, TInt aError) + { + MPX_DEBUG3("CMPXCollectionUiHelperImp::HandleCommandComplete iTask=%d, aError=%d", + iTask, aError); + + if( iTask == ETaskIncAddMedia && iInputMedia ) + { + if ( iChunkNumber == 0 ) + { + // save playlistId in input media & use it for subsequent appending operations + if( aCommandResult ) + { + TMPXItemId playlistId = + aCommandResult->ValueTObjectL(KMPXCommandColAddRtnId); + + iInputMedia->SetTObjectValueL(KMPXMediaGeneralId, playlistId); + } + + iChunkNumber++; // move on to next chunk + + CompleteTask(iTask, aError); + } + else if ( iChunkNumber == iTotalChunkNumber-1 ) // last chunk + { + CompleteTask(ETaskIncFinish, aError); // finish inc task + } + else // intermedia chunks + { + iChunkNumber++; // move on to next chunk + + CompleteTask(iTask, aError); + } + } + else if( iTask == ETaskIncAppendMedia && iInputMedia ) + { + // last chunk + // for the case that there is only one chunk (first & last chunk at the same + // time), Inc Add is not used + if( iChunkNumber == iTotalChunkNumber-1 ) + { + // update input media as well + FillInPlaylistDetailsL(*iInputMedia); + CompleteTask(ETaskIncFinish, aError); + } + else // intermediate chunks, including first chunk + { + iChunkNumber++; + CompleteTask(iTask, aError); + } + } + } + // ---------------------------------------------------------------------------- // Handles completion of moving an object, just a proxy // ---------------------------------------------------------------------------- @@ -1681,7 +1743,8 @@ void CMPXCollectionUiHelperImp::DoIncAddMediaL() { /***** include only aSize/iChunkSize number of songs *****/ - + MPX_DEBUG5("CMPXCollectionUiHelperImp::DoIncAddMediaL (%d, %d, %d, %d)", + iChunkNumber, iChunkSize, iTotalChunkNumber, iRemainder); // copy media CMPXMedia* media = CMPXMedia::CopyL(*iInputMedia); CleanupStack::PushL(media); @@ -1739,15 +1802,7 @@ CleanupStack::PopAndDestroy(playlistExtension); - iMediator->AddItemL( media ); // this creates the new playlist - - // save playlistId in input media & use it for subsequent appending operations - TMPXItemId playlistId = media->ValueTObjectL(KMPXMediaGeneralId); - iInputMedia->SetTObjectValueL(KMPXMediaGeneralId, playlistId); - - iChunkNumber++; // move on to next chunk - - CompleteTask(iTask, KErrNone); + iMediator->AddItemAsyncL( media ); // this creates the new playlist } else if ( iChunkNumber == iTotalChunkNumber-1 ) // last chunk { @@ -1759,9 +1814,7 @@ TMPXItemId playlistId = iInputMedia->ValueTObjectL(KMPXMediaGeneralId); media->SetTObjectValueL(KMPXMediaGeneralId, playlistId); - iMediator->AddItemL( media ); - - CompleteTask(ETaskIncFinish, KErrNone); // finish inc task + iMediator->AddItemAsyncL( media ); } else // intermedia chunks { @@ -1773,11 +1826,7 @@ TMPXItemId playlistId = iInputMedia->ValueTObjectL(KMPXMediaGeneralId); media->SetTObjectValueL(KMPXMediaGeneralId, playlistId); - iMediator->AddItemL( media ); - - iChunkNumber++; // move on to next chunk - - CompleteTask(iTask, KErrNone); + iMediator->AddItemAsyncL( media ); } CleanupStack::PopAndDestroy(cArray); @@ -1830,23 +1879,8 @@ // update media then append to playlist FillInPlaylistDetailsL(*media); - iMediator->AddItemL( media ); + iMediator->AddItemAsyncL( media ); - // last chunk - // for the case that there is only one chunk (first & last chunk at the same - // time), Inc Add is not used - if( iChunkNumber == iTotalChunkNumber-1 ) - { - // update input media as well - FillInPlaylistDetailsL(*iInputMedia); - CompleteTask(ETaskIncFinish, KErrNone); - } - else // intermediate chunks, including first chunk - { - iChunkNumber++; - CompleteTask(iTask, KErrNone); - } - CleanupStack::PopAndDestroy(cArray); CleanupStack::PopAndDestroy(media); } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/collectionmediator/bwinscw/mpxcollectionmediatorU.DEF --- a/mmappcomponents/harvester/collectionmediator/bwinscw/mpxcollectionmediatorU.DEF Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/collectionmediator/bwinscw/mpxcollectionmediatorU.DEF Fri Apr 02 16:24:05 2010 +0100 @@ -15,4 +15,5 @@ ?SetItemL@CMPXCollectionMediator@@QAEXAAPAVCMPXMedia@@@Z @ 14 NONAME ; void CMPXCollectionMediator::SetItemL(class CMPXMedia * &) ?SetItemL@CMPXCollectionMediator@@QAEXAAV?$TArray@PAVCMPXMedia@@@@AAVCMPXCollectionPath@@AAV?$RArray@H@@@Z @ 15 NONAME ; void CMPXCollectionMediator::SetItemL(class TArray &, class CMPXCollectionPath &, class RArray &) ?SetItemL@CMPXCollectionMediator@@QAEXAAVCMPXMediaArray@@@Z @ 16 NONAME ; void CMPXCollectionMediator::SetItemL(class CMPXMediaArray &) + ?AddItemAsyncL@CMPXCollectionMediator@@QAEXAAPAVCMPXMedia@@@Z @ 17 NONAME ; void CMPXCollectionMediator::AddItemAsyncL(class CMPXMedia * &) diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/collectionmediator/eabi/mpxcollectionmediatorU.DEF --- a/mmappcomponents/harvester/collectionmediator/eabi/mpxcollectionmediatorU.DEF Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/collectionmediator/eabi/mpxcollectionmediatorU.DEF Fri Apr 02 16:24:05 2010 +0100 @@ -19,4 +19,5 @@ _ZTI22CMPXCollectionMediator @ 18 NONAME ; ## _ZTV18CMPXMoveItemHelper @ 19 NONAME ; ## _ZTV22CMPXCollectionMediator @ 20 NONAME ; ## + _ZN22CMPXCollectionMediator13AddItemAsyncLERP9CMPXMedia @ 21 NONAME diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/collectionmediator/src/mpxcollectionmediator.cpp --- a/mmappcomponents/harvester/collectionmediator/src/mpxcollectionmediator.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/collectionmediator/src/mpxcollectionmediator.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -226,6 +226,42 @@ } // --------------------------------------------------------------------------- +// CMPXCollectionMediator::AddItemAsyncL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CMPXCollectionMediator::AddItemAsyncL( CMPXMedia*& aMedia ) + { + ASSERT( iColUtil ); + + // If this is a podcast, change the collection id + if( IsPodcastL( *aMedia ) ) + { + UpdatePathToPodcastL( *aMedia ); + } + + // Add it to the collection + CMPXCommand* cmd = CMPXMedia::NewL(); + CleanupStack::PushL( cmd ); + + cmd->SetTObjectValueL(KMPXCommandGeneralId, KMPXCommandIdCollectionAdd ); + cmd->SetCObjectValueL(KMPXCommandColAddMedia, aMedia); // copied + + if (aMedia->IsSupported(KMPXMediaGeneralCollectionId)) + { + TUid collectionId = aMedia->ValueTObjectL(KMPXMediaGeneralCollectionId); + cmd->SetTObjectValueL(KMPXCommandGeneralCollectionId, collectionId.iUid); + } + else + { + User::Leave( KErrArgument ); + } + + iColUtil->CommandL(*cmd); + + CleanupStack::PopAndDestroy(cmd); + } + +// --------------------------------------------------------------------------- // CMPXCollectionMediator::AddItemL() // --------------------------------------------------------------------------- // diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp --- a/mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/filehandler/group/mpxfilehandler.mmp Fri Apr 02 16:24:05 2010 +0100 @@ -31,6 +31,8 @@ MACRO __RAMDISK_PERF_ENABLE #define __RAMDISK_PERF_ENABLE +MACRO ABSTRACTAUDIOALBUM_INCLUDED +#define ABSTRACTAUDIOALBUM_INCLUDED SOURCEPATH ../src SOURCE mpxharvesterfilehandler.cpp SOURCE mpxharvesterfilehandlerimp.cpp diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h --- a/mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/filehandler/inc/mpxdbcommon.h Fri Apr 02 16:24:05 2010 +0100 @@ -23,7 +23,11 @@ // Harvester db increment 9 v1 // Please update the increment number for each increment // Please update the version number for each schema change +#ifdef ABSTRACTAUDIOALBUM_INCLUDED +_LIT( KHarvesterDBName, "harvesterdbv9_6.dat" ); +#else _LIT( KHarvesterDBName, "harvesterdbv9_5.dat" ); +#endif _LIT( KHarvesterDBPattern, "harvesterdbv*.dat" ); const TInt KDbMaxTableCreationSQLLength = 1024; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp --- a/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/filehandler/src/mpxharvesterdbmanager.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -24,7 +24,7 @@ #ifdef __RAMDISK_PERF_ENABLE #include -#include +#include #include #include "mpxdbcommon.h" #endif //__RAMDISK_PERF_ENABLE diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp --- a/mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/metadataextractor/group/mpxmetadataextractor.mmp Fri Apr 02 16:24:05 2010 +0100 @@ -30,6 +30,8 @@ MACRO RD_MPX_TNM_INTEGRATION #define RD_MPX_TNM_INTEGRATION +MACRO ABSTRACTAUDIOALBUM_INCLUDED +#define ABSTRACTAUDIOALBUM_INCLUDED SOURCEPATH ../src SOURCE mpxmetadataextractor.cpp SOURCE mpxfileinfoutility.cpp diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp --- a/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -12,7 +12,7 @@ * Contributors: * * Description: Extracts metadata from a file -* Version : %version: da1mmcf#38.1.4.2.6.1.5 % << Don't touch! Updated by Synergy at check-out. +* Version : %version: da1mmcf#38.1.4.2.6.1.7 % << Don't touch! Updated by Synergy at check-out. * */ @@ -51,6 +51,9 @@ const TInt KMPXMaxThumbnailRequest = 5; #endif //RD_MPX_TNM_INTEGRATION +#ifdef ABSTRACTAUDIOALBUM_INCLUDED +_LIT( KNonEmbeddedArtExt, ".alb" ); +#endif //Helper functions static void FindAndReplaceForbiddenChars(TDes& aString, TInt aLen) { @@ -734,7 +737,31 @@ // Get full file name. const TDesC& path = aMedia->ValueText(KMPXMediaGeneralUri); MPX_DEBUG2("CMPXMetadataExtractor::ExtractAlbumArtL Filename:%S ", &path ); - +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + TParsePtrC parse( path ); + TPtrC ext( parse.Ext() ); + if (ext.CompareF(KNonEmbeddedArtExt)== 0) + { + #ifdef RD_MPX_TNM_INTEGRATION + + //check if can send TN request, If thumbnail creation is ongoing, wait til it is done + CheckBeforeSendRequest(); + + CThumbnailObjectSource* source = CThumbnailObjectSource::NewLC( + path, KImageFileType ); + + + + iTNManager->CreateThumbnails( *source ); + + iOutstandingThumbnailRequest++; + CleanupStack::PopAndDestroy( source ); + + #endif + } + else + { +#endif // create wanted fields array RArray wantedFields; CleanupClosePushL( wantedFields ); @@ -763,7 +790,9 @@ // Reset the utility iMetadataUtility->ResetL(); - +#ifdef ABSTRACTAUDIOALBUM_INCLUDED + } +#endif return err; } @@ -817,26 +846,9 @@ MPX_FUNC("CMPXMetadataExtractor::AddMediaAlbumArtL()"); #ifdef RD_MPX_TNM_INTEGRATION - // If thumbnail creation is ongoing, wait til it is done - if ( iOutstandingThumbnailRequest > KMPXMaxThumbnailRequest ) - { - MPX_DEBUG1("CMPXMetadataExtractor::AddMediaAlbumArtL(): Thumbnail creation ongoing!"); - iTNMBlockCount++; - // Cancel timer. - CancelTimeoutTimer(); - // Start timer in case there is no callback from ThumbNail Manager. - iTimer->Start( - KMPXTimeoutTimer, - KMPXTimeoutTimer, - TCallBack(TimeoutTimerCallback, this )); - - // Start wait loop until we get a callback from ThumbNail Manager. - if ( !iTNSyncWait->IsStarted() ) - { - iTNSyncWait->Start(); - } - } - + //check if can send TN request, If thumbnail creation is ongoing, wait til it is done + CheckBeforeSendRequest(); + aMedia.SetTextValueL( KMPXMediaMusicAlbumArtFileName, aFile ); TBuf<256> mimeType; @@ -850,3 +862,29 @@ #endif // RD_MPX_TNM_INTEGRATION } + +void CMPXMetadataExtractor::CheckBeforeSendRequest() + { + MPX_FUNC("CMPXMetadataExtractor::CheckBeforeSendRequest()"); +#ifdef RD_MPX_TNM_INTEGRATION + // If thumbnail creation is ongoing, wait til it is done + if ( iOutstandingThumbnailRequest > KMPXMaxThumbnailRequest ) + { + MPX_DEBUG1("CMPXMetadataExtractor::CheckBeforeSendRequest(): Thumbnail creation ongoing!"); + iTNMBlockCount++; + // Cancel timer. + CancelTimeoutTimer(); + // Start timer in case there is no callback from ThumbNail Manager. + iTimer->Start( + KMPXTimeoutTimer, + KMPXTimeoutTimer, + TCallBack(TimeoutTimerCallback, this )); + + // Start wait loop until we get a callback from ThumbNail Manager. + if ( !iTNSyncWait->IsStarted() ) + { + iTNSyncWait->Start(); + } + } +#endif // RD_MPX_TNM_INTEGRATION + } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/server/inc/mpxusbeventhandler.h --- a/mmappcomponents/harvester/server/inc/mpxusbeventhandler.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/server/inc/mpxusbeventhandler.h Fri Apr 02 16:24:05 2010 +0100 @@ -113,7 +113,6 @@ */ MMPXSystemEventObserver& iObserver; TInt iState; - TBool iMTPActive; RUsb iUsbMan; TUsbDeviceState iDeviceState; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/harvester/server/src/mpxusbeventhandler.cpp --- a/mmappcomponents/harvester/server/src/mpxusbeventhandler.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/harvester/server/src/mpxusbeventhandler.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -41,7 +41,6 @@ CActive( EPriorityStandard ), iWasMtp ( EFalse ), iObserver( aObserver ), - iMTPActive ( EFalse ), iUsbManConnected( EFalse ) { CActiveScheduler::Add( this ); @@ -175,7 +174,6 @@ { MPX_DEBUG1("CMPXUsbEventHandler::DoHandlePSEvent - MTP End"); iObserver.HandleSystemEventL( EUSBMTPEndEvent, removableDrive ); - iMTPActive = EFalse; } MPX_DEBUG1("CMPXUsbEventHandler::DoHandlePSEvent - USB Start"); #ifdef RD_MULTIPLE_DRIVE @@ -199,20 +197,15 @@ if (value == EMtpPSStatusActive) { - if( !iMTPActive ) - { MPX_DEBUG1("CMPXUsbEventHandler::DoHandlePSEvent - MTP Start"); iObserver.HandleSystemEventL( EUSBMTPStartEvent, removableDrive ); iState = KUsbPersonalityIdMTP; - iMTPActive = ETrue; - } } else if( value != EMtpPSStatusReadyToSync ) { MPX_DEBUG1("CMPXUsbEventHandler::DoHandlePSEvent - MTP Not Active"); iObserver.HandleSystemEventL( EUSBMTPNotActiveEvent, removableDrive ); iState = KUsbPersonalityIdMTP; - iMTPActive = EFalse; } } // Make sure MTP and MS flags are OFF @@ -231,7 +224,6 @@ { MPX_DEBUG1("CMPXUsbEventHandler::DoHandlePSEvent - MTP End"); iObserver.HandleSystemEventL( EUSBMTPEndEvent, removableDrive ); - iMTPActive = EFalse; } iState = KUsbWatcherSelectedPersonalityNone; } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h --- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpaccesssingleton.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,11 +19,6 @@ #ifndef CMMMTPDPACCESSSINGLETON_H #define CMMMTPDPACCESSSINGLETON_H -/** -* Implements the MM MTP Data Priovider access singletons reference manager. -*/ - -class RFs; class CMmMtpDpMetadataAccessWrapper; class MMTPDataProviderFramework; @@ -36,8 +31,7 @@ * @param aRFs RFs reference * @param aFramework framework reference */ - IMPORT_C static void CreateL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ); + IMPORT_C static void CreateL( MMTPDataProviderFramework& aFramework ); /** * release singleton instance @@ -68,14 +62,12 @@ /* * 2-phase construction */ - static CMmMtpDpAccessSingleton* NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ); + static CMmMtpDpAccessSingleton* NewL( MMTPDataProviderFramework& aFramework ); /* * 2-phase construction */ - void ConstructL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ); + void ConstructL( MMTPDataProviderFramework& aFramework ); /* * destruction */ diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h --- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadataaccesswrapper.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,10 +19,8 @@ #ifndef CMMMTPDPMETADATAACCESSWRAPPER_H #define CMMMTPDPMETADATAACCESSWRAPPER_H -#include -#include #include -#include +#include // forward declacration class CMmMtpDpMetadataMpxAccess; @@ -30,16 +28,15 @@ class RFs; class MMTPType; -class CMTPTypeObjectPropList; class CMPXMediaArray; class CMPXMedia; class MMTPDataProviderFramework; +class CMTPObjectMetaData; class CMmMtpDpMetadataAccessWrapper : public CBase { public: - static CMmMtpDpMetadataAccessWrapper* NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ); + static CMmMtpDpMetadataAccessWrapper* NewL( MMTPDataProviderFramework& aFramework ); /** * Destructor @@ -78,18 +75,16 @@ * @param aFullFileName, full file name of file * @return void */ - void AddObjectL( const TDesC& aFullFileName, TUint aFormatCode, TUint aSubFormatCode ); + void AddObjectL( const CMTPObjectMetaData& aObject ); /** * Set abstract media to DB - * @param aAbstractMediaFileName, full file name of abstract media file + * @param aObject, * @param aRefFileArray, a array to store the full file name of media files - * @param aCategory, the category of abstract media * @return void */ - IMPORT_C void SetAbstractMediaL( const TDesC& aAbstractMediaFileName, - CDesCArray& aRefFileArray, - TMPXGeneralCategory aCategory ); + IMPORT_C void SetReferenceL( const CMTPObjectMetaData& aObject, + CDesCArray& aRefFileArray ); /** * Gets a piece of metadata from the collection @@ -119,18 +114,17 @@ /** * Renames the file part of a record in the collection database - * @param aFile, old full file name of Media file + * @param aOldObject, object need to be renamed * @param aNewFileName, new file name need update * @return void */ - IMPORT_C void RenameObjectL( const TDesC& aOldFileName, const TDesC& aNewFileName ); + IMPORT_C void RenameObjectL( const CMTPObjectMetaData& aOldObject, const TDesC& aNewFileName ); /** * Deletes metadata information associated with the object - * @param aFullFileName, full file name of Media file - * @param aFormatCode, format code + * @param aObject, the object need to be deleted */ - void DeleteObjectL( const TDesC& aFullFileName, const TUint aFormatCode ); + void DeleteObjectL( const CMTPObjectMetaData& aObject ); /** * Set current drive info @@ -144,7 +138,7 @@ * @param aWidth, the width of an object in pixels to set * @parem aHeight, the height of an object in pixels to set */ - void SetImageObjPropL( const TDesC& aFullFileName, + void SetImageObjPropL( const CMTPObjectMetaData& aObject, const TUint32 aWidth, const TUint32 aHeight ); @@ -154,7 +148,7 @@ * @param aWidth, the width of an object in pixels to get * @parem aHeight, the height of an object in pixels to get */ - void GetImageObjPropL( const TDesC& aFullFileName, + void GetImageObjPropL( const CMTPObjectMetaData& aObject, TUint32& aWidth, TUint32& aHeight ); @@ -213,13 +207,15 @@ */ IMPORT_C void CreateDummyFile( const TDesC& aPlaylistName ); + TMPXGeneralCategory Category( const CMTPObjectMetaData& aObject ); + private: - CMmMtpDpMetadataAccessWrapper( RFs& aRfs, MMTPDataProviderFramework& aFramework ); + CMmMtpDpMetadataAccessWrapper( MMTPDataProviderFramework& aFramework ); void ConstructL(); - TMPXGeneralCategory Category( const TUint aFormatCode ); + TMPXGeneralCategory ContainerCategory( const TDesC& aFullFileName ); /** * Remove all dummy file of which format is "pla", and leave the "m3u" @@ -227,13 +223,12 @@ void RemoveDummyFiles(); private: - // Data - RFs& iRfs; CMmMtpDpMetadataMpxAccess* iMmMtpDpMetadataMpxAccess; CMmMtpDpMetadataVideoAccess* iMmMtpDpMetadataVideoAccess; TBool iOpenSession; MMTPDataProviderFramework& iFramework; + RFs& iFs; // should not remove this member data!!! CDesCArray* iAbstractMediaArray; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h --- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpmetadatampxaccess.h Fri Apr 02 16:24:05 2010 +0100 @@ -47,8 +47,7 @@ { public: - static CMmMtpDpMetadataMpxAccess* NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ); + static CMmMtpDpMetadataMpxAccess* NewL( RFs& aRfs ); /** * Destructor @@ -80,7 +79,7 @@ * @param aCategory, specify the category * @return, name of the source, ownership transferred */ - HBufC* CMmMtpDpMetadataMpxAccess::GetAbstractMediaNameL( CMPXMedia* aAbstractMedia, + HBufC* GetAbstractMediaNameL( CMPXMedia* aAbstractMedia, TMPXGeneralCategory aCategory ); /** @@ -99,17 +98,18 @@ /** * Set abstract media to DB - * @param aAbstractMediaFileName, full file name of abstract media file + * @param aRefOwnerName, full file name of abstract media file * @param aRefFileArray, a array to store the full file name of media files * @param aCategory, indicate the category of abstract media */ - void SetAbstractMediaL( const TDesC& aAbstractMediaFileName, + void SetReferenceL( const TDesC& aRefOwnerName, CDesCArray& aRefFileArray, TMPXGeneralCategory aCategory ); void GetObjectMetadataValueL( const TUint16 aPropCode, MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ); + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ); /** * Set object property and updated object in DB according property code, @@ -122,19 +122,8 @@ */ void SetObjectMetadataValueL( const TUint16 aPropCode, const MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ); - - /** - * Set object property and updated object in DB according property code, - * only for update, not for creation - * @param aPropCode, property code of aObjectMetaData - * @param aNewData, object property value which will be set into - * aObjectMetaData - * @param aSuid, full file name of object of which properties need to set - */ - void SetObjectMetadataValueL( const TUint16 aPropCode, - const MMTPType& aNewData, - const TDesC& aSuid ); + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ); CMPXMedia* FindWMPMediaLC( TMPXAttributeData aWMPMediaID, TBool aFlag ); @@ -158,11 +147,11 @@ * Rename the filename onto MPX DB * @param aOldFileName, the old file to rename * @param aNewFileName, the new file name - * @param aFormatCode, the format of object + * @param aCategory, the category of object */ void RenameObjectL( const TDesC& aOldFileName, const TDesC& aNewFileName, - TUint aFormatCode ); + TMPXGeneralCategory aCategory ); /** * Set current drive info @@ -185,8 +174,7 @@ TBool IsExistL( const TDesC& aSuid ); private: - CMmMtpDpMetadataMpxAccess( RFs& aFs, - MMTPDataProviderFramework& aFramework ); + CMmMtpDpMetadataMpxAccess( RFs& aFs ); void ConstructL(); @@ -210,15 +198,12 @@ MMPXCollectionHelper* CollectionHelperL(); private: - // File server to allow file access RFs& iRfs; TBuf iStoreRoot; MMPXCollectionHelper* iCollectionHelper; - MMTPDataProviderFramework& iFramework; - #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) CMmMtpDpPerfLog* iPerfLog; #endif diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl --- a/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/cmmmtpdpperflog.inl Fri Apr 02 16:24:05 2010 +0100 @@ -71,10 +71,13 @@ VA_LIST list; VA_START( list, aFmt ); - TBuf buf; - - buf.AppendFormatList( aFmt, list, &iOverflowHandler ); - Write( buf ); + HBufC* buf = HBufC::New( KMtpLogBufferSize ); + if ( buf ) + { + buf->Des().AppendFormatList( aFmt, list, &iOverflowHandler ); + Write( *buf ); + delete buf; + } } void CMmMtpDpPerfLog::Start( const TDesC& aDescription ) @@ -187,9 +190,11 @@ if (totalTimeValue <= 0xFFFFFFFF) { + //Define the ptr on stack to avoid compiling warnning for wiscw udeb + TPtrC ptr( iDescription[index] ); WriteFormat( _L( "%S-%S, usage = %u, last time = %u.%S ms, total time = %u.%S ms, average time = %u.%S ms" ), iTitle, - &iDescription[index], + &ptr, iTotalUsage[index], lastTimeValue, &lastTimeDecimal, @@ -200,9 +205,11 @@ } else { + //Define the ptr on stack to avoid compiling warnning for wiscw udeb + TPtrC ptr( iDescription[index] ); WriteFormat( _L( "%S-%S, usage = %u, last time = %u.%S ms, total time = %u%u.%S ms, average time = %u.%S ms" ), iTitle, - &iDescription[index], + &ptr, iTotalUsage[index], lastTimeValue, &lastTimeDecimal, diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh --- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdp_variant.hrh Fri Apr 02 16:24:05 2010 +0100 @@ -25,4 +25,7 @@ // flag to enable replace the exist object #undef MMMTPDP_REPLACE_EXIST_FILE +// flag to enable support for non embedded album art, should be ON by default +#define MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + #endif // MMMTPDP_VARIANT_HRH diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h --- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdpfiledefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -29,6 +29,7 @@ //-------------------------------------------------------------------------------------------- _LIT( KTxtExtension3GP, ".3gp" ); +_LIT( KTxtExtension3G2, ".3g2" ); _LIT( KTxtExtensionAAC, ".aac" ); _LIT( KTxtExtensionASF, ".asf" ); _LIT( KTxtExtensionM4A, ".m4a" ); @@ -41,6 +42,7 @@ _LIT( KTxtExtensionO4V, ".o4v" ); _LIT( KTxtExtensionODF, ".odf" ); +_LIT( KTxtExtensionALB, ".alb" ); _LIT( KTxtExtensionM3U, ".m3u" ); _LIT( KTxtExtensionPLA, ".pla" ); _LIT( KTxtExtensionVIR, ".vir" ); // virtual playlist from MPX @@ -49,6 +51,7 @@ _LIT(KFormatExtensionWMA, "0xb901:wma"); _LIT(KFormatExtensionMP4, "0xb982:mp4"); _LIT(KFormatExtension3GP, "0xb984:3gp"); +_LIT(KFormatExtension3G2, "0xb984:3g2"); _LIT(KFormatExtensionAAC, "0xb903:aac"); _LIT(KFormatExtensionWAV, "0x3008:wav"); _LIT(KFormatExtensionWMV, "0xb981:wmv"); @@ -64,6 +67,9 @@ _LIT(KFormatExtensionO4A, "0xB984:o4a"); _LIT(KFormatExtensionO4V, "0xB984:o4v"); +//Abstract Album +_LIT(KFormatExtensionALB, "0xBA03:alb"); + //Playlists _LIT(KFormatExtensionM3U, "0xba11:m3u"); _LIT(KFormatExtensionPLA, "0xBA05:pla"); @@ -93,7 +99,8 @@ { EMTPSubFormatCodeUnknown, EMTPSubFormatCodeAudio, - EMTPSubFormatCodeVideo + EMTPSubFormatCodeVideo, + EMTPSubFormatCodeUndefine }; #endif // MMMTPDPFILEDEFS_H diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h --- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpdputility.h Fri Apr 02 16:24:05 2010 +0100 @@ -24,8 +24,7 @@ #include "mmmtpdpfiledefs.h" // forward declacration -class CMTPObjectMetaData; -class MMTPDataProviderFramework; +class RFs; class MmMtpDpUtility { @@ -52,31 +51,6 @@ static TBool HasReference( TUint16 aObjFormatCode ); /** - * Utility function to decide if the file is video. - * @param aFullFileName, the full file name - * @return TBool for decide if the file is video - */ - IMPORT_C static TBool IsVideoL( const TDesC& aFullFileName ); - - /** - * Utility function to decide if the file is video. - * For internal use, this is fast version by querying framework DB - * @param aFullFileName, the full file name - * @param aFramework, the mtp framework instance pointer, default is null - * @return TBool for decide if the file is video - */ - static TBool IsVideoL( const TDesC& aFullFileName, const MMTPDataProviderFramework& aFramework ); - - /** - * Utility function to decide if the file is video. - * For internal use, this is fast version by querying framework DB - * @param aFormatCode, - * @param aSubFormatCode, - * @return TBool for decide if the file is video - */ - static TBool IsVideoL( TUint aFormatCode, TUint aSubFormatCode ); - - /** * Check the filename length to see if it exceeds Symbian 256 limit. * @param aPathName, the path name of the file * @param aFileName, the file to be check @@ -99,7 +73,7 @@ * @param aFullFileName, fine name * @return TTime for specified file */ - static TTime GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName ); + static void GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName, TDes& aDateModified ); /** * Check if file is read-only, if file doesn't exist, leave @@ -161,7 +135,7 @@ * @param aSubFormatCode, output the sub format code * @return if success, return KErrNone, otherwise, error code */ - static TInt SubFormatCodeFromMime( const TDesC8& aMimeType, TMmMtpSubFormatCode& aSubFormatCode ); + static TMmMtpSubFormatCode SubFormatCodeFromMime( const TDesC8& aMimeType ); /** * Get DRM status diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h --- a/mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/mmmtpvideodbdefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -53,13 +53,12 @@ _LIT( KMtpVideoEncodingProfile, "EncodingProfile" ); _LIT( KMtpVideoParentalRating, "ParentalRating" ); -_LIT( KMtpVideoUseCount , "UseCount" ); _LIT( KMtpVideoDRM, "DRM" ); _LIT( KMtpVideoDeleted, "Deleted" ); // field type -_LIT( KMtpVideoLocationType, " CHAR (255) NOT NULL" ); +_LIT( KMtpVideoLocationType, " LONG VARCHAR NOT NULL" ); _LIT( KMtpVideoNameType, " LONG VARCHAR" ); _LIT( KMtpVideoArtistType, " LONG VARCHAR" ); _LIT( KMtpVideoTrackType, " UNSIGNED SMALLINT" ); @@ -86,7 +85,6 @@ _LIT( KMtpVideoEncodingProfileType, " LONG VARCHAR" ); _LIT( KMtpVideoParentalRatingType, " LONG VARCHAR" ); -_LIT( KMtpVideoUseCountType, " UNSIGNED INTEGER" ); _LIT( KMtpVideoDRMType, " UNSIGNED SMALLINT" ); _LIT( KMtpVideoDeletedType, " BIT" ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h --- a/mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/inc/tobjectdescription.h Fri Apr 02 16:24:05 2010 +0100 @@ -23,6 +23,11 @@ // vendor extended property code const TUint16 EMTPExtObjectPropCodeOmaDrmStatus = 0xDB01; +const TUint32 KMTPMaxDescriptionLen = 0x00000100; // 256 +const TInt KMtpMaxStringLength = 255; +const TInt KMtpMaxDateTimeStringLength = 15; +_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); + struct TObjectDescription { @@ -33,6 +38,7 @@ enum TGroupCodeType { EGroupCodeGeneral = 0x00000001, + EGroupCodeSample = 0x00000100, EGroupCodeMediaDB = 0x00FF0000, EGroupCodeNotDefined = 0xFFFFFFFF // TODO: need to reconsider }; @@ -40,6 +46,7 @@ static const TGroupCodeType KSupportedGroupCode[] = { EGroupCodeGeneral, + EGroupCodeSample, EGroupCodeMediaDB }; @@ -57,14 +64,25 @@ { EMTPObjectPropCodeNonConsumable, EGroupCodeGeneral }, // The first group, addtional for all + { EMTPObjectPropCodeName, EGroupCodeGeneral }, // only for winlogo { EMTPObjectPropCodeDateCreated, EGroupCodeGeneral }, { EMTPObjectPropCodeDateModified, EGroupCodeGeneral }, - // The second group, additional for all - { EMTPObjectPropCodeName, EGroupCodeMediaDB }, + // The first group, mandatory for video + { EMTPObjectPropCodeWidth, EGroupCodeGeneral }, // only for winlogo + { EMTPObjectPropCodeHeight, EGroupCodeGeneral }, // only for winlogo + + // The second group, for non-embedded album art + { EMTPObjectPropCodeRepresentativeSampleFormat, EGroupCodeGeneral }, // changed for winlogo + { EMTPObjectPropCodeRepresentativeSampleSize, EGroupCodeGeneral }, // changed for winlogo + { EMTPObjectPropCodeRepresentativeSampleHeight, EGroupCodeGeneral }, // changed for winlogo + { EMTPObjectPropCodeRepresentativeSampleWidth, EGroupCodeGeneral }, // changed for winlogo + { EMTPObjectPropCodeRepresentativeSampleData, EGroupCodeGeneral }, // changed for winlogo + + // The third group, additional for all { EMTPObjectPropCodeDateAdded, EGroupCodeMediaDB }, - // The second group, mandatory for audio + // The third group, mandatory for audio { EMTPObjectPropCodeArtist, EGroupCodeMediaDB }, { EMTPObjectPropCodeTrack, EGroupCodeMediaDB }, { EMTPObjectPropCodeGenre, EGroupCodeMediaDB }, @@ -77,11 +95,9 @@ { EMTPObjectPropCodeOriginalReleaseDate, EGroupCodeMediaDB }, { EMTPObjectPropCodeDescription, EGroupCodeMediaDB }, { EMTPObjectPropCodeComposer, EGroupCodeMediaDB }, + { EMTPObjectPropCodeAlbumArtist, EGroupCodeMediaDB }, - // The second group, mandatory for video - { EMTPObjectPropCodeWidth, EGroupCodeMediaDB }, - { EMTPObjectPropCodeHeight, EGroupCodeMediaDB }, - { EMTPObjectPropCodeUseCount, EGroupCodeMediaDB }, + // The third group, mandatory for video { EMTPObjectPropCodeScanType, EGroupCodeMediaDB }, { EMTPObjectPropCodeVideoFourCCCodec, EGroupCodeMediaDB }, { EMTPObjectPropCodeVideoBitRate, EGroupCodeMediaDB }, @@ -89,7 +105,7 @@ { EMTPObjectPropCodeKeyFrameDistance, EGroupCodeMediaDB }, { EMTPObjectPropCodeEncodingProfile, EGroupCodeMediaDB }, - // The second group, additional for video + // The third group, additional for video { EMTPObjectPropCodeParentalRating, EGroupCodeMediaDB }, { EMTPObjectPropCodeDRMStatus, EGroupCodeMediaDB }, { EMTPExtObjectPropCodeOmaDrmStatus, EGroupCodeMediaDB } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpstub.pkg Binary file mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpstub.pkg has changed diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpupdate.pkg Binary file mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpupdate.pkg has changed diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpupdatedebug.pkg Binary file mmappcomponents/mmmtpdataprovider/install/rom/mmmtpdpupdatedebug.pkg has changed diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/group/abstractmediamtpdataprovider.mmp Fri Apr 02 16:24:05 2010 +0100 @@ -43,7 +43,6 @@ SOURCE cabstractmediamtpdataprovidergetobjectpropvalue.cpp SOURCE cabstractmediamtpdataprovidergetobjectproplist.cpp SOURCE cabstractmediamtpdataprovidersetobjectpropvalue.cpp -SOURCE cabstractmediamtpdataprovidersetobjectreferences.cpp SOURCE cabstractmediamtpdataproviderabstractmediapreference.cpp SOURCE cabstractmediamtpdataprovidercopyobject.cpp SOURCE cabstractmediamtpdataprovidermoveobject.cpp diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderconst.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,6 +19,34 @@ #define ABSTRACTMEDIAMTPDATAPROVIDERCONST_H #include +#include "mmmtpdp_variant.hrh" + +enum TMmMtpSampleSizeRange + { + EMTPMinSampleSize = 0x00000001, // 1 bytes + EMTPMaxSampleSize = 0x00010000, // 64 kb + EMTPStepSampleSize = 0x00000001 // 1 byte + }; + +enum TMmMtpSampleHeightRange + { + EMTPSampleMinHeight = 0x00000001, // 1 pixel + EMTPSampleMaxHeight = 0x00000168, // 360 pixel + EMTPSampleStepHeight = 0x00000001 // 1 pixel + }; + +enum TMmMtpSampleWidthRange + { + EMTPSampleMinWidth = 0x00000001, // 1 pixel + EMTPSampleMaxWidth = 0x00000168, // 360 pixel + EMTPSampleStepWidth = 0x00000001 // 1 pixel + }; + +// Supported sample format +static const TUint16 TMmMtpSupportedSampleFormat[] = + { + EMTPFormatCodeEXIFJPEG + }; const TUint16 EMTPExtOpCodeAbstractMediaPreference = 0x9203; @@ -27,6 +55,9 @@ */ static const TUint16 KAbstractMediaMtpDataProviderSupportedFormats[] = { +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + EMTPFormatCodeAbstractAudioAlbum, +#endif EMTPFormatCodeM3UPlaylist, EMTPFormatCodeAbstractAudioVideoPlaylist }; @@ -64,4 +95,15 @@ EMTPOpCodeGetFormatCapabilities }; +// Mandatory properties for ALB +static const TUint16 KMmMtpDpSupportedPropMandatoryALB[] = + { + EMTPObjectPropCodeRepresentativeSampleFormat, + EMTPObjectPropCodeRepresentativeSampleSize, + EMTPObjectPropCodeRepresentativeSampleHeight, + EMTPObjectPropCodeRepresentativeSampleWidth, + EMTPObjectPropCodeRepresentativeSampleData, + EMTPObjectPropCodeAlbumArtist + }; + #endif // ABSTRACTMEDIAMTPDATAPROVIDERCONST_H diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/abstractmediamtpdataproviderprocessor.h Fri Apr 02 16:24:05 2010 +0100 @@ -22,7 +22,6 @@ // class forward class MMTPConnection; class TMTPTypeRequest; -class MMTPDataProviderFramework; class MMmRequestProcessor; class MMmMtpDpConfig; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovider.h Fri Apr 02 16:24:05 2010 +0100 @@ -24,6 +24,7 @@ #include "abstractmediamtpdataproviderprocessor.h" #include "mmmtpenumerationcallback.h" #include "mmmtpdpconfig.h" +#include "mmmtpdp_variant.hrh" // Forward declaration class MMmRequestProcessor; @@ -178,6 +179,8 @@ void GetSupportedPropertiesL(); + void GetAllSupportedPropL(); + private: // data RPointerArray iActiveProcessors; @@ -192,7 +195,11 @@ RArray iSupportedFormat; - RArray iSupportedProperties; +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + RArray iSupportedPropAbstractAlbum; +#endif + RArray iSupportedPropPlaylist; + RArray iSupportedPropAll; CPropertySettingUtility* iPropSettingUtility; CDescriptionUtility* iDescriptionUtility; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderdescriptionutility.h Fri Apr 02 16:24:05 2010 +0100 @@ -53,14 +53,35 @@ CMTPTypeObjectPropDesc* NewSpecificPropDescL( TUint aFormatCode, TUint16 aPropCode ); private: - // Example for further extension + /** + * Construct property description of SampleFormat. + * @return Property description dataset of sample format. + */ + CMTPTypeObjectPropDesc* NewRepresentativeSampleFormatL(); + + /** + * Construct property description of SampleSize. + * @return Property description dataset of sample size. + */ + CMTPTypeObjectPropDesc* NewRepresentativeSampleSizeL(); + /** - * Construct audio wave codec property description. - * @param aFormatCode - * @return Property description dataset of audio wave codec. + * Construct property description of SampleHeight. + * @return Property description dataset of sample height. */ - // CMTPTypeObjectPropDesc* NewAudioWaveCodecPropDescL( TUint aFormatCode ); - + CMTPTypeObjectPropDesc* NewRepresentativeSampleHeightL(); + + /** + * Construct property description of SampleWidth. + * @return Property description dataset of sample width. + */ + CMTPTypeObjectPropDesc* NewRepresentativeSampleWidthL(); + + /** + * Construct property description of SampleData. + * @return Property description dataset of sample data. + */ + CMTPTypeObjectPropDesc* NewRepresentativeSampleDataL(); }; #endif // CABSTRACTMEDIAMTPDATAPROVIDERDESCRIPTIONUTILITY_H diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataproviderenumerator.h Fri Apr 02 16:24:05 2010 +0100 @@ -74,6 +74,14 @@ TInt RunError( TInt aError ); private: + + enum TEnumState + { + EEnumPlaylist, + EEnumAbstractAlbum, + EEnumCount + }; + /** * Standard C++ Constructor * @param aFramework Reference to MMTPDataProviderFramework @@ -90,7 +98,7 @@ void SignalCompleteL( MMTPEnumerationCallback& aCallback, TInt aError = KErrNone ); - void ScanStorageL( TUint32 aStorageId ); + void InitStorageL( ); /** * Scan next storage @@ -134,6 +142,7 @@ CMPXMediaArray* iAbstractMedias; TInt iCount; TInt iCurrentIndex; + TInt iEnumState; #if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) CMmMtpDpPerfLog* iPerfLog; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovidersetobjectreferences.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/inc/cabstractmediamtpdataprovidersetobjectreferences.h Fri Feb 26 18:11:38 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* -* Copyright (c) 2009 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: Set object references operation. -* -*/ - - -#ifndef CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H -#define CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H - -#include "csetobjectreferences.h" - -/** -* Defines abstract media data provider SetObjectReferences request processor -*/ -class CAbstractMediaMtpDataProviderSetObjectReferences : public CSetObjectReferences - { -public: - /** - * Two-phase construction method - * @param aFramework The data provider framework - * @param aConnection The connection from which the request comes - * @param aWrapper medadata access interface - * @return a pointer to the created request processor object - */ - static MMmRequestProcessor* NewL( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection, - MMmMtpDpConfig& aDpConfig ); - - /** - * Destructor - */ - ~CAbstractMediaMtpDataProviderSetObjectReferences(); - -private: - /** - * Standard c++ constructor - * @param aFramework The data provider framework - * @param aConnection The connection from which the request comes - * @param aWrapper medadata access interface - */ - CAbstractMediaMtpDataProviderSetObjectReferences( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection, - MMmMtpDpConfig& aDpConfig ); - - /** - * two-phase construction - */ - void ConstructL(); - -protected: - // from CSetObjectPropValue - /** - * set references to DB - * @param aWrapper medadata access interface - * @param aObjectFormat the format of the file - * @param aSrcFileName file name, from - * @param aRefFileArray the array of file names, to - */ - void DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper, - TUint16 aObjectFormat, - const TDesC& aSrcFileName, - CDesCArray& aRefFileArray ); - - }; - -#endif // CABSTRACTMEDIAMTPDATAPROVIDERSETOBJECTREFERENCES_H diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/abstractmediamtpdataproviderprocessor.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -38,7 +38,7 @@ #include "cabstractmediamtpdataprovidersetobjectpropvalue.h" #include "csetobjectproplist.h" #include "cgetobjectreferences.h" -#include "cabstractmediamtpdataprovidersetobjectreferences.h" +#include "csetobjectreferences.h" #include "cdeleteobject.h" #include "cabstractmediamtpdataprovidercopyobject.h" #include "cabstractmediamtpdataprovidermoveobject.h" @@ -63,7 +63,7 @@ { EMTPOpCodeSetObjectPropValue, CAbstractMediaMtpDataProviderSetObjectPropValue::NewL }, { EMTPOpCodeSetObjectPropList, CSetObjectPropList::NewL }, //SetObjectPropList { EMTPOpCodeGetObjectReferences, CGetObjectReferences::NewL }, //Get Object References - { EMTPOpCodeSetObjectReferences, CAbstractMediaMtpDataProviderSetObjectReferences::NewL }, //Set Object References + { EMTPOpCodeSetObjectReferences, CSetObjectReferences::NewL }, //Set Object References { EMTPOpCodeDeleteObject, CDeleteObject::NewL }, //DeleteObject { EMTPOpCodeCopyObject, CAbstractMediaMtpDataProviderCopyObject::NewL }, // Copy Object { EMTPOpCodeMoveObject, CAbstractMediaMtpDataProviderMoveObject::NewL }, // Move Object diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovider.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -76,7 +76,11 @@ iActiveProcessor( -1 ), iRenameObject( NULL ), iSupportedFormat( KAbstractMediaMtpDpArrayGranularity ), - iSupportedProperties( KAbstractMediaMtpDpArrayGranularity ) +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + iSupportedPropAbstractAlbum( KAbstractMediaMtpDpArrayGranularity ), +#endif + iSupportedPropPlaylist( KAbstractMediaMtpDpArrayGranularity ), + iSupportedPropAll( KAbstractMediaMtpDpArrayGranularity ) { // Do nothing } @@ -108,7 +112,11 @@ delete iRenameObject; iSupportedFormat.Close(); - iSupportedProperties.Close(); +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + iSupportedPropAbstractAlbum.Close(); +#endif + iSupportedPropPlaylist.Close(); + iSupportedPropAll.Close(); PRINT( _L( "MM MTP => CAbstractMediaMtpDataProvider::~CAbstractMediaMtpDataProvider" ) ); } @@ -129,10 +137,11 @@ iAbstractMediaEnumerator = CAbstractMediaMtpDataProviderEnumerator::NewL( Framework(), *this ); - CMmMtpDpAccessSingleton::CreateL( Framework().Fs(), Framework() ); + CMmMtpDpAccessSingleton::CreateL( Framework() ); GetSupportedFormatL(); GetSupportedPropertiesL(); + GetAllSupportedPropL(); iPropSettingUtility = CAbstractMediaMtpDataProviderPropertySettingUtility::NewL(); iDescriptionUtility = CAbstractMediaMtpDataProviderDescriptionUtility::NewL(); @@ -238,24 +247,23 @@ iIsSessionOpen = EFalse; TInt count = iActiveProcessors.Count(); PRINT1( _L( "MM MTP => CAbstractMediaMtpDataProvider::SessionClosedL, total processor count = %d" ), count ); - for ( TInt i = 0; i < count; i++ ) + while ( count-- ) { - MMmRequestProcessor* processor = iActiveProcessors[i]; + MMmRequestProcessor* processor = iActiveProcessors[count]; - // replaced for the Request() is invalid sometimes - // TUint32 sessionId( processor->Request().Uint32( TMTPTypeRequest::ERequestSessionID ) ); TUint32 sessionId = processor->SessionId(); if ( ( sessionId == aSession.iMTPId ) && ( processor->Connection().ConnectionId() - == aSession.iConnection.ConnectionId() ) ) + == aSession.iConnection.ConnectionId() ) ) { processor->UsbDisconnect(); // Rollback - iActiveProcessors.Remove( i ); - if ( i == iActiveProcessor ) + iActiveProcessors.Remove( count ); + if ( count == iActiveProcessor ) { iActiveProcessorRemoved = ETrue; + iActiveProcessor = -1; // update iActiveProcessor } else { @@ -361,11 +369,11 @@ case EObjectProperties: { - TInt count = iSupportedProperties.Count(); + TInt count = iSupportedPropAll.Count(); for ( TInt i = 0; i < count; i++ ) { - aArray.Append( iSupportedProperties[i] ); + aArray.Append( iSupportedPropAll[i] ); } PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProvider::Supported properties count = %d" ), aArray.Count() ); } @@ -393,7 +401,9 @@ { if( aCategory == EFormatExtensionSets ) { - //EMTPFormatCodeM3U, +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + aStrings.AppendL(KFormatExtensionALB); +#endif aStrings.AppendL(KFormatExtensionM3U); aStrings.AppendL(KFormatExtensionPLA); aStrings.AppendL(KFormatExtensionVIR); @@ -528,10 +538,24 @@ } } -const RArray* CAbstractMediaMtpDataProvider::GetSupportedPropertiesL( TUint32 /*aFormatCode*/ ) const +const RArray* CAbstractMediaMtpDataProvider::GetSupportedPropertiesL( TUint32 aFormatCode ) const { - // May need add more implementation here for further extension. - return &iSupportedProperties; + if ( ( aFormatCode == EMTPFormatCodeM3UPlaylist ) || ( aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist ) ) + { + return &iSupportedPropPlaylist; + } +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + else if ( aFormatCode == EMTPFormatCodeAbstractAudioAlbum ) + { + return &iSupportedPropAbstractAlbum; + } +#endif + else + { + User::Leave( KErrNotSupported ); + } + // should never run to this line, just for avoiding warning. + return NULL; } // --------------------------------------------------------------------------- @@ -541,20 +565,37 @@ // void CAbstractMediaMtpDataProvider::GetSupportedPropertiesL() { - iSupportedProperties.Reset(); +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + iSupportedPropAbstractAlbum.Reset(); +#endif + iSupportedPropPlaylist.Reset(); TInt count = 0, i = 0; count = sizeof( KMmMtpDpSupportedPropMandatoryAll ) / sizeof( TUint16 ); for ( i = 0; i < count; i++ ) { - InsertL( iSupportedProperties, KMmMtpDpSupportedPropMandatoryAll[i] ); +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropMandatoryAll[i] ); +#endif + InsertL( iSupportedPropPlaylist, KMmMtpDpSupportedPropMandatoryAll[i] ); } count = sizeof( KMmMtpDpSupportedPropAdditionalAll ) / sizeof( TUint16 ); for ( i = 0; i < count; i++ ) { - InsertL( iSupportedProperties, KMmMtpDpSupportedPropAdditionalAll[i] ); +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropAdditionalAll[i] ); +#endif + InsertL( iSupportedPropPlaylist, KMmMtpDpSupportedPropAdditionalAll[i] ); } + +#ifdef MMMTPDP_ABSTRACTAUDIOALBUM_SUPPORT + count = sizeof( KMmMtpDpSupportedPropMandatoryALB ) / sizeof( TUint16 ); + for ( i = 0; i < count; i++ ) + { + InsertL( iSupportedPropAbstractAlbum, KMmMtpDpSupportedPropMandatoryALB[i] ); + } +#endif } // --------------------------------------------------------------------------- @@ -564,7 +605,31 @@ // const RArray* CAbstractMediaMtpDataProvider::GetAllSupportedProperties() const { - return &iSupportedProperties; + return &iSupportedPropAll; + } + +void CAbstractMediaMtpDataProvider::GetAllSupportedPropL() + { + iSupportedPropAll.Reset(); + + TInt count = 0, i = 0; + count = sizeof( KMmMtpDpSupportedPropMandatoryAll ) / sizeof( TUint16 ); + for ( i = 0; i < count; i++ ) + { + InsertL( iSupportedPropAll, KMmMtpDpSupportedPropMandatoryAll[i] ); + } + + count = sizeof( KMmMtpDpSupportedPropAdditionalAll ) / sizeof( TUint16 ); + for ( i = 0; i < count; i++ ) + { + InsertL( iSupportedPropAll, KMmMtpDpSupportedPropAdditionalAll[i] ); + } + + count = sizeof( KMmMtpDpSupportedPropMandatoryALB ) / sizeof( TUint16 ); + for ( i = 0; i < count; i++ ) + { + InsertL( iSupportedPropAll, KMmMtpDpSupportedPropMandatoryALB[i] ); + } } // --------------------------------------------------------------------------- diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderdescriptionutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,10 +16,12 @@ * */ +#include #include #include #include "cabstractmediamtpdataproviderdescriptionutility.h" +#include "abstractmediamtpdataproviderconst.h" #include "mmmtpdpconfig.h" #include "mmmtpdplogger.h" @@ -67,20 +69,156 @@ // Construct media dp specific property description. // ----------------------------------------------------------------------------- // -CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewSpecificPropDescL( TUint /*aFormatCode*/, +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewSpecificPropDescL( TUint aFormatCode, TUint16 aPropCode ) { CMTPTypeObjectPropDesc* propertyDesc = NULL; - - switch ( aPropCode ) + if( aFormatCode == EMTPFormatCodeAbstractAudioAlbum ) { - // format specific - // May need add implementation here for further extension. - default: - // Do nothing now. - break; + switch ( aPropCode ) + { + case EMTPObjectPropCodeRepresentativeSampleFormat: + propertyDesc = NewRepresentativeSampleFormatL(); + break; + + case EMTPObjectPropCodeRepresentativeSampleSize: + propertyDesc = NewRepresentativeSampleSizeL(); + break; + + case EMTPObjectPropCodeRepresentativeSampleHeight: + propertyDesc = NewRepresentativeSampleHeightL(); + break; + + case EMTPObjectPropCodeRepresentativeSampleWidth: + propertyDesc = NewRepresentativeSampleWidthL(); + break; + + case EMTPObjectPropCodeRepresentativeSampleData: + propertyDesc = NewRepresentativeSampleDataL(); + break; + default: + // do nothing + break; + } } return propertyDesc; } +// ----------------------------------------------------------------------------- +// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleFormatL +// +// ----------------------------------------------------------------------------- +// +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleFormatL() + { + CMTPTypeObjectPropDescEnumerationForm* form = + CMTPTypeObjectPropDescEnumerationForm::NewL( EMTPTypeUINT16 ); + CleanupStack::PushL( form ); // + form + + TInt numValues = sizeof ( TMmMtpSupportedSampleFormat ) / sizeof ( TMmMtpSupportedSampleFormat[0] ); + for ( TInt i = 0; i < numValues; i++ ) + { + TMTPTypeUint16 data( TMmMtpSupportedSampleFormat[i] ); + form->AppendSupportedValueL( data ); + } + + CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo; + propertyInfo.iDataType = EMTPTypeUINT16; + propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::EEnumerationForm; + propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly; + CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleFormat, + propertyInfo, + form ); + CleanupStack::PopAndDestroy( form ); // - form + return propertyDesc; + } + +// ----------------------------------------------------------------------------- +// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleSizeL +// +// ----------------------------------------------------------------------------- +// +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleSizeL() + { + CMTPTypeObjectPropDescRangeForm* form = + CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form + + // Set expected values + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPMinSampleSize ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPMaxSampleSize ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPStepSampleSize ); + + CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo; + propertyInfo.iDataType = EMTPTypeUINT32; + propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm; + propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly; + CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleSize, + propertyInfo, + form ); + CleanupStack::PopAndDestroy( form ); // - form + return propertyDesc; + } + +// ----------------------------------------------------------------------------- +// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleHeightL +// +// ----------------------------------------------------------------------------- +// +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleHeightL() + { + CMTPTypeObjectPropDescRangeForm* form = + CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form + + // Set expected values + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPSampleMinHeight ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPSampleMaxHeight ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPSampleStepHeight ); + + CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo; + propertyInfo.iDataType = EMTPTypeUINT32; + propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm; + propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly; + CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleHeight, + propertyInfo, + form ); + CleanupStack::PopAndDestroy( form ); // - form + return propertyDesc; + } + +// ----------------------------------------------------------------------------- +// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleWidthL +// +// ----------------------------------------------------------------------------- +// +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleWidthL() + { + CMTPTypeObjectPropDescRangeForm* form = + CMTPTypeObjectPropDescRangeForm::NewLC( EMTPTypeUINT32 ); // + form + + // Set expected values + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMinimumValue, EMTPSampleMinWidth ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EMaximumValue, EMTPSampleMaxWidth ); + form->SetUint32L( CMTPTypeObjectPropDescRangeForm::EStepSize, EMTPSampleStepWidth ); + + CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo; + propertyInfo.iDataType = EMTPTypeUINT32; + propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::ERangeForm; + propertyInfo.iGetSet = CMTPTypeObjectPropDesc::EReadOnly; + CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleWidth, + propertyInfo, + form ); + CleanupStack::PopAndDestroy( form ); // - form + return propertyDesc; + } + +// ----------------------------------------------------------------------------- +// CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleDataL +// +// ----------------------------------------------------------------------------- +// +CMTPTypeObjectPropDesc* CAbstractMediaMtpDataProviderDescriptionUtility::NewRepresentativeSampleDataL() + { + return CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeRepresentativeSampleData ); + } + // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderenumerator.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -81,7 +81,8 @@ iStorages( KAbstractMediaDpArrayGranularity ), iAbstractMedias( NULL ), iCount( 0 ), - iCurrentIndex( 0 ) + iCurrentIndex( 0 ), + iEnumState ( EEnumPlaylist ) { PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::CAbstractMediaMtpDataProviderEnumerator, iDataProviderId = %d" ), iDataProviderId ); } @@ -180,124 +181,129 @@ // keep in mind for notification when enumeration complete iStorageId = aStorageId; - + iEnumState = EEnumPlaylist; if ( iStorages.Count() > 0 ) { - ScanStorageL( iStorages[0] ); + InitStorageL(); } - else - { - iStorages.Reset(); - SignalCompleteL( iDataProvider ); - } + ScanNextL(); PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::StartL" ) ); } // ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderEnumerator::ScanStorageL -// Find out all AbstractMedia file according to storage id +// CAbstractMediaMtpDataProviderEnumerator::InitStorageL +// Initialize iAbstractMedia, iCount and iCurrentIndex according to iStorages and iEnumState // ----------------------------------------------------------------------------- // -void CAbstractMediaMtpDataProviderEnumerator::ScanStorageL( TUint32 aStorageId ) +void CAbstractMediaMtpDataProviderEnumerator::InitStorageL() { - PRINT1( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::ScanStorageL aStorageId = 0x%x" ), aStorageId ); + __ASSERT_DEBUG(iStorages.Count() > 0 && iEnumState < EEnumCount, User::Invariant() ); + PRINT2( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::InitStorageL storageId = 0x%x, state=%d" ), iStorages[0], iEnumState ); const CMTPStorageMetaData& storage( - iFramework.StorageMgr().StorageL( aStorageId ) ); + iFramework.StorageMgr().StorageL( iStorages[0] ) ); __ASSERT_DEBUG( ( storage.Uint( CMTPStorageMetaData::EStorageSystemType ) == CMTPStorageMetaData::ESystemTypeDefaultFileSystem ), User::Invariant() ); TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) ); - PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL StorageSuid = %S" ), &root ); + PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL StorageSuid = %S" ), &root ); - // created by windows media player, or else return responsecode is Access denied - // Create playlist directory if it does not exist - // NOTE: Only playlist need to create directory here, for the dummy files - HBufC* tempBuf = HBufC::NewLC( KMaxFileName ); // + tempBuf - TPtr folder = tempBuf->Des(); - folder.Zero(); - folder.Append( root ); - folder.Append( KPlaylistFilePath ); - TBool ret = BaflUtils::FileExists( iFramework.Fs(), folder ); - PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL ret = %d, folder = %S" ), ret, &folder ); - if( !ret ) + if ( iEnumState == EEnumPlaylist ) { - TInt err = iFramework.Fs().MkDirAll( folder ); - PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::ScanStorageL Creating folder (%S) returned error %d" ), tempBuf, err ); + // created by windows media player, or else return responsecode is Access denied + // Create playlist directory if it does not exist + // NOTE: Only playlist need to create directory here, for the dummy files + HBufC* tempBuf = HBufC::NewLC( KMaxFileName ); // + tempBuf + TPtr folder = tempBuf->Des(); + folder.Zero(); + folder.Append( root ); + folder.Append( KPlaylistFilePath ); + TBool ret = BaflUtils::FileExists( iFramework.Fs(), folder ); + PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL ret = %d, folder = %S" ), ret, &folder ); + if( !ret ) + { + TInt err = iFramework.Fs().MkDirAll( folder ); + PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::InitStorageL Creating folder (%S) returned error %d" ), tempBuf, err ); - // add this new folder to framework metadata DB - CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC( 0, // Dev Dp hard code - EMTPFormatCodeAssociation, - aStorageId, - folder ); // + object - object->SetUint( CMTPObjectMetaData::EParentHandle, KMTPHandleNoParent ); - object->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPAssociationTypeGenericFolder ); - PERFLOGSTART( KObjectManagerInsert ); - iObjectMgr.InsertObjectL( *object ); - PERFLOGSTOP( KObjectManagerInsert ); - CleanupStack::PopAndDestroy( object ); // - object + // add this new folder to framework metadata DB + CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC( 0, // Dev Dp hard code + EMTPFormatCodeAssociation, + iStorages[0], + folder ); // + object + object->SetUint( CMTPObjectMetaData::EParentHandle, KMTPHandleNoParent ); + object->SetUint( CMTPObjectMetaData::EFormatSubCode, EMTPAssociationTypeGenericFolder ); + PERFLOGSTART( KObjectManagerInsert ); + iObjectMgr.InsertObjectL( *object ); + PERFLOGSTOP( KObjectManagerInsert ); + CleanupStack::PopAndDestroy( object ); // - object + } + CleanupStack::PopAndDestroy( tempBuf ); // - tempBuf } - CleanupStack::PopAndDestroy( tempBuf ); // - tempBuf // find all abstract medias stored in MPX delete iAbstractMedias; iAbstractMedias = NULL; + TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum; PERFLOGSTART( KMpxGetAllAbstractMedia ); - TRAPD( err, iDataProvider.GetWrapperL().GetAllAbstractMediaL( root, &iAbstractMedias, EMPXPlaylist ) ); + TRAPD( err, iDataProvider.GetWrapperL().GetAllAbstractMediaL( root, &iAbstractMedias, category ) ); PERFLOGSTOP( KMpxGetAllAbstractMedia ); if ( iAbstractMedias != NULL && err == KErrNone ) { iCount = iAbstractMedias->Count(); - iCurrentIndex = 0; - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, iStatus.Int() ); - SetActive(); } else { iCount = 0; - iCurrentIndex = 0; - ScanNextL(); } + iCurrentIndex = 0; - PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::ScanStorageL" ) ); + PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::InitStorageL" ) ); } // ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderEnumerator::ScanNextStorageL -// +// CAbstractMediaMtpDataProviderEnumerator::ScanNextL +// Proceed to next abstract media item // ----------------------------------------------------------------------------- // void CAbstractMediaMtpDataProviderEnumerator::ScanNextL() { - PRINT1( _L( "MM MTP => CAbstractMediaMtpDataProviderEnumerator::ScanNextL iStorages.Count = %d" ), iStorages.Count() ); - if ( iCurrentIndex < iCount ) + while (iStorages.Count() > 0) { - TRequestStatus* status = &iStatus; - User::RequestComplete( status, iStatus.Int() ); - SetActive(); - - PRINT2( _L( "MM MTP <> Current storage is still being scanned, current index = %d, total AbstractMedia count = %d" ), - iCurrentIndex, - iCount ); + while ( iEnumState < EEnumCount ) + { + if ( iCurrentIndex < iCount ) + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, iStatus.Int() ); + SetActive(); + PRINT2( _L( "MM MTP <> Current storage is still being scanned, current index = %d, total AbstractMedia count = %d" ), + iCurrentIndex, + iCount ); + return; + } + ++iEnumState; + if (iEnumState == EEnumCount) + { + break; + } + InitStorageL(); + } + iStorages.Remove( 0 ); + if (iStorages.Count() == 0) + { + break; + } + iEnumState = EEnumPlaylist; + InitStorageL(); } - // If there are one or more unscanned storages left - // (the currently scanned one is still on the list) - else if ( iStorages.Count() > 1 ) - { - iStorages.Remove( 0 ); - ScanStorageL( iStorages[0] ); - } - else - { - // We are done - PRINT( _L( "MM MTP <> Objects enumeration completed 2" ) ); - iStorages.Reset(); - SignalCompleteL( iDataProvider ); - } + // We are done + PRINT( _L( "MM MTP <> Objects enumeration completed" ) ); + delete iAbstractMedias; + iAbstractMedias = NULL; + iStorages.Reset(); + SignalCompleteL( iDataProvider ); } // ----------------------------------------------------------------------------- @@ -314,23 +320,35 @@ // Increase the index first in case of leave iCurrentIndex++; - - HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, EMPXPlaylist ); + TMPXGeneralCategory category = ( iEnumState == EEnumPlaylist ) ? EMPXPlaylist : EMPXAbstractAlbum; + HBufC* abstractMedia = iDataProvider.GetWrapperL().GetAbstractMediaNameL( media, category ); CleanupStack::PushL( abstractMedia ); // + abstractMedia - AddEntryL( *abstractMedia ); - - // find all reference of each abstract media - CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity ); - CleanupStack::PushL( references ); // + references + TBool ret = ETrue; + if ( iEnumState == EEnumAbstractAlbum ) + { + //The abstract album may be removed, check it first + ret = BaflUtils::FileExists( iFramework.Fs(), *abstractMedia ); + PRINT2( _L( "MM MTP <> BaflUtils::FileExists( RFs,%S ) ret = %d" ), abstractMedia, ret ); + } - PERFLOGSTART( KMpxQueryAbstractMediaReference ); - iDataProvider.GetWrapperL().GetAllReferenceL( media, *references ); - PERFLOGSTOP( KMpxQueryAbstractMediaReference ); + if ( ret ) + { + PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::RunL abstractMedia=%S" ), abstractMedia ); + AddEntryL( *abstractMedia ); - // insert references into reference db - AddReferencesL( *abstractMedia, *references ); - - CleanupStack::PopAndDestroy( references ); // - references + // find all reference of each abstract media + CDesCArray* references = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity ); + CleanupStack::PushL( references ); // + references + + PERFLOGSTART( KMpxQueryAbstractMediaReference ); + iDataProvider.GetWrapperL().GetAllReferenceL( media, *references ); + PERFLOGSTOP( KMpxQueryAbstractMediaReference ); + + // insert references into reference db + AddReferencesL( *abstractMedia, *references ); + + CleanupStack::PopAndDestroy( references ); // - references + } CleanupStack::PopAndDestroy( abstractMedia ); // - abstractMedia ScanNextL(); @@ -392,6 +410,7 @@ PERFLOGSTART( KObjectManagerObjectUid ); TUint32 parentHandle = iFramework.ObjectMgr().HandleL( parser.DriveAndPath() ); PERFLOGSTOP( KObjectManagerObjectUid ); + object->SetUint( CMTPObjectMetaData::EParentHandle, parentHandle ); PERFLOGSTART( KObjectManagerInsert ); @@ -400,10 +419,14 @@ CleanupStack::PopAndDestroy( object );// - object - iDataProvider.GetWrapperL().CreateDummyFile( aSuid ); + //Only remember the playlist file for clean up + if( iEnumState == EEnumPlaylist ) + { + iDataProvider.GetWrapperL().CreateDummyFile( aSuid ); - // remember the abstract media file for clean up - iDataProvider.GetWrapperL().AddDummyFileL( aSuid ); + // remember the abstract media file for clean up + iDataProvider.GetWrapperL().AddDummyFileL( aSuid ); + } PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderEnumerator::AddEntryL" ) ); } @@ -427,13 +450,13 @@ for ( TInt i = 0; i < count; i++ ) { TInt index = i - removeCount; - PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::AddReferencesL ref[%d]'s name = %S" ), index, &( aReferences[index] ) ); + TPtrC temp( aReferences[index] ); + PRINT2( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::AddReferencesL ref[%d]'s name = %S" ), index, &temp ); PERFLOGSTART( KObjectManagerHandle ); - TUint32 handle = iFramework.ObjectMgr().HandleL( aReferences[index] ); + TUint32 handle = iFramework.ObjectMgr().HandleL( temp ); PERFLOGSTOP( KObjectManagerHandle ); if ( handle == KMTPHandleNone ) // object doesn't exist { - TPtrC temp( aReferences[index] ); PRINT1( _L( "MM MTP <> CAbstractMediaMtpDataProviderEnumerator::AddReferencesL, [%S] doesn't existed in handle db, remove this from reference array" ), &temp ); // if handle is invalid, remove from reference array diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectproplist.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,6 +16,10 @@ */ +#include +#include +#include + #include "cabstractmediamtpdataprovidergetobjectproplist.h" #include "abstractmediamtpdataproviderconst.h" #include "mmmtpdplogger.h" @@ -81,15 +85,70 @@ // do nothing here, just leave, as this should never be invoked or invalid propcode // ----------------------------------------------------------------------------- // -TInt CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/, - TUint32 /*aHandle*/ ) +TInt CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL( TUint16 aPropCode, + TUint32 aHandle ) { - PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL, leave with KErrNotSupported" ) ); + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL" ) ); + TInt err = KErrNone; + switch ( aPropCode ) + { + case EMTPObjectPropCodeRepresentativeSampleFormat: + { + iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); + iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EValue, 0 ); + } + break; + case EMTPObjectPropCodeRepresentativeSampleSize: + case EMTPObjectPropCodeRepresentativeSampleHeight: + case EMTPObjectPropCodeRepresentativeSampleWidth: + { + iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); + iPropertyElement->SetUint32L( CMTPTypeObjectPropListElement::EValue, 0 ); + } + break; + case EMTPObjectPropCodeRepresentativeSampleData: + { + const TDesC& suid( iObject->DesC( CMTPObjectMetaData::ESuid ) ); + CMTPTypeArray* desData = CMTPTypeArray::NewLC( EMTPTypeAUINT8 ); // + desData + + RFile sampleFile; + TInt err = sampleFile.Open( iFramework.Fs(), suid, EFileShareReadersOnly ); + PRINT2( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData open filename=%S, err=%d" ), &suid, err ); - // Do nothing now. - // May need add implementation here for further extension. + CleanupClosePushL( sampleFile ); // + sampleFile + TInt size = 0; + if( err == KErrNone ) + { + err = sampleFile.Size( size ); + } + PRINT2( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Size size=%d, err=%d" ), size, err ); + if( err == KErrNone && size > 0 ) + { + HBufC8* sampleData = HBufC8::NewLC( size * sizeof( TUint8 ) ); // + sampleData + TPtr8 samplePtr = sampleData->Des(); + err = sampleFile.Read( samplePtr ); + PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Read err=%d" ), err ); + PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData samplePtr.Size=%d" ), samplePtr.Size() ); + if( err == KErrNone ) + { + desData->SetByDesL( samplePtr ); + } + CleanupStack::PopAndDestroy( sampleData ); // - sampleData + } + iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); + iPropertyElement->SetArrayL( CMTPTypeObjectPropListElement::EValue, *desData ); - return KErrNotSupported; + CleanupStack::PopAndDestroy( &sampleFile ); // - sampleFile + CleanupStack::PopAndDestroy( desData ); // - desData + } + break; + + default: + err = KErrNotSupported; + } + + PRINT1( _L( "MM MTP <= CAbstractMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL, err = %d" ), err ); + return err; } // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidergetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,6 +16,9 @@ */ +#include +#include + #include "cabstractmediamtpdataprovidergetobjectpropvalue.h" #include "abstractmediamtpdataproviderconst.h" #include "mmmtpdplogger.h" @@ -81,13 +84,64 @@ // invoked or invalid propcode // ----------------------------------------------------------------------------- // -void CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/ ) +void CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 aPropCode ) { - PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL, leave with KErrNotSupported")); + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL" ) ); + switch ( aPropCode ) + { + case EMTPObjectPropCodeRepresentativeSampleFormat: + { + iMTPTypeUint16.Set( 0 ); + SendDataL( iMTPTypeUint16 ); + } + break; + + case EMTPObjectPropCodeRepresentativeSampleSize: // fall through + case EMTPObjectPropCodeRepresentativeSampleHeight: // fall through + case EMTPObjectPropCodeRepresentativeSampleWidth: + { + iMTPTypeUint32.Set( 0 ); + SendDataL( iMTPTypeUint32 ); + } + break; - // May need add implementation here for further extension. + case EMTPObjectPropCodeRepresentativeSampleData: + { + if ( iMTPTypeArray != NULL ) + { + delete iMTPTypeArray; + iMTPTypeArray = NULL; + } + iMTPTypeArray = CMTPTypeArray::NewL( EMTPTypeAUINT8 ); + + const TDesC& suid = iObjectInfo->DesC( CMTPObjectMetaData::ESuid ); + PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData file suid=%S" ), &suid ); + RFile sampleFile; + User::LeaveIfError( sampleFile.Open( iFramework.Fs(), suid, EFileShareReadersOnly ) ); + CleanupClosePushL( sampleFile ); // + sampleFile + + TInt size = 0; + User::LeaveIfError( sampleFile.Size( size ) ); + PRINT1( _L( "MM MTP <> EMTPObjectPropCodeRepresentativeSampleData sampleFile.Size() size=%d" ), size ); - User::Leave( KErrNotSupported ); + if( size > 0 ) + { + HBufC8* sampleData = HBufC8::NewLC( size * sizeof(TUint8) ); // + sampleData + TPtr8 samplePtr = sampleData->Des(); + User::LeaveIfError( sampleFile.Read( samplePtr ) ); + iMTPTypeArray->SetByDesL( samplePtr ); + CleanupStack::PopAndDestroy( sampleData ); // - sampleData + } + CleanupStack::PopAndDestroy( &sampleFile ); // - sampleFile + + SendDataL( *iMTPTypeArray ); + } + break; + + default: + PRINT( _L( "MM MTP <> CAbstractMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL, leave with KErrNotSupported")); + User::Leave( KErrNotSupported ); + } } // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderpropertysettingutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,6 +17,8 @@ #include #include +#include +#include #include "cabstractmediamtpdataproviderpropertysettingutility.h" #include "mmmtpdplogger.h" @@ -54,17 +56,40 @@ // Do nothing } -TMTPResponseCode CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL( MMmMtpDpConfig& /*aDpConfig*/, - TUint16 /*aPropCode*/, - const CMTPObjectMetaData& /*aObject*/, - const CMTPTypeObjectPropListElement& /*aElement*/ ) +TMTPResponseCode CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL( MMmMtpDpConfig& aDpConfig, + TUint16 aPropCode, + const CMTPObjectMetaData& aObject, + const CMTPTypeObjectPropListElement& aElement ) { PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL" ) ); - // Do nothing now. - // May need add implementation here for further extension. + TMTPResponseCode responseCode = EMTPRespCodeOK; + + switch ( aPropCode ) + { + case EMTPObjectPropCodeRepresentativeSampleData: + { + CMTPTypeArray* desData = CMTPTypeArray::NewLC( EMTPTypeAUINT8 ); + desData->SetByDesL( aElement.ArrayL( CMTPTypeObjectPropListElement::EValue ) ); + responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, *desData, aObject ); + CleanupStack::PopAndDestroy( desData ); + } + break; - return EMTPRespCodeOK; + case EMTPObjectPropCodeRepresentativeSampleFormat: + case EMTPObjectPropCodeRepresentativeSampleSize: + case EMTPObjectPropCodeRepresentativeSampleHeight: + case EMTPObjectPropCodeRepresentativeSampleWidth: + // no place to store, do nothing. reserve here for future usage + break; + + default: + // Should not happen, property code should have been checked before set to store. + User::Leave( KErrNotSupported ); + } + + PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderPropertySettingUtility::SetSpecificObjectPropertyL" ) ); + return responseCode; } // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataproviderrenameobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,10 +17,9 @@ #include -#include #include +#include #include -#include #include "cabstractmediamtpdataproviderrenameobject.h" #include "mmmtpdplogger.h" @@ -92,7 +91,7 @@ } else { - TRAPD( err, iWrapper.RenameObjectL( iOldFileName, iFileName ) ); + TRAPD( err, iWrapper.RenameObjectL( *iObjectInfo, iFileName ) ); // should not fail for 1 file, keep it going, as folder already renamed if ( err != KErrNone ) diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,6 +16,8 @@ */ +#include + #include "cabstractmediamtpdataprovidersetobjectpropvalue.h" #include "abstractmediamtpdataproviderconst.h" #include "mmmtpdplogger.h" @@ -81,9 +83,22 @@ // invalid propcode // ----------------------------------------------------------------------------- // -TBool CAbstractMediaMtpDataProviderSetObjectPropValue::IsSpecificPropCodeReadOnly( TUint16 /*aPropCode*/ ) const +TBool CAbstractMediaMtpDataProviderSetObjectPropValue::IsSpecificPropCodeReadOnly( TUint16 aPropCode ) const { - return EFalse; + TBool ret = EFalse; + switch ( aPropCode ) + { + case EMTPObjectPropCodeRepresentativeSampleFormat: + case EMTPObjectPropCodeRepresentativeSampleSize: + case EMTPObjectPropCodeRepresentativeSampleHeight: + case EMTPObjectPropCodeRepresentativeSampleWidth: + ret = ETrue; + break; + default: + ret = EFalse; + break; + } + return ret; } // ----------------------------------------------------------------------------- @@ -92,14 +107,24 @@ // invalid propcode // ----------------------------------------------------------------------------- // -void CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL( TUint16 /*aPropCode*/ ) +void CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL( TUint16 aPropCode ) { - PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL leave with KErrNotSupported" ) ); + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL" ) ); + if ( aPropCode == EMTPObjectPropCodeRepresentativeSampleData ) + { + delete iMTPTypeArray; + iMTPTypeArray = NULL; - // Do nothing now. - // May need add implementation here for further extension. - - User::Leave( KErrNotSupported ); + iMTPTypeArray = CMTPTypeArray::NewL( EMTPTypeAUINT8 ); + ReceiveDataL( *iMTPTypeArray ); + } + else + { + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ReceiveDataSpecificObjectPropertyL leave with KErrNotSupported" ) ); + // Do nothing now. + // May need add implementation here for further extension. + User::Leave( KErrNotSupported ); + } } // ----------------------------------------------------------------------------- @@ -108,15 +133,26 @@ // invalid propcode // ----------------------------------------------------------------------------- // -TMTPResponseCode CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 /*aPropCode*/ ) +TMTPResponseCode CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 aPropCode ) { - PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL leave with KErrNotSupported" ) ); + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL" ) ); + TMTPResponseCode responseCode = EMTPRespCodeOK; - // Do nothing now. - // May need add implementation here for further extension. - User::Leave( KErrNotSupported ); - - return EMTPRespCodeOK; + if ( aPropCode == EMTPObjectPropCodeRepresentativeSampleData ) + { + responseCode = ServiceMetaDataToWrapperL( aPropCode, + *iMTPTypeArray, + *iObjectInfo ); + } + else + { + PRINT( _L( "MM MTP => CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL leave with KErrNotSupported" ) ); + // Do nothing now. + // May need add implementation here for further extension. + User::Leave( KErrNotSupported ); + } + PRINT( _L( "MM MTP <= CAbstractMediaMtpDataProviderSetObjectPropValue::ServiceSpecificObjectPropertyL" ) ); + return responseCode; } // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectreferences.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/abstractmediamtpdataprovider/src/cabstractmediamtpdataprovidersetobjectreferences.cpp Fri Feb 26 18:11:38 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/* -* Copyright (c) 2009 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: Implement the operation: SetObjectReferences -* -*/ - - -#include "cabstractmediamtpdataprovidersetobjectreferences.h" -#include "abstractmediamtpdataproviderconst.h" -#include "cmmmtpdpmetadataaccesswrapper.h" -#include "mmmtpdplogger.h" - -// ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderSetObjectReferences::NewL -// Two-phase construction method -// ----------------------------------------------------------------------------- -// -MMmRequestProcessor* CAbstractMediaMtpDataProviderSetObjectReferences::NewL( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection, - MMmMtpDpConfig& aDpConfig ) - { - CAbstractMediaMtpDataProviderSetObjectReferences* self = - new ( ELeave ) CAbstractMediaMtpDataProviderSetObjectReferences( aFramework, - aConnection, - aDpConfig ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - - return self; - } - -// ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderSetObjectReferences::ConstructL -// Two-phase construction method -// ----------------------------------------------------------------------------- -// -void CAbstractMediaMtpDataProviderSetObjectReferences::ConstructL() - { - // Do nothing - } - -// ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderSetObjectReferences::~CAbstractMediaMtpDataProviderSetObjectReferences -// Destructor -// ----------------------------------------------------------------------------- -// -CAbstractMediaMtpDataProviderSetObjectReferences::~CAbstractMediaMtpDataProviderSetObjectReferences() - { - // Do nothing - } - -// ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderSetObjectReferences::CAbstractMediaMtpDataProviderSetObjectReferences -// Standard c++ constructor -// ----------------------------------------------------------------------------- -// -CAbstractMediaMtpDataProviderSetObjectReferences::CAbstractMediaMtpDataProviderSetObjectReferences( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection, - MMmMtpDpConfig& aDpConfig ) : - CSetObjectReferences( aFramework, aConnection, aDpConfig ) - { - // Do nothing - } - -// ----------------------------------------------------------------------------- -// CAbstractMediaMtpDataProviderSetObjectReferences::DoSetObjectReferencesL -// set references to DB -// ----------------------------------------------------------------------------- -// -void CAbstractMediaMtpDataProviderSetObjectReferences::DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper, - TUint16 aObjectFormat, - const TDesC& aSrcFileName, - CDesCArray& aRefFileArray ) - { - TInt count = sizeof( KAbstractMediaMtpDataProviderSupportedFormats ) / sizeof (TUint16); - TBool supported = EFalse; - - for ( TInt i = 0; i < count; i++ ) - { - if( KAbstractMediaMtpDataProviderSupportedFormats[i] == aObjectFormat ) - { - supported = ETrue; - break; - } - } - - if ( supported ) - { - aWrapper.SetAbstractMediaL( aSrcFileName, aRefFileArray, EMPXPlaylist ); - } - } - -// end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataprovider.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataprovider.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/cmediamtpdataprovider.h Fri Apr 02 16:24:05 2010 +0100 @@ -189,8 +189,6 @@ RArray iSupportedPropVideo; RArray iSupportedPropAll; - TUint32 iDefaultStorageId; - CPropertySettingUtility* iPropSettingUtility; CDescriptionUtility* iDescriptionUtility; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderconst.h Fri Apr 02 16:24:05 2010 +0100 @@ -25,8 +25,6 @@ _LIT( KMTPTxtColon, ":" ); -/** Granularity of the drive list*/ -const TInt KMtpMaxStringLength = 255; enum TMmMtpNumberOfChannels { @@ -80,21 +78,21 @@ enum TMmMtpWidthRange { EMTPMinWidth = 0x000000b0, // 176 pixels - EMTPMaxWidth = 0x00000140, // 320 pixels + EMTPMaxWidth = 0x00000500, // 1280 pixels, standard for 720p content EMTPStepWidth = 0x00000001, }; enum TMmMtpHeightRange { EMTPMinHeight = 0x00000090, // 144 pixels - EMTPMaxHeight = 0x000000F0, // 240 pixels + EMTPMaxHeight = 0x000002D0, // 720 pixels, standard for 720p content EMTPStepHeight = 0x00000001, }; enum TMmMtpVideoBitRateRange { EMTPWMVMinBitrate = 0x00000000, - EMTPWMVMaxBitrate = 0x0005dc00, // 384 kbps + EMTPWMVMaxBitrate = 0x01312D00, // 20 Mbps, recommanded by Helix team EMTPVideoBitrateStep = 0x00000001 }; @@ -113,7 +111,7 @@ enum TMmMtpFramesPerThousandSecondsRange { EMTPMinFramesPerThousandSeconds = 0x00000000, - EMTPMaxFramesPerThousandSeconds = 0x00003a98, // 15000 frame per ms + EMTPMaxFramesPerThousandSeconds = 0x00007530, // 30000 frame per ms (30 frame/s), standard for progressive content EMTPStepFramesPerThousandSeconds = 0x00000001 }; @@ -197,6 +195,7 @@ EMTPObjectPropCodeNumberOfChannels, EMTPObjectPropCodeAudioWAVECodec, EMTPObjectPropCodeAudioBitRate, + EMTPObjectPropCodeAlbumArtist }; // Additional for audio formats @@ -217,7 +216,6 @@ EMTPObjectPropCodeHeight, EMTPObjectPropCodeDuration, EMTPObjectPropCodeGenre, - EMTPObjectPropCodeUseCount, EMTPObjectPropCodeSampleRate, EMTPObjectPropCodeNumberOfChannels, EMTPObjectPropCodeScanType, diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/inc/mediamtpdataproviderprocessor.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,16 +19,14 @@ #ifndef MEDIAMTPDATAPROVIDERPROCESSOR_H #define MEDIAMTPDATAPROVIDERPROCESSOR_H -#include "crequestprocessor.h" - // class forward class MMTPConnection; class TMTPTypeRequest; class CMTPDataProviderPlugin; -class MMTPDataProviderFramework; class MMTPRequestProcessor; class CMediaMtpDataProvider; class MMmMtpDpConfig; +class MMmRequestProcessor; typedef MMmRequestProcessor* ( *TMediaMtpDataProviderRequestProcessorCreateFunc )( MMTPDataProviderFramework& aFramework, diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovider.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -25,6 +25,7 @@ #include #include "cmediamtpdataprovider.h" +#include "crequestprocessor.h" #include "mediamtpdataproviderconst.h" #include "cmediamtpdataproviderenumerator.h" #include "mmmtpdplogger.h" @@ -130,7 +131,7 @@ iMediaEnumerator = CMediaMtpDataProviderEnumerator::NewL( Framework(), *this ); - CMmMtpDpAccessSingleton::CreateL( Framework().Fs(), Framework() ); + CMmMtpDpAccessSingleton::CreateL( Framework() ); GetSupportedFormatL(); GetSupportedPropL(); @@ -241,9 +242,9 @@ iIsSessionOpen = EFalse; TInt count = iActiveProcessors.Count(); PRINT1( _L( "MM MTP => CMediaMtpDataProvider::SessionClosedL, total processor count = %d" ), count ); - for( TInt i = 0; i < count; i++ ) + while ( count-- ) { - MMmRequestProcessor* processor = iActiveProcessors[i]; + MMmRequestProcessor* processor = iActiveProcessors[count]; // replaced for the Request() is invalid sometimes // TUint32 sessionId( processor->Request().Uint32( TMTPTypeRequest::ERequestSessionID ) ); @@ -255,10 +256,11 @@ { processor->UsbDisconnect(); // Rollback - iActiveProcessors.Remove( i ); - if ( i == iActiveProcessor ) + iActiveProcessors.Remove( count ); + if ( count == iActiveProcessor ) { iActiveProcessorRemoved = ETrue; + iActiveProcessor = -1; // update iActiveProcessor } else { @@ -417,6 +419,7 @@ //EMTPFormatCode3GPContainer, aStrings.AppendL(KFormatExtension3GP); + aStrings.AppendL(KFormatExtension3G2); //EMTPFormatCodeAAC, aStrings.AppendL(KFormatExtensionAAC); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidercopyobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -172,7 +171,6 @@ case EMTPObjectPropCodeWidth: case EMTPObjectPropCodeHeight: case EMTPObjectPropCodeDuration: - case EMTPObjectPropCodeUseCount: case EMTPObjectPropCodeSampleRate: case EMTPObjectPropCodeAudioWAVECodec: case EMTPObjectPropCodeAudioBitRate: @@ -218,12 +216,9 @@ } // centralize logic to handle error, doing so, that's on need to trap the - // leave for KErrNotSupported in base class like previous version. - if ( ( err == KErrNotFound ) - || ( ( err == KErrNotSupported ) - && ( ( aObject.Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeASF ) - || ( aObject.Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeMP4Container ) - || ( aObject.Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCode3GPContainer ) ) ) ) + // Ignore all errors came from mpx db. + // It's enough that only file copied successfully no matter metadata got whatever failure. + if ( err != KErrNone ) { iPropertyElement = NULL; } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderdescriptionutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -21,10 +21,10 @@ #include "cmediamtpdataproviderdescriptionutility.h" #include "mediamtpdataproviderconst.h" +#include "tobjectdescription.h" #include "mmmtpdpconfig.h" #include "mmmtpdplogger.h" -const TUint32 KMTPDescriptionLen = 0x00000200; // ----------------------------------------------------------------------------- // CMediaMtpDataProviderDescriptionUtility::NewL @@ -120,7 +120,6 @@ case EMTPObjectPropCodeArtist: // Artist case EMTPObjectPropCodeTrack: // Track case EMTPObjectPropCodeGenre: // Genre - case EMTPObjectPropCodeUseCount: // Use Count case EMTPObjectPropCodeAlbumName: // Album Name case EMTPObjectPropCodeAlbumArtist: // Album Artist case EMTPObjectPropCodeOriginalReleaseDate: // Original Release Date @@ -474,7 +473,7 @@ { PRINT( _L( "MM MTP => CMediaMtpDataProviderDescriptionUtility::NewDescriptionPropDescL" ) ); - TMTPTypeUint32 uint32Data( KMTPDescriptionLen ); + TMTPTypeUint32 uint32Data( KMTPMaxDescriptionLen ); CMTPTypeObjectPropDesc* propertyDesc = CMTPTypeObjectPropDesc::NewL( EMTPObjectPropCodeDescription, CMTPTypeObjectPropDesc::ELongStringForm, &uint32Data ); @@ -538,6 +537,12 @@ string->SetL( _L("MP@LL")); expectedForm->AppendSupportedValueL( *string ); + // newly added to support 720p content as suggested by Helix team + string->SetL( _L("MP@ML")); + expectedForm->AppendSupportedValueL( *string ); + string->SetL( _L("MP@HL")); + expectedForm->AppendSupportedValueL( *string ); + CMTPTypeObjectPropDesc::TPropertyInfo propertyInfo; propertyInfo.iDataType = EMTPTypeString; propertyInfo.iFormFlag = CMTPTypeObjectPropDesc::EEnumerationForm; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderenumerator.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -219,7 +219,11 @@ const CMTPStorageMetaData& storage( iFramework.StorageMgr().StorageL( iStorages[0] ) ); TFileName root( storage.DesC( CMTPStorageMetaData::EStorageSuid ) ); GetModifiedContentL( root ); - iDataProvider.GetWrapperL().UpdateMusicCollectionL(); + TRAPD( err, iDataProvider.GetWrapperL().UpdateMusicCollectionL() ); + if ( err != KErrNone ) + { + PRINT1( _L("MM MTP <> ScanNextStorageL, UpdateMusicCollectionL err =%d "), err ); + } iStorages.Remove( 0 ); ScanStorageL( iStorages[0] ); @@ -419,7 +423,8 @@ // TInt CMediaMtpDataProviderEnumerator::RunError( TInt aError ) { - PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::RunError with error %d" ), aError ); + if ( aError != KErrNone ) + PRINT1( _L( "MM MTP <> CMediaMtpDataProviderEnumerator::RunError with error %d" ), aError ); TRAP_IGNORE( SignalCompleteL( iDataProvider ) ); @@ -468,34 +473,39 @@ { PRINT( _L( "MM MTP => CMediaMtpDataProviderEnumerator::ProcessEntriesL" ) ); - TBuf path = iPath.DriveAndPath(); + TFileName path = iPath.DriveAndPath(); while ( !IsOverThreshold() && iFirstUnprocessed < iEntries.Count() ) { const TEntry& entry = iEntries[iFirstUnprocessed]; - path.Append( entry.iName ); - PRINT1( _L( "MM MTP <> path = %S" ), &path ); TInt len = entry.iName.Length(); - if ( entry.IsDir() ) + // Skip object with too long name + if ( KMaxFileName >= path.Length() + len ) { - path.Append( '\\' ); - ++len; + path.Append( entry.iName ); + PRINT1( _L( "MM MTP <> path = %S" ), &path ); + + if ( entry.IsDir() ) + { + path.Append( '\\' ); + ++len; - // we don't need to process folder, just remember - // the folder - TEntry* dirEntry = new TEntry( entry ); - User::LeaveIfNull( dirEntry ); - iDirStack.AppendL( dirEntry ); + // we don't need to process folder, just remember + // the folder + TEntry* dirEntry = new TEntry( entry ); + User::LeaveIfNull( dirEntry ); + iDirStack.AppendL( dirEntry ); + } + else if ( IsFileAccepted( path ) ) + { + AddEntryL( path ); + } + + // Remove filename part + path.SetLength( path.Length() - len ); } - else if ( IsFileAccepted( path ) ) - { - AddEntryL( path ); - } - - // Remove filename part - path.SetLength( path.Length() - len ); iFirstUnprocessed++; } @@ -619,7 +629,9 @@ CDesCArray* modifiedContents = new ( ELeave ) CDesCArrayFlat( KMTPDriveGranularity ); CleanupStack::PushL( modifiedContents ); // + modifiedContents - iDataProvider.GetWrapperL().GetModifiedContentL( aStorageRoot, arrayCount, *modifiedContents ); + TRAPD( err, iDataProvider.GetWrapperL().GetModifiedContentL( aStorageRoot, arrayCount, *modifiedContents ) ); + if ( err != KErrNone ) + PRINT1( _L("MM MTP <> GetModifiedContentL err =%d "), err ); if ( arrayCount > 0 ) { diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectproplist.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -97,7 +96,6 @@ switch ( aPropCode ) { - //case EMTPObjectPropCodeName: case EMTPObjectPropCodeArtist: case EMTPObjectPropCodeGenre: case EMTPObjectPropCodeComposer: @@ -114,11 +112,8 @@ PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); - iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars()); - } + iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); + iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars()); CleanupStack::PopAndDestroy( textData ); // - textData } @@ -134,12 +129,9 @@ PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); - iPropertyElement->SetArrayL( CMTPTypeObjectPropListElement::EValue, *desData); - } - + iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); + iPropertyElement->SetArrayL( CMTPTypeObjectPropListElement::EValue, *desData); + CleanupStack::PopAndDestroy( desData ); // - desData } break; @@ -155,18 +147,14 @@ *iObject ) ); PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); - iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EValue, uint16.Value()); - } + iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); + iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EValue, uint16.Value()); } break; case EMTPObjectPropCodeWidth: case EMTPObjectPropCodeHeight: case EMTPObjectPropCodeDuration: - case EMTPObjectPropCodeUseCount: case EMTPObjectPropCodeSampleRate: case EMTPObjectPropCodeAudioWAVECodec: case EMTPObjectPropCodeAudioBitRate: @@ -181,11 +169,8 @@ *iObject ) ); PRINT1( _L( "MM MTP <> CMediaMtpDataProviderGetObjectPropList::ServiceSpecificObjectPropertyL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); - iPropertyElement->SetUint32L( CMTPTypeObjectPropListElement::EValue, uint32.Value()); - } + iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); + iPropertyElement->SetUint32L( CMTPTypeObjectPropListElement::EValue, uint32.Value()); } break; @@ -193,10 +178,10 @@ { TInt drmStatus = MmMtpDpUtility::GetDrmStatus( iObject->DesC( CMTPObjectMetaData::ESuid ) ); TMTPTypeUint8 result; - result.Set( 0 ); + result.Set( EMTPDrmStatusNotProtected ); if ( drmStatus == EMTPDrmStatusProtected ) - result.Set( 1 ); + result.Set( EMTPDrmStatusProtected ); iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EDatatype, EMTPTypeUINT8); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidergetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include @@ -80,7 +79,7 @@ // Do nothing } -void CMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL(TUint16 aPropCode) +void CMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL( TUint16 aPropCode ) { PRINT( _L( "MM MTP => CMediaMtpDataProviderGetObjectPropValue::ServiceSpecificObjectPropertyL" ) ); switch ( aPropCode ) @@ -120,7 +119,6 @@ case EMTPObjectPropCodeWidth: // 0xDC87 case EMTPObjectPropCodeHeight: // 0xDC88 case EMTPObjectPropCodeDuration: // 0xDC89 - case EMTPObjectPropCodeUseCount: // 0xDC91 case EMTPObjectPropCodeSampleRate: // 0xDE93 case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99 case EMTPObjectPropCodeAudioBitRate: // 0xDE9A @@ -151,7 +149,7 @@ TInt drmStatus = MmMtpDpUtility::GetDrmStatus( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); iMTPTypeUint8.Set( 0 ); - if (drmStatus == EMTPDrmStatusProtected) + if ( drmStatus == EMTPDrmStatusProtected ) iMTPTypeUint8.Set( 1 ); SendDataL( iMTPTypeUint8 ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidermoveobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -15,7 +15,7 @@ * */ -#include + #include #include #include @@ -125,14 +125,10 @@ iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars() ); } - else if ( err == KErrNotFound ) + else { iPropertyElement = NULL; } - else - { - User::Leave( err ); - } CleanupStack::PopAndDestroy( textData ); // - textData } @@ -150,18 +146,13 @@ if ( err == KErrNone ) { - iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); iPropertyElement->SetArrayL( CMTPTypeObjectPropListElement::EValue, *desData ); } - else if ( err == KErrNotFound ) + else { iPropertyElement = NULL; } - else - { - User::Leave( err ); - } CleanupStack::PopAndDestroy( desData ); // - desData } @@ -183,21 +174,16 @@ iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); iPropertyElement->SetUint16L( CMTPTypeObjectPropListElement::EValue, uint16.Value() ); } - else if ( err == KErrNotFound ) + else { iPropertyElement = NULL; } - else - { - User::Leave( err ); - } } break; case EMTPObjectPropCodeWidth: case EMTPObjectPropCodeHeight: case EMTPObjectPropCodeDuration: - case EMTPObjectPropCodeUseCount: case EMTPObjectPropCodeSampleRate: case EMTPObjectPropCodeAudioWAVECodec: case EMTPObjectPropCodeAudioBitRate: @@ -217,14 +203,10 @@ iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); iPropertyElement->SetUint32L( CMTPTypeObjectPropListElement::EValue, uint32.Value() ); } - else if ( err == KErrNotFound ) + else { iPropertyElement = NULL; } - else - { - User::Leave( err ); - } } break; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataproviderpropertysettingutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -22,6 +22,7 @@ #include #include #include +#include #include "tobjectdescription.h" #include "cmmmtpdpmetadataaccesswrapper.h" @@ -85,7 +86,7 @@ CMTPTypeString* stringData = CMTPTypeString::NewLC( aElement.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData - responseCode = SetMetaDataToWrapperL( aDpConfig, + responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, *stringData, aObject ); @@ -107,7 +108,7 @@ { CMTPTypeArray* desData = CMTPTypeArray::NewLC( EMTPTypeAUINT16 ); // + desData desData->SetByDesL( aElement.ArrayL( CMTPTypeObjectPropListElement::EValue ) ); - responseCode = SetMetaDataToWrapperL( aDpConfig, + responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, *desData, aObject ); @@ -118,7 +119,6 @@ case EMTPObjectPropCodeWidth: case EMTPObjectPropCodeHeight: case EMTPObjectPropCodeDuration: - case EMTPObjectPropCodeUseCount: case EMTPObjectPropCodeSampleRate: case EMTPObjectPropCodeAudioWAVECodec: case EMTPObjectPropCodeAudioBitRate: @@ -127,7 +127,7 @@ case EMTPObjectPropCodeKeyFrameDistance: { TMTPTypeUint32 uint32( aElement.Uint32L( CMTPTypeObjectPropListElement::EValue ) ); - responseCode = SetMetaDataToWrapperL( aDpConfig, + responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, uint32, aObject ); @@ -140,7 +140,7 @@ case EMTPObjectPropCodeDRMStatus: { TMTPTypeUint16 uint16( aElement.Uint16L( CMTPTypeObjectPropListElement::EValue ) ); - responseCode = SetMetaDataToWrapperL( aDpConfig, + responseCode = SetMetaDataToWrapper( aDpConfig, aPropCode, uint16, aObject ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdpplugins/mediamtpdataprovider/src/cmediamtpdataprovidersetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -132,7 +131,6 @@ case EMTPObjectPropCodeWidth: // 0xDC87 case EMTPObjectPropCodeHeight: // 0xDC88 case EMTPObjectPropCodeDuration: // 0xDC89 - case EMTPObjectPropCodeUseCount: // 0xDC91 case EMTPObjectPropCodeSampleRate: // 0xDE93 case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99 case EMTPObjectPropCodeAudioBitRate: // 0xDE9A @@ -185,7 +183,6 @@ case EMTPObjectPropCodeWidth: //0xDC87 case EMTPObjectPropCodeHeight: //0xDC88 case EMTPObjectPropCodeDuration: //0xDC89 - case EMTPObjectPropCodeUseCount: //0xDC91 case EMTPObjectPropCodeSampleRate: //0xDE93 case EMTPObjectPropCodeAudioWAVECodec: //0xDE99 case EMTPObjectPropCodeAudioBitRate: //0xDE9A diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/bwins/mmmtpdprequestprocessoru.def Fri Apr 02 16:24:05 2010 +0100 @@ -15,31 +15,31 @@ ??0CGetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 14 NONAME ; CGetObjectPropValue::CGetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) ?CheckRequestL@CSetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 15 NONAME ; enum TMTPResponseCode CSetObjectPropList::CheckRequestL(void) ?RunL@CRequestProcessor@@MAEXXZ @ 16 NONAME ; void CRequestProcessor::RunL(void) - ?SetMetaDataToWrapperL@CPropertySettingUtility@@QAE?AW4TMTPResponseCode@@AAVMMmMtpDpConfig@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 17 NONAME ; enum TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapperL(class MMmMtpDpConfig &, unsigned short, class MMTPType &, class CMTPObjectMetaData const &) - ?ServiceL@CDeleteObject@@MAEXXZ @ 18 NONAME ; void CDeleteObject::ServiceL(void) - ?DoCancel@CSetObjectPropList@@MAEXXZ @ 19 NONAME ; void CSetObjectPropList::DoCancel(void) - ?CleanupDatabaseL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 20 NONAME ; void CMmMtpDpMetadataAccessWrapper::CleanupDatabaseL(void) - ?ServiceL@CGetObjectPropsSupported@@MAEXXZ @ 21 NONAME ; void CGetObjectPropsSupported::ServiceL(void) - ?NewL@CSetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 22 NONAME ; class MMmRequestProcessor * CSetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?Release@CMmMtpDpAccessSingleton@@SAXXZ @ 23 NONAME ; void CMmMtpDpAccessSingleton::Release(void) - ?UsbDisconnect@CSendObject@@MAEXXZ @ 24 NONAME ; void CSendObject::UsbDisconnect(void) - ?DoSetObjectReferencesL@CSetObjectReferences@@MAEXAAVCMmMtpDpMetadataAccessWrapper@@GABVTDesC16@@AAVCDesC16Array@@@Z @ 25 NONAME ; void CSetObjectReferences::DoSetObjectReferencesL(class CMmMtpDpMetadataAccessWrapper &, unsigned short, class TDesC16 const &, class CDesC16Array &) - ?ServiceL@CGetFormatCapabilities@@MAEXXZ @ 26 NONAME ; void CGetFormatCapabilities::ServiceL(void) - ?GetAllReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXPAVCMPXMedia@@AAVCDesC16Array@@@Z @ 27 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL(class CMPXMedia *, class CDesC16Array &) - ??1CSetObjectPropList@@UAE@XZ @ 28 NONAME ; CSetObjectPropList::~CSetObjectPropList(void) - ?ServiceL@CSetObjectPropList@@MAEXXZ @ 29 NONAME ; void CSetObjectPropList::ServiceL(void) - ??0CMoveObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 30 NONAME ; CMoveObject::CMoveObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ??0CRequestUnknown@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 31 NONAME ; CRequestUnknown::CRequestUnknown(class MMTPDataProviderFramework &, class MMTPConnection &) - ?ConstructL@CGetObjectPropList@@IAEXXZ @ 32 NONAME ; void CGetObjectPropList::ConstructL(void) - ??1CSendObject@@UAE@XZ @ 33 NONAME ; CSendObject::~CSendObject(void) - ?ServiceMetaDataFromWrapperL@CGetObjectPropValue@@IAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 34 NONAME ; void CGetObjectPropValue::ServiceMetaDataFromWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) - ?NewL@CGetObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 35 NONAME ; class MMmRequestProcessor * CGetObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ??1CGetObjectPropValue@@UAE@XZ @ 36 NONAME ; CGetObjectPropValue::~CGetObjectPropValue(void) - ??1CGetFormatCapabilities@@UAE@XZ @ 37 NONAME ; CGetFormatCapabilities::~CGetFormatCapabilities(void) - ?ServiceL@CSetObjectReferences@@EAEXXZ @ 38 NONAME ; void CSetObjectReferences::ServiceL(void) - ?DoHandleDataIToRPhaseL@CRequestProcessor@@MAEHXZ @ 39 NONAME ; int CRequestProcessor::DoHandleDataIToRPhaseL(void) - ??0CGetObjectPropList@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 40 NONAME ; CGetObjectPropList::CGetObjectPropList(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?ConstructL@CCopyObject@@IAEXXZ @ 41 NONAME ; void CCopyObject::ConstructL(void) + ?ServiceL@CDeleteObject@@MAEXXZ @ 17 NONAME ; void CDeleteObject::ServiceL(void) + ?DoCancel@CSetObjectPropList@@MAEXXZ @ 18 NONAME ; void CSetObjectPropList::DoCancel(void) + ?CleanupDatabaseL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 19 NONAME ; void CMmMtpDpMetadataAccessWrapper::CleanupDatabaseL(void) + ?ServiceL@CGetObjectPropsSupported@@MAEXXZ @ 20 NONAME ; void CGetObjectPropsSupported::ServiceL(void) + ?NewL@CSetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 21 NONAME ; class MMmRequestProcessor * CSetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?Release@CMmMtpDpAccessSingleton@@SAXXZ @ 22 NONAME ; void CMmMtpDpAccessSingleton::Release(void) + ?UsbDisconnect@CSendObject@@MAEXXZ @ 23 NONAME ; void CSendObject::UsbDisconnect(void) + ?ServiceL@CGetFormatCapabilities@@MAEXXZ @ 24 NONAME ; void CGetFormatCapabilities::ServiceL(void) + ?GetAllReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXPAVCMPXMedia@@AAVCDesC16Array@@@Z @ 25 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllReferenceL(class CMPXMedia *, class CDesC16Array &) + ??1CSetObjectPropList@@UAE@XZ @ 26 NONAME ; CSetObjectPropList::~CSetObjectPropList(void) + ?ServiceL@CSetObjectPropList@@MAEXXZ @ 27 NONAME ; void CSetObjectPropList::ServiceL(void) + ??0CMoveObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 28 NONAME ; CMoveObject::CMoveObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ??0CRequestUnknown@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 29 NONAME ; CRequestUnknown::CRequestUnknown(class MMTPDataProviderFramework &, class MMTPConnection &) + ?ConstructL@CGetObjectPropList@@IAEXXZ @ 30 NONAME ; void CGetObjectPropList::ConstructL(void) + ??1CSendObject@@UAE@XZ @ 31 NONAME ; CSendObject::~CSendObject(void) + ?ServiceMetaDataFromWrapperL@CGetObjectPropValue@@IAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 32 NONAME ; void CGetObjectPropValue::ServiceMetaDataFromWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) + ?NewL@CGetObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 33 NONAME ; class MMmRequestProcessor * CGetObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ??1CGetObjectPropValue@@UAE@XZ @ 34 NONAME ; CGetObjectPropValue::~CGetObjectPropValue(void) + ?CreateL@CMmMtpDpAccessSingleton@@SAXAAVMMTPDataProviderFramework@@@Z @ 35 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class MMTPDataProviderFramework &) + ??1CGetFormatCapabilities@@UAE@XZ @ 36 NONAME ; CGetFormatCapabilities::~CGetFormatCapabilities(void) + ?ServiceL@CSetObjectReferences@@EAEXXZ @ 37 NONAME ; void CSetObjectReferences::ServiceL(void) + ?DoHandleDataIToRPhaseL@CRequestProcessor@@MAEHXZ @ 38 NONAME ; int CRequestProcessor::DoHandleDataIToRPhaseL(void) + ??0CGetObjectPropList@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 39 NONAME ; CGetObjectPropList::CGetObjectPropList(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?ConstructL@CCopyObject@@IAEXXZ @ 40 NONAME ; void CCopyObject::ConstructL(void) + ?SetMetaDataToWrapper@CPropertySettingUtility@@QAE?AW4TMTPResponseCode@@AAVMMmMtpDpConfig@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 41 NONAME ; enum TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapper(class MMmMtpDpConfig &, unsigned short, class MMTPType &, class CMTPObjectMetaData const &) ?ServiceL@CGetObjectPropValue@@MAEXXZ @ 42 NONAME ; void CGetObjectPropValue::ServiceL(void) ??1CRenameObject@@UAE@XZ @ 43 NONAME ; CRenameObject::~CRenameObject(void) ?Match@CRequestProcessor@@MBEHABVTMTPTypeEvent@@AAVMMTPConnection@@@Z @ 44 NONAME ; int CRequestProcessor::Match(class TMTPTypeEvent const &, class MMTPConnection &) const @@ -50,111 +50,110 @@ ??0CRequestProcessor@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@HPBUTMTPRequestElementInfo@@@Z @ 49 NONAME ; CRequestProcessor::CRequestProcessor(class MMTPDataProviderFramework &, class MMTPConnection &, int, struct TMTPRequestElementInfo const *) ?ServiceL@CSendObject@@MAEXXZ @ 50 NONAME ; void CSendObject::ServiceL(void) ?Request@CRequestProcessor@@MBEABVTMTPTypeRequest@@XZ @ 51 NONAME ; class TMTPTypeRequest const & CRequestProcessor::Request(void) const - ?CreateL@CMmMtpDpAccessSingleton@@SAXAAVRFs@@AAVMMTPDataProviderFramework@@@Z @ 52 NONAME ; void CMmMtpDpAccessSingleton::CreateL(class RFs &, class MMTPDataProviderFramework &) - ?DoCancel@CRequestProcessor@@MAEXXZ @ 53 NONAME ; void CRequestProcessor::DoCancel(void) - ?CheckRequestL@CGetPartialObject@@MAE?AW4TMTPResponseCode@@XZ @ 54 NONAME ; enum TMTPResponseCode CGetPartialObject::CheckRequestL(void) - ?NewL@CRequestUnknown@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 55 NONAME ; class MMmRequestProcessor * CRequestUnknown::NewL(class MMTPDataProviderFramework &, class MMTPConnection &) - ??0CGetFormatCapabilities@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 56 NONAME ; CGetFormatCapabilities::CGetFormatCapabilities(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?ConstructL@CGetObjectInfo@@AAEXXZ @ 57 NONAME ; void CGetObjectInfo::ConstructL(void) - ?UsbDisconnect@CRequestProcessor@@MAEXXZ @ 58 NONAME ; void CRequestProcessor::UsbDisconnect(void) - ?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 59 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(void) - ??1CMoveObject@@UAE@XZ @ 60 NONAME ; CMoveObject::~CMoveObject(void) - ?CheckRequestL@CSendObject@@MAE?AW4TMTPResponseCode@@XZ @ 61 NONAME ; enum TMTPResponseCode CSendObject::CheckRequestL(void) - ??1CRequestProcessor@@MAE@XZ @ 62 NONAME ; CRequestProcessor::~CRequestProcessor(void) - ?SetAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAVCDesC16Array@@W4TMPXGeneralCategory@@@Z @ 63 NONAME ; void CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL(class TDesC16 const &, class CDesC16Array &, enum TMPXGeneralCategory) - ?DoCancel@CDeleteObject@@MAEXXZ @ 64 NONAME ; void CDeleteObject::DoCancel(void) - ??1CGetObject@@UAE@XZ @ 65 NONAME ; CGetObject::~CGetObject(void) - ?NewL@CGetInterdependentPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 66 NONAME ; class MMmRequestProcessor * CGetInterdependentPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?DoHandleResponsePhaseL@CSetObjectReferences@@EAEHXZ @ 67 NONAME ; int CSetObjectReferences::DoHandleResponsePhaseL(void) - ?GetAccessWrapperL@CMmMtpDpAccessSingleton@@SAAAVCMmMtpDpMetadataAccessWrapper@@XZ @ 68 NONAME ; class CMmMtpDpMetadataAccessWrapper & CMmMtpDpAccessSingleton::GetAccessWrapperL(void) - ??1CGetObjectPropsSupported@@UAE@XZ @ 69 NONAME ; CGetObjectPropsSupported::~CGetObjectPropsSupported(void) - ?CheckRequestL@CGetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 70 NONAME ; enum TMTPResponseCode CGetObjectPropList::CheckRequestL(void) - ?HasDataphase@CRequestProcessor@@MBEHXZ @ 71 NONAME ; int CRequestProcessor::HasDataphase(void) const - ?NewL@CGetObjectPropsSupported@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 72 NONAME ; class MMmRequestProcessor * CGetObjectPropsSupported::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?Connection@CRequestProcessor@@MBEAAVMMTPConnection@@XZ @ 73 NONAME ; class MMTPConnection & CRequestProcessor::Connection(void) const - ?ConstructL@CGetFormatCapabilities@@AAEXXZ @ 74 NONAME ; void CGetFormatCapabilities::ConstructL(void) - ??1CPropertySettingUtility@@UAE@XZ @ 75 NONAME ; CPropertySettingUtility::~CPropertySettingUtility(void) - ??1CGetPartialObject@@UAE@XZ @ 76 NONAME ; CGetPartialObject::~CGetPartialObject(void) - ?NewL@CGetObjectInfo@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 77 NONAME ; class MMmRequestProcessor * CGetObjectInfo::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?RunError@CSetObjectPropList@@MAEHH@Z @ 78 NONAME ; int CSetObjectPropList::RunError(int) - ?CheckRequestL@CGetInterdependentPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 79 NONAME ; enum TMTPResponseCode CGetInterdependentPropDesc::CheckRequestL(void) - ?Match@CRequestUnknown@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 80 NONAME ; int CRequestUnknown::Match(class TMTPTypeRequest const &, class MMTPConnection &) const - ?ServiceL@CMoveObject@@MAEXXZ @ 81 NONAME ; void CMoveObject::ServiceL(void) - ?CreateDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 82 NONAME ; void CMmMtpDpMetadataAccessWrapper::CreateDummyFile(class TDesC16 const &) - ?CheckRequestL@CGetObjectPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 83 NONAME ; enum TMTPResponseCode CGetObjectPropDesc::CheckRequestL(void) - ?DoHandleRToIPhaseL@CRequestProcessor@@MAEHXZ @ 84 NONAME ; int CRequestProcessor::DoHandleRToIPhaseL(void) - ?ServiceMetaDataToWrapperL@CSetObjectPropValue@@IAE?AW4TMTPResponseCode@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 85 NONAME ; enum TMTPResponseCode CSetObjectPropValue::ServiceMetaDataToWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) - ?NewCommonObjectPropertyL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@G@Z @ 86 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewCommonObjectPropertyL(unsigned short) - ?FormatFromFilename@MmMtpDpUtility@@SA?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 87 NONAME ; enum TMTPFormatCode MmMtpDpUtility::FormatFromFilename(class TDesC16 const &) - ?CheckRequestL@CSetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 88 NONAME ; enum TMTPResponseCode CSetObjectPropValue::CheckRequestL(void) - ??0CPropertySettingUtility@@IAE@XZ @ 89 NONAME ; CPropertySettingUtility::CPropertySettingUtility(void) - ?Match@CRequestProcessor@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 90 NONAME ; int CRequestProcessor::Match(class TMTPTypeRequest const &, class MMTPConnection &) const - ??0CCopyObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 91 NONAME ; CCopyObject::CCopyObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?CheckRequestL@CRequestProcessor@@MAE?AW4TMTPResponseCode@@XZ @ 92 NONAME ; enum TMTPResponseCode CRequestProcessor::CheckRequestL(void) - ?SendResponseL@CRequestProcessor@@IAEXW4TMTPResponseCode@@HPAK@Z @ 93 NONAME ; void CRequestProcessor::SendResponseL(enum TMTPResponseCode, int, unsigned long *) - ??0CGetPartialObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 94 NONAME ; CGetPartialObject::CGetPartialObject(class MMTPDataProviderFramework &, class MMTPConnection &) - ?DoHandleCompletingPhaseL@CRequestProcessor@@MAEHXZ @ 95 NONAME ; int CRequestProcessor::DoHandleCompletingPhaseL(void) - ?DeleteDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 96 NONAME ; void CMmMtpDpMetadataAccessWrapper::DeleteDummyFile(class TDesC16 const &) - ?IsVideoL@MmMtpDpUtility@@SAHABVTDesC16@@@Z @ 97 NONAME ; int MmMtpDpUtility::IsVideoL(class TDesC16 const &) - ??1CGetObjectInfo@@UAE@XZ @ 98 NONAME ; CGetObjectInfo::~CGetObjectInfo(void) - ?ServiceL@CRequestUnknown@@MAEXXZ @ 99 NONAME ; void CRequestUnknown::ServiceL(void) - ?HasDataphase@CSetObjectPropList@@MBEHXZ @ 100 NONAME ; int CSetObjectPropList::HasDataphase(void) const - ?NewL@CGetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 101 NONAME ; class MMmRequestProcessor * CGetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?DoCancel@CRenameObject@@MAEXXZ @ 102 NONAME ; void CRenameObject::DoCancel(void) - ??1CSetObjectReferences@@UAE@XZ @ 103 NONAME ; CSetObjectReferences::~CSetObjectReferences(void) - ?Match@CSendObject@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 104 NONAME ; int CSendObject::Match(class TMTPTypeRequest const &, class MMTPConnection &) const - ?NewL@CSetObjectPropList@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 105 NONAME ; class MMmRequestProcessor * CSetObjectPropList::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?GetAllAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@PAPAVCMPXMediaArray@@W4TMPXGeneralCategory@@@Z @ 106 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllAbstractMediaL(class TDesC16 const &, class CMPXMediaArray * *, enum TMPXGeneralCategory) - ??1CCopyObject@@UAE@XZ @ 107 NONAME ; CCopyObject::~CCopyObject(void) - ?RunL@CGetObjectPropList@@MAEXXZ @ 108 NONAME ; void CGetObjectPropList::RunL(void) - ?GetModifiedContentL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAHAAVCDesC16Array@@@Z @ 109 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetModifiedContentL(class TDesC16 const &, int &, class CDesC16Array &) - ?NewRangeFormDescriptionL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@GKKKH@Z @ 110 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewRangeFormDescriptionL(unsigned short, unsigned long, unsigned long, unsigned long, int) - ?RunError@CRequestProcessor@@MAEHH@Z @ 111 NONAME ; int CRequestProcessor::RunError(int) - ?SessionId@CRequestProcessor@@MAEKXZ @ 112 NONAME ; unsigned long CRequestProcessor::SessionId(void) - ??0CDescriptionUtility@@IAE@XZ @ 113 NONAME ; CDescriptionUtility::CDescriptionUtility(void) - ?HandleEventL@CRequestProcessor@@MAEXABVTMTPTypeEvent@@@Z @ 114 NONAME ; void CRequestProcessor::HandleEventL(class TMTPTypeEvent const &) - ?NewL@CGetPartialObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 115 NONAME ; class MMmRequestProcessor * CGetPartialObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?HasDataphase@CSetObjectReferences@@EBEHXZ @ 116 NONAME ; int CSetObjectReferences::HasDataphase(void) const - ?ConstructL@CGetInterdependentPropDesc@@IAEXXZ @ 117 NONAME ; void CGetInterdependentPropDesc::ConstructL(void) - ?RenameObjectL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@0@Z @ 118 NONAME ; void CMmMtpDpMetadataAccessWrapper::RenameObjectL(class TDesC16 const &, class TDesC16 const &) - ?RunError@CGetObjectPropList@@MAEHH@Z @ 119 NONAME ; int CGetObjectPropList::RunError(int) - ?DoHandleResponsePhaseL@CSetObjectPropList@@MAEHXZ @ 120 NONAME ; int CSetObjectPropList::DoHandleResponsePhaseL(void) - ??0CDeleteObject@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 121 NONAME ; CDeleteObject::CDeleteObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?NewL@CRenameObject@@SAPAV1@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 122 NONAME ; class CRenameObject * CRenameObject::NewL(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &) - ?GetObjectMetadataValueL@CMmMtpDpMetadataAccessWrapper@@QAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 123 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) - ?AddDummyFileL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 124 NONAME ; void CMmMtpDpMetadataAccessWrapper::AddDummyFileL(class TDesC16 const &) - ??0CGetObjectPropDesc@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 125 NONAME ; CGetObjectPropDesc::CGetObjectPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?ConstructL@CGetObjectPropDesc@@AAEXXZ @ 126 NONAME ; void CGetObjectPropDesc::ConstructL(void) - ??0CGetInterdependentPropDesc@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 127 NONAME ; CGetInterdependentPropDesc::CGetInterdependentPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ??1CGetObjectPropDesc@@UAE@XZ @ 128 NONAME ; CGetObjectPropDesc::~CGetObjectPropDesc(void) - ?ServiceL@CGetObjectPropDesc@@MAEXXZ @ 129 NONAME ; void CGetObjectPropDesc::ServiceL(void) - ?HasDataphase@CSetObjectPropValue@@MBEHXZ @ 130 NONAME ; int CSetObjectPropValue::HasDataphase(void) const - ?ServiceL@CCopyObject@@MAEXXZ @ 131 NONAME ; void CCopyObject::ServiceL(void) - ?CheckRequestL@CGetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 132 NONAME ; enum TMTPResponseCode CGetObjectPropValue::CheckRequestL(void) - ?CloseSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 133 NONAME ; void CMmMtpDpAccessSingleton::CloseSessionL(void) - ?NewL@CGetFormatCapabilities@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 134 NONAME ; class MMmRequestProcessor * CGetFormatCapabilities::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ?ReceiveDataL@CRequestProcessor@@IAEXAAVMMTPType@@@Z @ 135 NONAME ; void CRequestProcessor::ReceiveDataL(class MMTPType &) - ??1CDescriptionUtility@@UAE@XZ @ 136 NONAME ; CDescriptionUtility::~CDescriptionUtility(void) - ?RunL@CSetObjectPropList@@MAEXXZ @ 137 NONAME ; void CSetObjectPropList::RunL(void) - ?ConstructL@CMoveObject@@IAEXXZ @ 138 NONAME ; void CMoveObject::ConstructL(void) - ?NewL@CSendObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 139 NONAME ; class MMmRequestProcessor * CSendObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ??1CGetObjectReferences@@UAE@XZ @ 140 NONAME ; CGetObjectReferences::~CGetObjectReferences(void) - ?HasDataphase@CSendObject@@MBEHXZ @ 141 NONAME ; int CSendObject::HasDataphase(void) const - ??1CSetObjectPropValue@@UAE@XZ @ 142 NONAME ; CSetObjectPropValue::~CSetObjectPropValue(void) - ?ConstructL@CRenameObject@@IAEXXZ @ 143 NONAME ; void CRenameObject::ConstructL(void) - ?SendDataL@CRequestProcessor@@IAEXABVMMTPType@@@Z @ 144 NONAME ; void CRequestProcessor::SendDataL(class MMTPType const &) - ?DoHandleResponsePhaseL@CSendObject@@MAEHXZ @ 145 NONAME ; int CSendObject::DoHandleResponsePhaseL(void) - ?DoCancel@CGetObjectPropList@@MAEXXZ @ 146 NONAME ; void CGetObjectPropList::DoCancel(void) - ?ServiceL@CGetInterdependentPropDesc@@MAEXXZ @ 147 NONAME ; void CGetInterdependentPropDesc::ServiceL(void) - ?DoHandleRequestPhaseL@CRequestProcessor@@MAEHXZ @ 148 NONAME ; int CRequestProcessor::DoHandleRequestPhaseL(void) - ?GetAbstractMediaNameL@CMmMtpDpMetadataAccessWrapper@@QAEPAVHBufC16@@PAVCMPXMedia@@W4TMPXGeneralCategory@@@Z @ 149 NONAME ; class HBufC16 * CMmMtpDpMetadataAccessWrapper::GetAbstractMediaNameL(class CMPXMedia *, enum TMPXGeneralCategory) - ?ServiceL@CSetObjectPropValue@@MAEXXZ @ 150 NONAME ; void CSetObjectPropValue::ServiceL(void) - ?RunError@CRenameObject@@MAEHH@Z @ 151 NONAME ; int CRenameObject::RunError(int) - ??1CDeleteObject@@UAE@XZ @ 152 NONAME ; CDeleteObject::~CDeleteObject(void) - ?DoHandleResponsePhaseL@CGetPartialObject@@MAEHXZ @ 153 NONAME ; int CGetPartialObject::DoHandleResponsePhaseL(void) - ?CheckRequestL@CGetFormatCapabilities@@MAE?AW4TMTPResponseCode@@XZ @ 154 NONAME ; enum TMTPResponseCode CGetFormatCapabilities::CheckRequestL(void) - ??0CSetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 155 NONAME ; CSetObjectPropValue::CSetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) - ??1CGetObjectPropList@@UAE@XZ @ 156 NONAME ; CGetObjectPropList::~CGetObjectPropList(void) - ?ServiceL@CGetObjectPropList@@MAEXXZ @ 157 NONAME ; void CGetObjectPropList::ServiceL(void) - ??0CRenameObject@@IAE@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 158 NONAME ; CRenameObject::CRenameObject(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &) + ?DoCancel@CRequestProcessor@@MAEXXZ @ 52 NONAME ; void CRequestProcessor::DoCancel(void) + ?CheckRequestL@CGetPartialObject@@MAE?AW4TMTPResponseCode@@XZ @ 53 NONAME ; enum TMTPResponseCode CGetPartialObject::CheckRequestL(void) + ?NewL@CRequestUnknown@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 54 NONAME ; class MMmRequestProcessor * CRequestUnknown::NewL(class MMTPDataProviderFramework &, class MMTPConnection &) + ??0CGetFormatCapabilities@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 55 NONAME ; CGetFormatCapabilities::CGetFormatCapabilities(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?ConstructL@CGetObjectInfo@@AAEXXZ @ 56 NONAME ; void CGetObjectInfo::ConstructL(void) + ?UsbDisconnect@CRequestProcessor@@MAEXXZ @ 57 NONAME ; void CRequestProcessor::UsbDisconnect(void) + ?UpdateMusicCollectionL@CMmMtpDpMetadataAccessWrapper@@QAEXXZ @ 58 NONAME ; void CMmMtpDpMetadataAccessWrapper::UpdateMusicCollectionL(void) + ??1CMoveObject@@UAE@XZ @ 59 NONAME ; CMoveObject::~CMoveObject(void) + ?CheckRequestL@CSendObject@@MAE?AW4TMTPResponseCode@@XZ @ 60 NONAME ; enum TMTPResponseCode CSendObject::CheckRequestL(void) + ??1CRequestProcessor@@MAE@XZ @ 61 NONAME ; CRequestProcessor::~CRequestProcessor(void) + ?DoCancel@CDeleteObject@@MAEXXZ @ 62 NONAME ; void CDeleteObject::DoCancel(void) + ??1CGetObject@@UAE@XZ @ 63 NONAME ; CGetObject::~CGetObject(void) + ?NewL@CGetInterdependentPropDesc@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 64 NONAME ; class MMmRequestProcessor * CGetInterdependentPropDesc::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?DoHandleResponsePhaseL@CSetObjectReferences@@EAEHXZ @ 65 NONAME ; int CSetObjectReferences::DoHandleResponsePhaseL(void) + ?GetAccessWrapperL@CMmMtpDpAccessSingleton@@SAAAVCMmMtpDpMetadataAccessWrapper@@XZ @ 66 NONAME ; class CMmMtpDpMetadataAccessWrapper & CMmMtpDpAccessSingleton::GetAccessWrapperL(void) + ??1CGetObjectPropsSupported@@UAE@XZ @ 67 NONAME ; CGetObjectPropsSupported::~CGetObjectPropsSupported(void) + ?CheckRequestL@CGetObjectPropList@@MAE?AW4TMTPResponseCode@@XZ @ 68 NONAME ; enum TMTPResponseCode CGetObjectPropList::CheckRequestL(void) + ?HasDataphase@CRequestProcessor@@MBEHXZ @ 69 NONAME ; int CRequestProcessor::HasDataphase(void) const + ?NewL@CGetObjectPropsSupported@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 70 NONAME ; class MMmRequestProcessor * CGetObjectPropsSupported::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?Connection@CRequestProcessor@@MBEAAVMMTPConnection@@XZ @ 71 NONAME ; class MMTPConnection & CRequestProcessor::Connection(void) const + ?ConstructL@CGetFormatCapabilities@@AAEXXZ @ 72 NONAME ; void CGetFormatCapabilities::ConstructL(void) + ??1CPropertySettingUtility@@UAE@XZ @ 73 NONAME ; CPropertySettingUtility::~CPropertySettingUtility(void) + ??1CGetPartialObject@@UAE@XZ @ 74 NONAME ; CGetPartialObject::~CGetPartialObject(void) + ?NewL@CGetObjectInfo@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 75 NONAME ; class MMmRequestProcessor * CGetObjectInfo::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?RunError@CSetObjectPropList@@MAEHH@Z @ 76 NONAME ; int CSetObjectPropList::RunError(int) + ?CheckRequestL@CGetInterdependentPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 77 NONAME ; enum TMTPResponseCode CGetInterdependentPropDesc::CheckRequestL(void) + ?Match@CRequestUnknown@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 78 NONAME ; int CRequestUnknown::Match(class TMTPTypeRequest const &, class MMTPConnection &) const + ?ServiceL@CMoveObject@@MAEXXZ @ 79 NONAME ; void CMoveObject::ServiceL(void) + ?CreateDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 80 NONAME ; void CMmMtpDpMetadataAccessWrapper::CreateDummyFile(class TDesC16 const &) + ?CheckRequestL@CGetObjectPropDesc@@MAE?AW4TMTPResponseCode@@XZ @ 81 NONAME ; enum TMTPResponseCode CGetObjectPropDesc::CheckRequestL(void) + ?DoHandleRToIPhaseL@CRequestProcessor@@MAEHXZ @ 82 NONAME ; int CRequestProcessor::DoHandleRToIPhaseL(void) + ?ServiceMetaDataToWrapperL@CSetObjectPropValue@@IAE?AW4TMTPResponseCode@@GAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 83 NONAME ; enum TMTPResponseCode CSetObjectPropValue::ServiceMetaDataToWrapperL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) + ?NewCommonObjectPropertyL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@G@Z @ 84 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewCommonObjectPropertyL(unsigned short) + ?FormatFromFilename@MmMtpDpUtility@@SA?AW4TMTPFormatCode@@ABVTDesC16@@@Z @ 85 NONAME ; enum TMTPFormatCode MmMtpDpUtility::FormatFromFilename(class TDesC16 const &) + ?CheckRequestL@CSetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 86 NONAME ; enum TMTPResponseCode CSetObjectPropValue::CheckRequestL(void) + ??0CPropertySettingUtility@@IAE@XZ @ 87 NONAME ; CPropertySettingUtility::CPropertySettingUtility(void) + ?Match@CRequestProcessor@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 88 NONAME ; int CRequestProcessor::Match(class TMTPTypeRequest const &, class MMTPConnection &) const + ??0CCopyObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 89 NONAME ; CCopyObject::CCopyObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?CheckRequestL@CRequestProcessor@@MAE?AW4TMTPResponseCode@@XZ @ 90 NONAME ; enum TMTPResponseCode CRequestProcessor::CheckRequestL(void) + ?SendResponseL@CRequestProcessor@@IAEXW4TMTPResponseCode@@HPAK@Z @ 91 NONAME ; void CRequestProcessor::SendResponseL(enum TMTPResponseCode, int, unsigned long *) + ??0CGetPartialObject@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@@Z @ 92 NONAME ; CGetPartialObject::CGetPartialObject(class MMTPDataProviderFramework &, class MMTPConnection &) + ?DoHandleCompletingPhaseL@CRequestProcessor@@MAEHXZ @ 93 NONAME ; int CRequestProcessor::DoHandleCompletingPhaseL(void) + ?DeleteDummyFile@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 94 NONAME ; void CMmMtpDpMetadataAccessWrapper::DeleteDummyFile(class TDesC16 const &) + ?DoSetObjectReferencesL@CSetObjectReferences@@IAEXABVCMTPObjectMetaData@@@Z @ 95 NONAME ; void CSetObjectReferences::DoSetObjectReferencesL(class CMTPObjectMetaData const &) + ??1CGetObjectInfo@@UAE@XZ @ 96 NONAME ; CGetObjectInfo::~CGetObjectInfo(void) + ?ServiceL@CRequestUnknown@@MAEXXZ @ 97 NONAME ; void CRequestUnknown::ServiceL(void) + ?HasDataphase@CSetObjectPropList@@MBEHXZ @ 98 NONAME ; int CSetObjectPropList::HasDataphase(void) const + ?NewL@CGetObjectReferences@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 99 NONAME ; class MMmRequestProcessor * CGetObjectReferences::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?DoCancel@CRenameObject@@MAEXXZ @ 100 NONAME ; void CRenameObject::DoCancel(void) + ??1CSetObjectReferences@@UAE@XZ @ 101 NONAME ; CSetObjectReferences::~CSetObjectReferences(void) + ?Match@CSendObject@@MBEHABVTMTPTypeRequest@@AAVMMTPConnection@@@Z @ 102 NONAME ; int CSendObject::Match(class TMTPTypeRequest const &, class MMTPConnection &) const + ?NewL@CSetObjectPropList@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 103 NONAME ; class MMmRequestProcessor * CSetObjectPropList::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?GetAllAbstractMediaL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@PAPAVCMPXMediaArray@@W4TMPXGeneralCategory@@@Z @ 104 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetAllAbstractMediaL(class TDesC16 const &, class CMPXMediaArray * *, enum TMPXGeneralCategory) + ??1CCopyObject@@UAE@XZ @ 105 NONAME ; CCopyObject::~CCopyObject(void) + ?GetModifiedContentL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@AAHAAVCDesC16Array@@@Z @ 106 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetModifiedContentL(class TDesC16 const &, int &, class CDesC16Array &) + ?RunL@CGetObjectPropList@@MAEXXZ @ 107 NONAME ; void CGetObjectPropList::RunL(void) + ?NewRangeFormDescriptionL@CDescriptionUtility@@QAEPAVCMTPTypeObjectPropDesc@@GKKKH@Z @ 108 NONAME ; class CMTPTypeObjectPropDesc * CDescriptionUtility::NewRangeFormDescriptionL(unsigned short, unsigned long, unsigned long, unsigned long, int) + ?RunError@CRequestProcessor@@MAEHH@Z @ 109 NONAME ; int CRequestProcessor::RunError(int) + ?SessionId@CRequestProcessor@@MAEKXZ @ 110 NONAME ; unsigned long CRequestProcessor::SessionId(void) + ??0CDescriptionUtility@@IAE@XZ @ 111 NONAME ; CDescriptionUtility::CDescriptionUtility(void) + ?HandleEventL@CRequestProcessor@@MAEXABVTMTPTypeEvent@@@Z @ 112 NONAME ; void CRequestProcessor::HandleEventL(class TMTPTypeEvent const &) + ?NewL@CGetPartialObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 113 NONAME ; class MMmRequestProcessor * CGetPartialObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?HasDataphase@CSetObjectReferences@@EBEHXZ @ 114 NONAME ; int CSetObjectReferences::HasDataphase(void) const + ?ConstructL@CGetInterdependentPropDesc@@IAEXXZ @ 115 NONAME ; void CGetInterdependentPropDesc::ConstructL(void) + ?RunError@CGetObjectPropList@@MAEHH@Z @ 116 NONAME ; int CGetObjectPropList::RunError(int) + ?DoHandleResponsePhaseL@CSetObjectPropList@@MAEHXZ @ 117 NONAME ; int CSetObjectPropList::DoHandleResponsePhaseL(void) + ??0CDeleteObject@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 118 NONAME ; CDeleteObject::CDeleteObject(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?NewL@CRenameObject@@SAPAV1@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 119 NONAME ; class CRenameObject * CRenameObject::NewL(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &) + ?RenameObjectL@CMmMtpDpMetadataAccessWrapper@@QAEXABVCMTPObjectMetaData@@ABVTDesC16@@@Z @ 120 NONAME ; void CMmMtpDpMetadataAccessWrapper::RenameObjectL(class CMTPObjectMetaData const &, class TDesC16 const &) + ?GetObjectMetadataValueL@CMmMtpDpMetadataAccessWrapper@@QAEXGAAVMMTPType@@ABVCMTPObjectMetaData@@@Z @ 121 NONAME ; void CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL(unsigned short, class MMTPType &, class CMTPObjectMetaData const &) + ?AddDummyFileL@CMmMtpDpMetadataAccessWrapper@@QAEXABVTDesC16@@@Z @ 122 NONAME ; void CMmMtpDpMetadataAccessWrapper::AddDummyFileL(class TDesC16 const &) + ??0CGetObjectPropDesc@@AAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 123 NONAME ; CGetObjectPropDesc::CGetObjectPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?ConstructL@CGetObjectPropDesc@@AAEXXZ @ 124 NONAME ; void CGetObjectPropDesc::ConstructL(void) + ??0CGetInterdependentPropDesc@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 125 NONAME ; CGetInterdependentPropDesc::CGetInterdependentPropDesc(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ??1CGetObjectPropDesc@@UAE@XZ @ 126 NONAME ; CGetObjectPropDesc::~CGetObjectPropDesc(void) + ?ServiceL@CGetObjectPropDesc@@MAEXXZ @ 127 NONAME ; void CGetObjectPropDesc::ServiceL(void) + ?HasDataphase@CSetObjectPropValue@@MBEHXZ @ 128 NONAME ; int CSetObjectPropValue::HasDataphase(void) const + ?ServiceL@CCopyObject@@MAEXXZ @ 129 NONAME ; void CCopyObject::ServiceL(void) + ?CheckRequestL@CGetObjectPropValue@@MAE?AW4TMTPResponseCode@@XZ @ 130 NONAME ; enum TMTPResponseCode CGetObjectPropValue::CheckRequestL(void) + ?CloseSessionL@CMmMtpDpAccessSingleton@@SAXXZ @ 131 NONAME ; void CMmMtpDpAccessSingleton::CloseSessionL(void) + ?NewL@CGetFormatCapabilities@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 132 NONAME ; class MMmRequestProcessor * CGetFormatCapabilities::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ?ReceiveDataL@CRequestProcessor@@IAEXAAVMMTPType@@@Z @ 133 NONAME ; void CRequestProcessor::ReceiveDataL(class MMTPType &) + ??1CDescriptionUtility@@UAE@XZ @ 134 NONAME ; CDescriptionUtility::~CDescriptionUtility(void) + ?RunL@CSetObjectPropList@@MAEXXZ @ 135 NONAME ; void CSetObjectPropList::RunL(void) + ?ConstructL@CMoveObject@@IAEXXZ @ 136 NONAME ; void CMoveObject::ConstructL(void) + ?NewL@CSendObject@@SAPAVMMmRequestProcessor@@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 137 NONAME ; class MMmRequestProcessor * CSendObject::NewL(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ??1CGetObjectReferences@@UAE@XZ @ 138 NONAME ; CGetObjectReferences::~CGetObjectReferences(void) + ?HasDataphase@CSendObject@@MBEHXZ @ 139 NONAME ; int CSendObject::HasDataphase(void) const + ??1CSetObjectPropValue@@UAE@XZ @ 140 NONAME ; CSetObjectPropValue::~CSetObjectPropValue(void) + ?ConstructL@CRenameObject@@IAEXXZ @ 141 NONAME ; void CRenameObject::ConstructL(void) + ?SendDataL@CRequestProcessor@@IAEXABVMMTPType@@@Z @ 142 NONAME ; void CRequestProcessor::SendDataL(class MMTPType const &) + ?DoHandleResponsePhaseL@CSendObject@@MAEHXZ @ 143 NONAME ; int CSendObject::DoHandleResponsePhaseL(void) + ?SetReferenceL@CMmMtpDpMetadataAccessWrapper@@QAEXABVCMTPObjectMetaData@@AAVCDesC16Array@@@Z @ 144 NONAME ; void CMmMtpDpMetadataAccessWrapper::SetReferenceL(class CMTPObjectMetaData const &, class CDesC16Array &) + ?DoCancel@CGetObjectPropList@@MAEXXZ @ 145 NONAME ; void CGetObjectPropList::DoCancel(void) + ?ServiceL@CGetInterdependentPropDesc@@MAEXXZ @ 146 NONAME ; void CGetInterdependentPropDesc::ServiceL(void) + ?DoHandleRequestPhaseL@CRequestProcessor@@MAEHXZ @ 147 NONAME ; int CRequestProcessor::DoHandleRequestPhaseL(void) + ?GetAbstractMediaNameL@CMmMtpDpMetadataAccessWrapper@@QAEPAVHBufC16@@PAVCMPXMedia@@W4TMPXGeneralCategory@@@Z @ 148 NONAME ; class HBufC16 * CMmMtpDpMetadataAccessWrapper::GetAbstractMediaNameL(class CMPXMedia *, enum TMPXGeneralCategory) + ?ServiceL@CSetObjectPropValue@@MAEXXZ @ 149 NONAME ; void CSetObjectPropValue::ServiceL(void) + ?RunError@CRenameObject@@MAEHH@Z @ 150 NONAME ; int CRenameObject::RunError(int) + ??1CDeleteObject@@UAE@XZ @ 151 NONAME ; CDeleteObject::~CDeleteObject(void) + ?DoHandleResponsePhaseL@CGetPartialObject@@MAEHXZ @ 152 NONAME ; int CGetPartialObject::DoHandleResponsePhaseL(void) + ?CheckRequestL@CGetFormatCapabilities@@MAE?AW4TMTPResponseCode@@XZ @ 153 NONAME ; enum TMTPResponseCode CGetFormatCapabilities::CheckRequestL(void) + ??0CSetObjectPropValue@@IAE@AAVMMTPDataProviderFramework@@AAVMMTPConnection@@AAVMMmMtpDpConfig@@@Z @ 154 NONAME ; CSetObjectPropValue::CSetObjectPropValue(class MMTPDataProviderFramework &, class MMTPConnection &, class MMmMtpDpConfig &) + ??1CGetObjectPropList@@UAE@XZ @ 155 NONAME ; CGetObjectPropList::~CGetObjectPropList(void) + ?ServiceL@CGetObjectPropList@@MAEXXZ @ 156 NONAME ; void CGetObjectPropList::ServiceL(void) + ??0CRenameObject@@IAE@AAVMMTPDataProviderFramework@@AAVCMmMtpDpMetadataAccessWrapper@@@Z @ 157 NONAME ; CRenameObject::CRenameObject(class MMTPDataProviderFramework &, class CMmMtpDpMetadataAccessWrapper &) diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/eabi/mmmtpdprequestprocessoru.def Fri Apr 02 16:24:05 2010 +0100 @@ -49,231 +49,230 @@ _ZN14CGetObjectInfoD2Ev @ 48 NONAME _ZN14MmMtpDpUtility12GetDrmStatusERK7TDesC16 @ 49 NONAME _ZN14MmMtpDpUtility18FormatFromFilenameERK7TDesC16 @ 50 NONAME - _ZN14MmMtpDpUtility8IsVideoLERK7TDesC16 @ 51 NONAME - _ZN15CRequestUnknown4NewLER25MMTPDataProviderFrameworkR14MMTPConnection @ 52 NONAME - _ZN15CRequestUnknown8ServiceLEv @ 53 NONAME - _ZN15CRequestUnknownC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 54 NONAME - _ZN15CRequestUnknownC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 55 NONAME - _ZN15CRequestUnknownD0Ev @ 56 NONAME - _ZN15CRequestUnknownD1Ev @ 57 NONAME - _ZN15CRequestUnknownD2Ev @ 58 NONAME - _ZN17CGetPartialObject13CheckRequestLEv @ 59 NONAME - _ZN17CGetPartialObject22DoHandleResponsePhaseLEv @ 60 NONAME - _ZN17CGetPartialObject4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 61 NONAME - _ZN17CGetPartialObject8ServiceLEv @ 62 NONAME - _ZN17CGetPartialObjectC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 63 NONAME - _ZN17CGetPartialObjectC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 64 NONAME - _ZN17CGetPartialObjectD0Ev @ 65 NONAME - _ZN17CGetPartialObjectD1Ev @ 66 NONAME - _ZN17CGetPartialObjectD2Ev @ 67 NONAME - _ZN17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 68 NONAME - _ZN17CRequestProcessor12ReceiveDataLER8MMTPType @ 69 NONAME - _ZN17CRequestProcessor13CheckRequestLEv @ 70 NONAME - _ZN17CRequestProcessor13SendResponseLE16TMTPResponseCodeiPm @ 71 NONAME - _ZN17CRequestProcessor13UsbDisconnectEv @ 72 NONAME - _ZN17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 73 NONAME - _ZN17CRequestProcessor18DoHandleRToIPhaseLEv @ 74 NONAME - _ZN17CRequestProcessor21DoHandleRequestPhaseLEv @ 75 NONAME - _ZN17CRequestProcessor22DoHandleDataIToRPhaseLEv @ 76 NONAME - _ZN17CRequestProcessor22DoHandleResponsePhaseLEv @ 77 NONAME - _ZN17CRequestProcessor24DoHandleCompletingPhaseLEv @ 78 NONAME - _ZN17CRequestProcessor4RunLEv @ 79 NONAME - _ZN17CRequestProcessor7ReleaseEv @ 80 NONAME - _ZN17CRequestProcessor8DoCancelEv @ 81 NONAME - _ZN17CRequestProcessor8RunErrorEi @ 82 NONAME - _ZN17CRequestProcessor9SendDataLERK8MMTPType @ 83 NONAME - _ZN17CRequestProcessor9SessionIdEv @ 84 NONAME - _ZN17CRequestProcessorC2ER25MMTPDataProviderFrameworkR14MMTPConnectioniPK22TMTPRequestElementInfo @ 85 NONAME - _ZN17CRequestProcessorD0Ev @ 86 NONAME - _ZN17CRequestProcessorD1Ev @ 87 NONAME - _ZN17CRequestProcessorD2Ev @ 88 NONAME - _ZN18CGetObjectPropDesc10ConstructLEv @ 89 NONAME - _ZN18CGetObjectPropDesc13CheckRequestLEv @ 90 NONAME - _ZN18CGetObjectPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 91 NONAME - _ZN18CGetObjectPropDesc8ServiceLEv @ 92 NONAME - _ZN18CGetObjectPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 93 NONAME - _ZN18CGetObjectPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 94 NONAME - _ZN18CGetObjectPropDescD0Ev @ 95 NONAME - _ZN18CGetObjectPropDescD1Ev @ 96 NONAME - _ZN18CGetObjectPropDescD2Ev @ 97 NONAME - _ZN18CGetObjectPropList10ConstructLEv @ 98 NONAME - _ZN18CGetObjectPropList13CheckRequestLEv @ 99 NONAME - _ZN18CGetObjectPropList4RunLEv @ 100 NONAME - _ZN18CGetObjectPropList8DoCancelEv @ 101 NONAME - _ZN18CGetObjectPropList8RunErrorEi @ 102 NONAME - _ZN18CGetObjectPropList8ServiceLEv @ 103 NONAME - _ZN18CGetObjectPropListC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 104 NONAME - _ZN18CGetObjectPropListD0Ev @ 105 NONAME - _ZN18CGetObjectPropListD1Ev @ 106 NONAME - _ZN18CGetObjectPropListD2Ev @ 107 NONAME - _ZN18CSetObjectPropList13CheckRequestLEv @ 108 NONAME - _ZN18CSetObjectPropList22DoHandleResponsePhaseLEv @ 109 NONAME - _ZN18CSetObjectPropList4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 110 NONAME - _ZN18CSetObjectPropList4RunLEv @ 111 NONAME - _ZN18CSetObjectPropList8DoCancelEv @ 112 NONAME - _ZN18CSetObjectPropList8RunErrorEi @ 113 NONAME - _ZN18CSetObjectPropList8ServiceLEv @ 114 NONAME - _ZN18CSetObjectPropListD0Ev @ 115 NONAME - _ZN18CSetObjectPropListD1Ev @ 116 NONAME - _ZN18CSetObjectPropListD2Ev @ 117 NONAME - _ZN19CDescriptionUtility24NewCommonObjectPropertyLEt @ 118 NONAME - _ZN19CDescriptionUtility24NewRangeFormDescriptionLEtmmmi @ 119 NONAME - _ZN19CDescriptionUtilityC2Ev @ 120 NONAME - _ZN19CDescriptionUtilityD0Ev @ 121 NONAME - _ZN19CDescriptionUtilityD1Ev @ 122 NONAME - _ZN19CDescriptionUtilityD2Ev @ 123 NONAME - _ZN19CGetObjectPropValue13CheckRequestLEv @ 124 NONAME - _ZN19CGetObjectPropValue27ServiceMetaDataFromWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 125 NONAME - _ZN19CGetObjectPropValue8ServiceLEv @ 126 NONAME - _ZN19CGetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 127 NONAME - _ZN19CGetObjectPropValueD0Ev @ 128 NONAME - _ZN19CGetObjectPropValueD1Ev @ 129 NONAME - _ZN19CGetObjectPropValueD2Ev @ 130 NONAME - _ZN19CSetObjectPropValue13CheckRequestLEv @ 131 NONAME - _ZN19CSetObjectPropValue22DoHandleResponsePhaseLEv @ 132 NONAME - _ZN19CSetObjectPropValue25ServiceMetaDataToWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 133 NONAME - _ZN19CSetObjectPropValue8ServiceLEv @ 134 NONAME - _ZN19CSetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 135 NONAME - _ZN19CSetObjectPropValueD0Ev @ 136 NONAME - _ZN19CSetObjectPropValueD1Ev @ 137 NONAME - _ZN19CSetObjectPropValueD2Ev @ 138 NONAME - _ZN20CGetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 139 NONAME - _ZN20CGetObjectReferencesD0Ev @ 140 NONAME - _ZN20CGetObjectReferencesD1Ev @ 141 NONAME - _ZN20CGetObjectReferencesD2Ev @ 142 NONAME - _ZN20CSetObjectReferences22DoHandleResponsePhaseLEv @ 143 NONAME - _ZN20CSetObjectReferences22DoSetObjectReferencesLER29CMmMtpDpMetadataAccessWrappertRK7TDesC16R12CDesC16Array @ 144 NONAME - _ZN20CSetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 145 NONAME - _ZN20CSetObjectReferences8ServiceLEv @ 146 NONAME - _ZN20CSetObjectReferencesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 147 NONAME - _ZN20CSetObjectReferencesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 148 NONAME - _ZN20CSetObjectReferencesD0Ev @ 149 NONAME - _ZN20CSetObjectReferencesD1Ev @ 150 NONAME - _ZN20CSetObjectReferencesD2Ev @ 151 NONAME - _ZN22CGetFormatCapabilities10ConstructLEv @ 152 NONAME - _ZN22CGetFormatCapabilities13CheckRequestLEv @ 153 NONAME - _ZN22CGetFormatCapabilities4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 154 NONAME - _ZN22CGetFormatCapabilities8ServiceLEv @ 155 NONAME - _ZN22CGetFormatCapabilitiesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 156 NONAME - _ZN22CGetFormatCapabilitiesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 157 NONAME - _ZN22CGetFormatCapabilitiesD0Ev @ 158 NONAME - _ZN22CGetFormatCapabilitiesD1Ev @ 159 NONAME - _ZN22CGetFormatCapabilitiesD2Ev @ 160 NONAME - _ZN23CMmMtpDpAccessSingleton12OpenSessionLEv @ 161 NONAME - _ZN23CMmMtpDpAccessSingleton13CloseSessionLEv @ 162 NONAME - _ZN23CMmMtpDpAccessSingleton17GetAccessWrapperLEv @ 163 NONAME - _ZN23CMmMtpDpAccessSingleton7CreateLER3RFsR25MMTPDataProviderFramework @ 164 NONAME - _ZN23CMmMtpDpAccessSingleton7ReleaseEv @ 165 NONAME - _ZN23CPropertySettingUtility21SetMetaDataToWrapperLER14MMmMtpDpConfigtR8MMTPTypeRK18CMTPObjectMetaData @ 166 NONAME - _ZN23CPropertySettingUtilityC2Ev @ 167 NONAME - _ZN23CPropertySettingUtilityD0Ev @ 168 NONAME - _ZN23CPropertySettingUtilityD1Ev @ 169 NONAME - _ZN23CPropertySettingUtilityD2Ev @ 170 NONAME - _ZN24CGetObjectPropsSupported4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 171 NONAME - _ZN24CGetObjectPropsSupported8ServiceLEv @ 172 NONAME - _ZN24CGetObjectPropsSupportedD0Ev @ 173 NONAME - _ZN24CGetObjectPropsSupportedD1Ev @ 174 NONAME - _ZN24CGetObjectPropsSupportedD2Ev @ 175 NONAME - _ZN26CGetInterdependentPropDesc10ConstructLEv @ 176 NONAME - _ZN26CGetInterdependentPropDesc13CheckRequestLEv @ 177 NONAME - _ZN26CGetInterdependentPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 178 NONAME - _ZN26CGetInterdependentPropDesc8ServiceLEv @ 179 NONAME - _ZN26CGetInterdependentPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 180 NONAME - _ZN26CGetInterdependentPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 181 NONAME - _ZN26CGetInterdependentPropDescD0Ev @ 182 NONAME - _ZN26CGetInterdependentPropDescD1Ev @ 183 NONAME - _ZN26CGetInterdependentPropDescD2Ev @ 184 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper13AddDummyFileLERK7TDesC16 @ 185 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper13RenameObjectLERK7TDesC16S2_ @ 186 NONAME + _ZN15CRequestUnknown4NewLER25MMTPDataProviderFrameworkR14MMTPConnection @ 51 NONAME + _ZN15CRequestUnknown8ServiceLEv @ 52 NONAME + _ZN15CRequestUnknownC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 53 NONAME + _ZN15CRequestUnknownC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 54 NONAME + _ZN15CRequestUnknownD0Ev @ 55 NONAME + _ZN15CRequestUnknownD1Ev @ 56 NONAME + _ZN15CRequestUnknownD2Ev @ 57 NONAME + _ZN17CGetPartialObject13CheckRequestLEv @ 58 NONAME + _ZN17CGetPartialObject22DoHandleResponsePhaseLEv @ 59 NONAME + _ZN17CGetPartialObject4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 60 NONAME + _ZN17CGetPartialObject8ServiceLEv @ 61 NONAME + _ZN17CGetPartialObjectC1ER25MMTPDataProviderFrameworkR14MMTPConnection @ 62 NONAME + _ZN17CGetPartialObjectC2ER25MMTPDataProviderFrameworkR14MMTPConnection @ 63 NONAME + _ZN17CGetPartialObjectD0Ev @ 64 NONAME + _ZN17CGetPartialObjectD1Ev @ 65 NONAME + _ZN17CGetPartialObjectD2Ev @ 66 NONAME + _ZN17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 67 NONAME + _ZN17CRequestProcessor12ReceiveDataLER8MMTPType @ 68 NONAME + _ZN17CRequestProcessor13CheckRequestLEv @ 69 NONAME + _ZN17CRequestProcessor13SendResponseLE16TMTPResponseCodeiPm @ 70 NONAME + _ZN17CRequestProcessor13UsbDisconnectEv @ 71 NONAME + _ZN17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 72 NONAME + _ZN17CRequestProcessor18DoHandleRToIPhaseLEv @ 73 NONAME + _ZN17CRequestProcessor21DoHandleRequestPhaseLEv @ 74 NONAME + _ZN17CRequestProcessor22DoHandleDataIToRPhaseLEv @ 75 NONAME + _ZN17CRequestProcessor22DoHandleResponsePhaseLEv @ 76 NONAME + _ZN17CRequestProcessor24DoHandleCompletingPhaseLEv @ 77 NONAME + _ZN17CRequestProcessor4RunLEv @ 78 NONAME + _ZN17CRequestProcessor7ReleaseEv @ 79 NONAME + _ZN17CRequestProcessor8DoCancelEv @ 80 NONAME + _ZN17CRequestProcessor8RunErrorEi @ 81 NONAME + _ZN17CRequestProcessor9SendDataLERK8MMTPType @ 82 NONAME + _ZN17CRequestProcessor9SessionIdEv @ 83 NONAME + _ZN17CRequestProcessorC2ER25MMTPDataProviderFrameworkR14MMTPConnectioniPK22TMTPRequestElementInfo @ 84 NONAME + _ZN17CRequestProcessorD0Ev @ 85 NONAME + _ZN17CRequestProcessorD1Ev @ 86 NONAME + _ZN17CRequestProcessorD2Ev @ 87 NONAME + _ZN18CGetObjectPropDesc10ConstructLEv @ 88 NONAME + _ZN18CGetObjectPropDesc13CheckRequestLEv @ 89 NONAME + _ZN18CGetObjectPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 90 NONAME + _ZN18CGetObjectPropDesc8ServiceLEv @ 91 NONAME + _ZN18CGetObjectPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 92 NONAME + _ZN18CGetObjectPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 93 NONAME + _ZN18CGetObjectPropDescD0Ev @ 94 NONAME + _ZN18CGetObjectPropDescD1Ev @ 95 NONAME + _ZN18CGetObjectPropDescD2Ev @ 96 NONAME + _ZN18CGetObjectPropList10ConstructLEv @ 97 NONAME + _ZN18CGetObjectPropList13CheckRequestLEv @ 98 NONAME + _ZN18CGetObjectPropList4RunLEv @ 99 NONAME + _ZN18CGetObjectPropList8DoCancelEv @ 100 NONAME + _ZN18CGetObjectPropList8RunErrorEi @ 101 NONAME + _ZN18CGetObjectPropList8ServiceLEv @ 102 NONAME + _ZN18CGetObjectPropListC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 103 NONAME + _ZN18CGetObjectPropListD0Ev @ 104 NONAME + _ZN18CGetObjectPropListD1Ev @ 105 NONAME + _ZN18CGetObjectPropListD2Ev @ 106 NONAME + _ZN18CSetObjectPropList13CheckRequestLEv @ 107 NONAME + _ZN18CSetObjectPropList22DoHandleResponsePhaseLEv @ 108 NONAME + _ZN18CSetObjectPropList4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 109 NONAME + _ZN18CSetObjectPropList4RunLEv @ 110 NONAME + _ZN18CSetObjectPropList8DoCancelEv @ 111 NONAME + _ZN18CSetObjectPropList8RunErrorEi @ 112 NONAME + _ZN18CSetObjectPropList8ServiceLEv @ 113 NONAME + _ZN18CSetObjectPropListD0Ev @ 114 NONAME + _ZN18CSetObjectPropListD1Ev @ 115 NONAME + _ZN18CSetObjectPropListD2Ev @ 116 NONAME + _ZN19CDescriptionUtility24NewCommonObjectPropertyLEt @ 117 NONAME + _ZN19CDescriptionUtility24NewRangeFormDescriptionLEtmmmi @ 118 NONAME + _ZN19CDescriptionUtilityC2Ev @ 119 NONAME + _ZN19CDescriptionUtilityD0Ev @ 120 NONAME + _ZN19CDescriptionUtilityD1Ev @ 121 NONAME + _ZN19CDescriptionUtilityD2Ev @ 122 NONAME + _ZN19CGetObjectPropValue13CheckRequestLEv @ 123 NONAME + _ZN19CGetObjectPropValue27ServiceMetaDataFromWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 124 NONAME + _ZN19CGetObjectPropValue8ServiceLEv @ 125 NONAME + _ZN19CGetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 126 NONAME + _ZN19CGetObjectPropValueD0Ev @ 127 NONAME + _ZN19CGetObjectPropValueD1Ev @ 128 NONAME + _ZN19CGetObjectPropValueD2Ev @ 129 NONAME + _ZN19CSetObjectPropValue13CheckRequestLEv @ 130 NONAME + _ZN19CSetObjectPropValue22DoHandleResponsePhaseLEv @ 131 NONAME + _ZN19CSetObjectPropValue25ServiceMetaDataToWrapperLEtR8MMTPTypeRK18CMTPObjectMetaData @ 132 NONAME + _ZN19CSetObjectPropValue8ServiceLEv @ 133 NONAME + _ZN19CSetObjectPropValueC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 134 NONAME + _ZN19CSetObjectPropValueD0Ev @ 135 NONAME + _ZN19CSetObjectPropValueD1Ev @ 136 NONAME + _ZN19CSetObjectPropValueD2Ev @ 137 NONAME + _ZN20CGetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 138 NONAME + _ZN20CGetObjectReferencesD0Ev @ 139 NONAME + _ZN20CGetObjectReferencesD1Ev @ 140 NONAME + _ZN20CGetObjectReferencesD2Ev @ 141 NONAME + _ZN20CSetObjectReferences22DoHandleResponsePhaseLEv @ 142 NONAME + _ZN20CSetObjectReferences22DoSetObjectReferencesLERK18CMTPObjectMetaData @ 143 NONAME + _ZN20CSetObjectReferences4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 144 NONAME + _ZN20CSetObjectReferences8ServiceLEv @ 145 NONAME + _ZN20CSetObjectReferencesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 146 NONAME + _ZN20CSetObjectReferencesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 147 NONAME + _ZN20CSetObjectReferencesD0Ev @ 148 NONAME + _ZN20CSetObjectReferencesD1Ev @ 149 NONAME + _ZN20CSetObjectReferencesD2Ev @ 150 NONAME + _ZN22CGetFormatCapabilities10ConstructLEv @ 151 NONAME + _ZN22CGetFormatCapabilities13CheckRequestLEv @ 152 NONAME + _ZN22CGetFormatCapabilities4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 153 NONAME + _ZN22CGetFormatCapabilities8ServiceLEv @ 154 NONAME + _ZN22CGetFormatCapabilitiesC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 155 NONAME + _ZN22CGetFormatCapabilitiesC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 156 NONAME + _ZN22CGetFormatCapabilitiesD0Ev @ 157 NONAME + _ZN22CGetFormatCapabilitiesD1Ev @ 158 NONAME + _ZN22CGetFormatCapabilitiesD2Ev @ 159 NONAME + _ZN23CMmMtpDpAccessSingleton12OpenSessionLEv @ 160 NONAME + _ZN23CMmMtpDpAccessSingleton13CloseSessionLEv @ 161 NONAME + _ZN23CMmMtpDpAccessSingleton17GetAccessWrapperLEv @ 162 NONAME + _ZN23CMmMtpDpAccessSingleton7CreateLER25MMTPDataProviderFramework @ 163 NONAME + _ZN23CMmMtpDpAccessSingleton7ReleaseEv @ 164 NONAME + _ZN23CPropertySettingUtility20SetMetaDataToWrapperER14MMmMtpDpConfigtR8MMTPTypeRK18CMTPObjectMetaData @ 165 NONAME + _ZN23CPropertySettingUtilityC2Ev @ 166 NONAME + _ZN23CPropertySettingUtilityD0Ev @ 167 NONAME + _ZN23CPropertySettingUtilityD1Ev @ 168 NONAME + _ZN23CPropertySettingUtilityD2Ev @ 169 NONAME + _ZN24CGetObjectPropsSupported4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 170 NONAME + _ZN24CGetObjectPropsSupported8ServiceLEv @ 171 NONAME + _ZN24CGetObjectPropsSupportedD0Ev @ 172 NONAME + _ZN24CGetObjectPropsSupportedD1Ev @ 173 NONAME + _ZN24CGetObjectPropsSupportedD2Ev @ 174 NONAME + _ZN26CGetInterdependentPropDesc10ConstructLEv @ 175 NONAME + _ZN26CGetInterdependentPropDesc13CheckRequestLEv @ 176 NONAME + _ZN26CGetInterdependentPropDesc4NewLER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 177 NONAME + _ZN26CGetInterdependentPropDesc8ServiceLEv @ 178 NONAME + _ZN26CGetInterdependentPropDescC1ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 179 NONAME + _ZN26CGetInterdependentPropDescC2ER25MMTPDataProviderFrameworkR14MMTPConnectionR14MMmMtpDpConfig @ 180 NONAME + _ZN26CGetInterdependentPropDescD0Ev @ 181 NONAME + _ZN26CGetInterdependentPropDescD1Ev @ 182 NONAME + _ZN26CGetInterdependentPropDescD2Ev @ 183 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper13AddDummyFileLERK7TDesC16 @ 184 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper13RenameObjectLERK18CMTPObjectMetaDataRK7TDesC16 @ 185 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper13SetReferenceLERK18CMTPObjectMetaDataR12CDesC16Array @ 186 NONAME _ZN29CMmMtpDpMetadataAccessWrapper15CreateDummyFileERK7TDesC16 @ 187 NONAME _ZN29CMmMtpDpMetadataAccessWrapper15DeleteDummyFileERK7TDesC16 @ 188 NONAME _ZN29CMmMtpDpMetadataAccessWrapper16CleanupDatabaseLEv @ 189 NONAME _ZN29CMmMtpDpMetadataAccessWrapper16GetAllReferenceLEP9CMPXMediaR12CDesC16Array @ 190 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper17SetAbstractMediaLERK7TDesC16R12CDesC16Array19TMPXGeneralCategory @ 191 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper19GetModifiedContentLERK7TDesC16RiR12CDesC16Array @ 192 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper20GetAllAbstractMediaLERK7TDesC16PP14CMPXMediaArray19TMPXGeneralCategory @ 193 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper21GetAbstractMediaNameLEP9CMPXMedia19TMPXGeneralCategory @ 194 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLEv @ 195 NONAME - _ZN29CMmMtpDpMetadataAccessWrapper23GetObjectMetadataValueLEtR8MMTPTypeRK18CMTPObjectMetaData @ 196 NONAME - _ZNK11CSendObject12HasDataphaseEv @ 197 NONAME - _ZNK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 198 NONAME - _ZNK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 199 NONAME - _ZNK17CRequestProcessor10ConnectionEv @ 200 NONAME - _ZNK17CRequestProcessor12HasDataphaseEv @ 201 NONAME - _ZNK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 202 NONAME - _ZNK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 203 NONAME - _ZNK17CRequestProcessor7RequestEv @ 204 NONAME - _ZNK18CSetObjectPropList12HasDataphaseEv @ 205 NONAME - _ZNK19CSetObjectPropValue12HasDataphaseEv @ 206 NONAME - _ZNK20CSetObjectReferences12HasDataphaseEv @ 207 NONAME - _ZTI10CGetObject @ 208 NONAME - _ZTI11CCopyObject @ 209 NONAME - _ZTI11CMoveObject @ 210 NONAME - _ZTI11CSendObject @ 211 NONAME - _ZTI13CDeleteObject @ 212 NONAME - _ZTI13CRenameObject @ 213 NONAME - _ZTI14CGetObjectInfo @ 214 NONAME - _ZTI15CRequestChecker @ 215 NONAME - _ZTI15CRequestUnknown @ 216 NONAME - _ZTI15TMTPTypeFlatBuf @ 217 NONAME - _ZTI17CGetPartialObject @ 218 NONAME - _ZTI17CRequestProcessor @ 219 NONAME - _ZTI18CGetObjectPropDesc @ 220 NONAME - _ZTI18CGetObjectPropList @ 221 NONAME - _ZTI18CHXMetaDataUtility @ 222 NONAME - _ZTI18CSetObjectPropList @ 223 NONAME - _ZTI19CDescriptionUtility @ 224 NONAME - _ZTI19CGetObjectPropValue @ 225 NONAME - _ZTI19CSetObjectPropValue @ 226 NONAME - _ZTI20CGetObjectReferences @ 227 NONAME - _ZTI20CSetObjectReferences @ 228 NONAME - _ZTI22CGetFormatCapabilities @ 229 NONAME - _ZTI23CMmMtpDpAccessSingleton @ 230 NONAME - _ZTI23CPropertySettingUtility @ 231 NONAME - _ZTI24CGetObjectPropsSupported @ 232 NONAME - _ZTI25CMmMtpDpMetadataMpxAccess @ 233 NONAME - _ZTI26CGetInterdependentPropDesc @ 234 NONAME - _ZTI27CMmMtpDpMetadataVideoAccess @ 235 NONAME - _ZTI29CMmMtpDpMetadataAccessWrapper @ 236 NONAME - _ZTV10CGetObject @ 237 NONAME - _ZTV11CCopyObject @ 238 NONAME - _ZTV11CMoveObject @ 239 NONAME - _ZTV11CSendObject @ 240 NONAME - _ZTV13CDeleteObject @ 241 NONAME - _ZTV13CRenameObject @ 242 NONAME - _ZTV14CGetObjectInfo @ 243 NONAME - _ZTV15CRequestChecker @ 244 NONAME - _ZTV15CRequestUnknown @ 245 NONAME - _ZTV15TMTPTypeFlatBuf @ 246 NONAME - _ZTV17CGetPartialObject @ 247 NONAME - _ZTV17CRequestProcessor @ 248 NONAME - _ZTV18CGetObjectPropDesc @ 249 NONAME - _ZTV18CGetObjectPropList @ 250 NONAME - _ZTV18CHXMetaDataUtility @ 251 NONAME - _ZTV18CSetObjectPropList @ 252 NONAME - _ZTV19CDescriptionUtility @ 253 NONAME - _ZTV19CGetObjectPropValue @ 254 NONAME - _ZTV19CSetObjectPropValue @ 255 NONAME - _ZTV20CGetObjectReferences @ 256 NONAME - _ZTV20CSetObjectReferences @ 257 NONAME - _ZTV22CGetFormatCapabilities @ 258 NONAME - _ZTV23CMmMtpDpAccessSingleton @ 259 NONAME - _ZTV23CPropertySettingUtility @ 260 NONAME - _ZTV24CGetObjectPropsSupported @ 261 NONAME - _ZTV25CMmMtpDpMetadataMpxAccess @ 262 NONAME - _ZTV26CGetInterdependentPropDesc @ 263 NONAME - _ZTV27CMmMtpDpMetadataVideoAccess @ 264 NONAME - _ZTV29CMmMtpDpMetadataAccessWrapper @ 265 NONAME - _ZThn28_N11CSendObject13UsbDisconnectEv @ 266 NONAME - _ZThn28_N17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 267 NONAME - _ZThn28_N17CRequestProcessor13UsbDisconnectEv @ 268 NONAME - _ZThn28_N17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 269 NONAME - _ZThn28_N17CRequestProcessor7ReleaseEv @ 270 NONAME - _ZThn28_N17CRequestProcessor9SessionIdEv @ 271 NONAME - _ZThn28_NK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 272 NONAME - _ZThn28_NK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 273 NONAME - _ZThn28_NK17CRequestProcessor10ConnectionEv @ 274 NONAME - _ZThn28_NK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 275 NONAME - _ZThn28_NK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 276 NONAME - _ZThn28_NK17CRequestProcessor7RequestEv @ 277 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper19GetModifiedContentLERK7TDesC16RiR12CDesC16Array @ 191 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper20GetAllAbstractMediaLERK7TDesC16PP14CMPXMediaArray19TMPXGeneralCategory @ 192 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper21GetAbstractMediaNameLEP9CMPXMedia19TMPXGeneralCategory @ 193 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper22UpdateMusicCollectionLEv @ 194 NONAME + _ZN29CMmMtpDpMetadataAccessWrapper23GetObjectMetadataValueLEtR8MMTPTypeRK18CMTPObjectMetaData @ 195 NONAME + _ZNK11CSendObject12HasDataphaseEv @ 196 NONAME + _ZNK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 197 NONAME + _ZNK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 198 NONAME + _ZNK17CRequestProcessor10ConnectionEv @ 199 NONAME + _ZNK17CRequestProcessor12HasDataphaseEv @ 200 NONAME + _ZNK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 201 NONAME + _ZNK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 202 NONAME + _ZNK17CRequestProcessor7RequestEv @ 203 NONAME + _ZNK18CSetObjectPropList12HasDataphaseEv @ 204 NONAME + _ZNK19CSetObjectPropValue12HasDataphaseEv @ 205 NONAME + _ZNK20CSetObjectReferences12HasDataphaseEv @ 206 NONAME + _ZTI10CGetObject @ 207 NONAME + _ZTI11CCopyObject @ 208 NONAME + _ZTI11CMoveObject @ 209 NONAME + _ZTI11CSendObject @ 210 NONAME + _ZTI13CDeleteObject @ 211 NONAME + _ZTI13CRenameObject @ 212 NONAME + _ZTI14CGetObjectInfo @ 213 NONAME + _ZTI15CRequestChecker @ 214 NONAME + _ZTI15CRequestUnknown @ 215 NONAME + _ZTI15TMTPTypeFlatBuf @ 216 NONAME + _ZTI17CGetPartialObject @ 217 NONAME + _ZTI17CRequestProcessor @ 218 NONAME + _ZTI18CGetObjectPropDesc @ 219 NONAME + _ZTI18CGetObjectPropList @ 220 NONAME + _ZTI18CHXMetaDataUtility @ 221 NONAME + _ZTI18CSetObjectPropList @ 222 NONAME + _ZTI19CDescriptionUtility @ 223 NONAME + _ZTI19CGetObjectPropValue @ 224 NONAME + _ZTI19CSetObjectPropValue @ 225 NONAME + _ZTI20CGetObjectReferences @ 226 NONAME + _ZTI20CSetObjectReferences @ 227 NONAME + _ZTI22CGetFormatCapabilities @ 228 NONAME + _ZTI23CMmMtpDpAccessSingleton @ 229 NONAME + _ZTI23CPropertySettingUtility @ 230 NONAME + _ZTI24CGetObjectPropsSupported @ 231 NONAME + _ZTI25CMmMtpDpMetadataMpxAccess @ 232 NONAME + _ZTI26CGetInterdependentPropDesc @ 233 NONAME + _ZTI27CMmMtpDpMetadataVideoAccess @ 234 NONAME + _ZTI29CMmMtpDpMetadataAccessWrapper @ 235 NONAME + _ZTV10CGetObject @ 236 NONAME + _ZTV11CCopyObject @ 237 NONAME + _ZTV11CMoveObject @ 238 NONAME + _ZTV11CSendObject @ 239 NONAME + _ZTV13CDeleteObject @ 240 NONAME + _ZTV13CRenameObject @ 241 NONAME + _ZTV14CGetObjectInfo @ 242 NONAME + _ZTV15CRequestChecker @ 243 NONAME + _ZTV15CRequestUnknown @ 244 NONAME + _ZTV15TMTPTypeFlatBuf @ 245 NONAME + _ZTV17CGetPartialObject @ 246 NONAME + _ZTV17CRequestProcessor @ 247 NONAME + _ZTV18CGetObjectPropDesc @ 248 NONAME + _ZTV18CGetObjectPropList @ 249 NONAME + _ZTV18CHXMetaDataUtility @ 250 NONAME + _ZTV18CSetObjectPropList @ 251 NONAME + _ZTV19CDescriptionUtility @ 252 NONAME + _ZTV19CGetObjectPropValue @ 253 NONAME + _ZTV19CSetObjectPropValue @ 254 NONAME + _ZTV20CGetObjectReferences @ 255 NONAME + _ZTV20CSetObjectReferences @ 256 NONAME + _ZTV22CGetFormatCapabilities @ 257 NONAME + _ZTV23CMmMtpDpAccessSingleton @ 258 NONAME + _ZTV23CPropertySettingUtility @ 259 NONAME + _ZTV24CGetObjectPropsSupported @ 260 NONAME + _ZTV25CMmMtpDpMetadataMpxAccess @ 261 NONAME + _ZTV26CGetInterdependentPropDesc @ 262 NONAME + _ZTV27CMmMtpDpMetadataVideoAccess @ 263 NONAME + _ZTV29CMmMtpDpMetadataAccessWrapper @ 264 NONAME + _ZThn28_N11CSendObject13UsbDisconnectEv @ 265 NONAME + _ZThn28_N17CRequestProcessor12HandleEventLERK13TMTPTypeEvent @ 266 NONAME + _ZThn28_N17CRequestProcessor13UsbDisconnectEv @ 267 NONAME + _ZThn28_N17CRequestProcessor14HandleRequestLERK15TMTPTypeRequest20TMTPTransactionPhase @ 268 NONAME + _ZThn28_N17CRequestProcessor7ReleaseEv @ 269 NONAME + _ZThn28_N17CRequestProcessor9SessionIdEv @ 270 NONAME + _ZThn28_NK11CSendObject5MatchERK15TMTPTypeRequestR14MMTPConnection @ 271 NONAME + _ZThn28_NK15CRequestUnknown5MatchERK15TMTPTypeRequestR14MMTPConnection @ 272 NONAME + _ZThn28_NK17CRequestProcessor10ConnectionEv @ 273 NONAME + _ZThn28_NK17CRequestProcessor5MatchERK13TMTPTypeEventR14MMTPConnection @ 274 NONAME + _ZThn28_NK17CRequestProcessor5MatchERK15TMTPTypeRequestR14MMTPConnection @ 275 NONAME + _ZThn28_NK17CRequestProcessor7RequestEv @ 276 NONAME diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/ccopyobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -21,7 +21,6 @@ #include "crequestprocessor.h" -class RFs; class CMTPObjectMetaData; class CMTPTypeObjectPropList; class CMTPTypeObjectPropListElement; @@ -34,17 +33,6 @@ { public: /** - * Two-phase construction method - * @param aFramework The data provider framework - * @param aConnection The connection from which the request comes - * @param aWrapper medadata access interface - * @return a pointer to the created request processor object - */ - //IMPORT_C static MMmRequestProcessor* NewL( MMTPDataProviderFramework& aFramework, - // MMTPConnection& aConnection, - // CMmMtpDpMetadataAccessWrapper& aWrapper ); - - /** * Destructor */ IMPORT_C virtual ~CCopyObject(); @@ -54,8 +42,8 @@ * Standard c++ constructor */ IMPORT_C CCopyObject( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection, - MMmMtpDpConfig& aDpConfig ); + MMTPConnection& aConnection, + MMmMtpDpConfig& aDpConfig ); /** * Second phase constructor @@ -79,15 +67,22 @@ */ void GetParametersL(); + /** + * Set a default destination if it is not specified + */ void SetDefaultParentObjectL(); /** - * Copy object operation + * Copy file and metadata and send response to pc + * If everything was right, the handle of newly created file + * should be sent back */ void CopyObjectL(); /** - * Check if we can copy the file to the new location + * Check if the file can be copied + * @param aOldName used to get file size + * @param aNewName the full path name of newly copied file */ TMTPResponseCode CanCopyObjectL( const TDesC& aOldName, const TDesC& aNewName ) const; @@ -95,22 +90,26 @@ /** * Save the object properties before doing the copy */ - void GetPreviousPropertiesL( const CMTPObjectMetaData& aObject ); + void GetPreviousPropertiesL(); /** * Set the object properties after doing the copy */ - void SetPreviousPropertiesL( const CMTPObjectMetaData& aObject ); + void SetPreviousPropertiesL(); /** * A helper function of CopyObjectL. * @param aNewFileName the new full filename after copy. - * @return objectHandle of new copy of object. + * @return handle of the newly copied object. */ TUint32 CopyFileL( const TDesC& aNewFileName ); /** - * Update object info in the database. + * Add metadata of the newly created file into database and + * update related references + * @param aOldObjectName old reference owner + * @param aNewObjectName new reference owner + * @return handle of the newly copied object */ TUint32 AddObjectToStoreL( const TDesC& aOldObjectName, const TDesC& aNewObjectName ); @@ -122,7 +121,8 @@ private: TUint32 iStorageId; - CMTPObjectMetaData* iObjectInfo; // Not owned + CMTPObjectMetaData* iSourceObject; + CMTPObjectMetaData* iTargetObject; HBufC* iDest; TUint32 iNewParentHandle; TTime iPreviousModifiedTime; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cdeleteobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,16 +19,11 @@ #ifndef CDELETEOBJECT_H #define CDELETEOBJECT_H -#include #include -#include #include "crequestprocessor.h" //forward declaration -class RFs; -class CMTPTypeArray; -class MMTPObjectMgr; class MMmMtpDpConfig; /** @@ -110,12 +105,6 @@ void DeleteObjectL( const CMTPObjectMetaData& aObjectInfo ); private: - // MTP Object Manager - MMTPObjectMgr& iObjectMgr; - - // File server used to open the database - RFs& iFs; - // Array of all the objects to delete RArray iObjectsToDelete; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetformatcapabilities.h Fri Apr 02 16:24:05 2010 +0100 @@ -24,7 +24,6 @@ // forward declaration class MMmMtpDpConfig; class CMTPTypeObjectPropDesc; -class CMTPTypeInterdependentPropDesc; /** Implements the file data provider CMTPGetFormatCapabilities request processor. diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -22,7 +22,6 @@ #include "crequestprocessor.h" // forward declaration -class RFs; class CMTPTypeFile; class MMmMtpDpConfig; @@ -78,9 +77,6 @@ void GetObjectL( const TDesC& aFileName ); private: - // File server used to open the database - RFs& iFs; - // File Object to encapsulate the object to send back CMTPTypeFile* iFileObject; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectinfo.h Fri Apr 02 16:24:05 2010 +0100 @@ -22,7 +22,6 @@ #include "crequestprocessor.h" // forward declacration -class CMmMtpDpMetadataAccessWrapper; class CMTPTypeObjectInfo; class MMmMtpDpConfig; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectproplist.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectproplist.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectproplist.h Fri Apr 02 16:24:05 2010 +0100 @@ -161,8 +161,6 @@ void GetPropertiesL( RArray& aPropArray, TUint32 aGroupCode, TUint16 aFormatCode ) const; - void SetSubFormatCodeL(); - protected: CMTPTypeObjectPropListElement* iPropertyElement; // used by media DP directly diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetobjectpropvalue.h Fri Apr 02 16:24:05 2010 +0100 @@ -29,7 +29,6 @@ class TMTPTypeUint128; class CMTPTypeString; class CMTPTypeArray; -class TMTPObjectInfo; class MMmMtpDpConfig; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cgetpartialobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -21,7 +21,6 @@ #include "crequestprocessor.h" -class MMTPDataProviderFramework; class CMTPTypeFile; class CMmMtpDpMetadataAccessWrapper; class MMmMtpDpConfig; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cmoveobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -22,7 +22,6 @@ #include "crequestprocessor.h" class CMTPObjectMetaData; -class CMmMtpDpMetadataAccessWrapper; class CMTPTypeObjectPropList; class CMTPTypeObjectPropListElement; class MMmMtpDpConfig; @@ -112,8 +111,7 @@ /** * Set the object properties in the object property store. */ - void SetPropertiesL( const TDesC& aOldFileName, - const TDesC& aNewFileName ); + void SetPropertiesL( const TDesC& aNewFileName ); /* * Move a single object and update the database diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cpropertysettingutility.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cpropertysettingutility.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/cpropertysettingutility.h Fri Apr 02 16:24:05 2010 +0100 @@ -44,7 +44,7 @@ * inserted or updated into database * @return response code */ - IMPORT_C TMTPResponseCode SetMetaDataToWrapperL( MMmMtpDpConfig& aDpConfig, + IMPORT_C TMTPResponseCode SetMetaDataToWrapper( MMmMtpDpConfig& aDpConfig, const TUint16 aPropCode, MMTPType& aNewData, const CMTPObjectMetaData& aObjectMetaData ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crenameobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -22,7 +22,6 @@ // Forward declarations class MMTPDataProviderFramework; class CMmMtpDpMetadataAccessWrapper; -class MMTPObjectMgr; class CMTPObjectMetaData; class CRenameObject: public CActive diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestchecker.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,11 +19,9 @@ #ifndef CREQUESTCHECKER_H #define CREQUESTCHECKER_H -#include -#include #include +#include -class CMTPObjectMetaData; class MMTPDataProviderFramework; class MMTPConnection; @@ -121,7 +119,7 @@ * @return a pointer to the created request checker object */ static CRequestChecker* NewL( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection ); + MMTPConnection& aConnection ); /** * Destructor diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/crequestprocessor.h Fri Apr 02 16:24:05 2010 +0100 @@ -19,22 +19,24 @@ #ifndef CREQUESTPROCESSOR_H #define CREQUESTPROCESSOR_H -#include + +#include #include #include #include -#include + +// for derived processors +#include #include "crequestchecker.h" class MMTPConnection; class TMTPTypeRequest; -class CMTPDataProviderPlugin; class MMTPDataProviderFramework; class TMTPTypeEvent; class CMTPObjectInfo; -static const TInt KMmMtpRArrayGranularity = 2; +const TInt KMmMtpRArrayGranularity = 2; /** * Defines a request processor interface @@ -111,9 +113,8 @@ /** * Defines a processor factory function pointer */ -typedef MMmRequestProcessor - * (*TMTPRequestProcessorCreateFunc)( MMTPDataProviderFramework& aFramework, - MMTPConnection& aConnection ); +typedef MMmRequestProcessor* (*TMTPRequestProcessorCreateFunc)( MMTPDataProviderFramework& aFramework, + MMTPConnection& aConnection ); /** * Defines an entry which maps from operation code to the request processor @@ -243,6 +244,7 @@ * @return session id */ IMPORT_C TUint32 SessionId(); + protected: // from CActive /** @@ -261,7 +263,7 @@ IMPORT_C TInt RunError( TInt aError ); protected: - //new virtuals + // new virtuals /** * Handle the request phase of the current request * @return EFalse diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csendobject.h Fri Apr 02 16:24:05 2010 +0100 @@ -173,7 +173,7 @@ /* * Handle response phase of SetObjectPropListL operation */ - TMTPResponseCode SetObjectPropListL( const CMTPTypeObjectPropList& aPropList ); + TMTPResponseCode SetObjectPropListL(); /** * @@ -213,7 +213,7 @@ /** * Set protection status of object which could be read/write-only */ - void SetProtectionStatusL(); + void SetProtectionStatus(); /** * Save object information of object whose size is zero diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/inc/csetobjectreferences.h Fri Apr 02 16:24:05 2010 +0100 @@ -64,16 +64,9 @@ protected: /** * set references to DB - * @param aWrapper medadata access interface - * @param aObjectFormat the format of the file - * @param aSrcFileName file name, from - * @param aRefFileArray the array of file names, to + * @param aObject, the reference owner */ - IMPORT_C virtual void - DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper, - TUint16 aObjectFormat, - const TDesC& aSrcFileName, - CDesCArray& aRefFileArray ); + void DoSetObjectReferencesL( const CMTPObjectMetaData& aObject ); private: //from CRequestProcessor diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/ccopyobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,11 +17,9 @@ #include -#include #include #include #include -#include #include #include #include @@ -74,6 +72,7 @@ { Cancel(); + delete iTargetObject; delete iDest; if ( iPropertyElement ) @@ -93,7 +92,9 @@ aConnection, sizeof( KMTPCopyObjectPolicy ) / sizeof( TMTPRequestElementInfo ), KMTPCopyObjectPolicy ), - iDpConfig( aDpConfig ) + iDpConfig( aDpConfig ), + iSourceObject( NULL ), + iTargetObject( NULL ) { PRINT( _L( "Operation: CopyObject(0x101A)" ) ); } @@ -144,28 +145,31 @@ newObjectName.CleanupClosePushL(); // + newObjectName newObjectName = *iDest; - const TDesC& suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); + const TDesC& suid( iSourceObject->DesC( CMTPObjectMetaData::ESuid ) ); TParsePtrC fileNameParser( suid ); if ( ( newObjectName.Length() + fileNameParser.NameAndExt().Length() ) <= newObjectName.MaxLength() ) { newObjectName.Append( fileNameParser.NameAndExt() ); - } - responseCode = CanCopyObjectL( suid, newObjectName ); + responseCode = CanCopyObjectL( suid, newObjectName ); - TUint32 newHandle = KMTPHandleNone; - if ( responseCode == EMTPRespCodeOK ) - { - newHandle = CopyFileL( newObjectName ); - SendResponseL( EMTPRespCodeOK, 1, &newHandle ); + TUint32 newHandle = KMTPHandleNone; + if ( responseCode == EMTPRespCodeOK ) + { + newHandle = CopyFileL( newObjectName ); + SendResponseL( EMTPRespCodeOK, 1, &newHandle ); + PRINT2( _L( "MM MTP <= CCopyObject::CopyObjectL responseCode = 0x%x, aNewHandle = 0x%x" ), + responseCode, + newHandle ); + } + else + SendResponseL( responseCode ); } else - SendResponseL( responseCode ); + // Destination is not appropriate for the full path name shouldn't be longer than 255 + SendResponseL( EMTPRespCodeInvalidDataset ); CleanupStack::PopAndDestroy( &newObjectName ); // - newObjectName - PRINT2( _L( "MM MTP <= CCopyObject::CopyObjectL responseCode = 0x%x, aNewHandle = 0x%x" ), - responseCode, - newHandle ); } // ----------------------------------------------------------------------------- @@ -188,8 +192,8 @@ iNewParentHandle ); // not taking owernship - iObjectInfo = iRequestChecker->GetObjectInfo( objectHandle ); - __ASSERT_DEBUG( iObjectInfo, Panic( EMmMTPDpObjectNull ) ); + iSourceObject = iRequestChecker->GetObjectInfo( objectHandle ); + __ASSERT_DEBUG( iSourceObject, Panic( EMmMTPDpObjectNull ) ); if ( iNewParentHandle == KMTPHandleNone ) { @@ -210,7 +214,7 @@ // ----------------------------------------------------------------------------- // CCopyObject::SetDefaultParentObjectL -// Get a default parent object, ff the request does not specify a parent object, +// Set a default destination, if the request does not specify a parent object, // ----------------------------------------------------------------------------- // void CCopyObject::SetDefaultParentObjectL() @@ -277,7 +281,7 @@ #endif } // This is used to keep the same behavior in mass storage and device file manager. - else if ( iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode ) + else if ( iSourceObject->Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeAbstractAudioVideoPlaylist ) { PRINT( _L( "MM MTP <> CCopyObject::CanCopyObjectL playlist file can't copy" ) ); @@ -295,27 +299,25 @@ // TUint32 CCopyObject::CopyFileL( const TDesC& aNewFileName ) { - const TDesC& suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); - PRINT2( _L( "MM MTP => CCopyObject::CopyFileL old name = %S, aNewFileName = %S" ), - &suid, - &aNewFileName ); + PRINT( _L( "MM MTP => CCopyObject::CopyFileL" ) ); + + GetPreviousPropertiesL(); - GetPreviousPropertiesL( *iObjectInfo ); + // TODO: Need rollback mechanism for consistant with image dp in fw. + // Not sure if it should be trap if something wrong with MPX db. + TPtrC oldFileName( iSourceObject->DesC( CMTPObjectMetaData::ESuid ) ); + TUint32 handle = AddObjectToStoreL( oldFileName, aNewFileName ); - TUint32 handle = AddObjectToStoreL( suid, aNewFileName ); - - SetPreviousPropertiesL( *iObjectInfo ); + // Only leave when getting proplist element from data received by fw. + // It should not happen after ReceiveDataL in which construction of proplist already succeed. + SetPreviousPropertiesL(); CFileMan* fileMan = CFileMan::NewL( iFramework.Fs() ); - User::LeaveIfError( fileMan->Copy( suid, aNewFileName ) ); + User::LeaveIfError( fileMan->Copy( oldFileName, aNewFileName ) ); delete fileMan; fileMan = NULL; - User::LeaveIfError( iFramework.Fs().SetModified( aNewFileName, - iPreviousModifiedTime ) ); - - PRINT1( _L( "MM MTP <= CCopyObject::CopyFileL handle = 0x%x" ), handle ); - + PRINT( _L( "MM MTP <= CCopyObject::CopyFileL" ) ); return handle; } @@ -324,20 +326,17 @@ // Save the object properties before doing the copy // ----------------------------------------------------------------------------- // -void CCopyObject::GetPreviousPropertiesL( const CMTPObjectMetaData& aObject ) +void CCopyObject::GetPreviousPropertiesL() { PRINT( _L( "MM MTP => CCopyObject::GetPreviousPropertiesL" ) ); - const TDesC& suid( aObject.DesC( CMTPObjectMetaData::ESuid ) ); - User::LeaveIfError( iFramework.Fs().Modified( suid, iPreviousModifiedTime ) ); - - TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode ); + TUint formatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatCode ); const RArray* properties = iDpConfig.GetSupportedPropertiesL( formatCode ); TInt count = properties->Count(); TInt err = KErrNone; TUint16 propCode; - TUint32 handle = aObject.Uint( CMTPObjectMetaData::EHandle ); + TUint32 handle = iSourceObject->Uint( CMTPObjectMetaData::EHandle ); if ( iPropertyElement != NULL ) { @@ -365,45 +364,39 @@ case EMTPObjectPropCodeNonConsumable: iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) ); iPropertyElement->SetUint8L( CMTPTypeObjectPropListElement::EValue, - aObject.Uint( CMTPObjectMetaData::ENonConsumable ) ); + iSourceObject->Uint( CMTPObjectMetaData::ENonConsumable ) ); break; case EMTPObjectPropCodeName: case EMTPObjectPropCodeDateAdded: - if ( ( propCode == EMTPObjectPropCodeName ) - || ( !MmMtpDpUtility::IsVideoL( aObject.DesC( CMTPObjectMetaData::ESuid ), iFramework ) - && ( propCode == EMTPObjectPropCodeDateAdded ) ) ) - { - CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData + case EMTPObjectPropCodeAlbumArtist: + { + CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData - TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode, - *textData, - aObject ) ); + TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode, + *textData, + *iSourceObject ) ); - PRINT1( _L( "MM MTP <> CCopyObject::GetPreviousPropertiesL err = %d" ), err ); + PRINT1( _L( "MM MTP <> CCopyObject::GetPreviousPropertiesL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) ); - iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, - textData->StringChars() ); - } - else if ( err == KErrNotFound ) - { - iPropertyElement = NULL; - } - else - { - User::Leave( err ); - } + if ( err == KErrNone ) + { + iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) ); + iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, + textData->StringChars() ); + } + else + { + iPropertyElement = NULL; + } - CleanupStack::PopAndDestroy( textData ); // - textData - } + CleanupStack::PopAndDestroy( textData ); // - textData + } break; default: { - ServiceGetSpecificObjectPropertyL( propCode, handle, aObject ); + ServiceGetSpecificObjectPropertyL( propCode, handle, *iSourceObject ); } break; } @@ -423,7 +416,7 @@ // Set the object properties after doing the copy // ----------------------------------------------------------------------------- // -void CCopyObject::SetPreviousPropertiesL( const CMTPObjectMetaData& aObject ) +void CCopyObject::SetPreviousPropertiesL() { PRINT( _L( "MM MTP => CCopyObject::SetPreviousPropertiesL" ) ); @@ -458,22 +451,23 @@ break; case EMTPObjectPropCodeNonConsumable: - iObjectInfo->SetUint( CMTPObjectMetaData::ENonConsumable, + iTargetObject->SetUint( CMTPObjectMetaData::ENonConsumable, element.Uint8L( CMTPTypeObjectPropListElement::EValue ) ); // TODO: need to reconsider, // should wait all property setting finished then insert object, or not? // need to investigate if it will affect performance result - iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo ); + iFramework.ObjectMgr().ModifyObjectL( *iTargetObject ); break; case EMTPObjectPropCodeName: + case EMTPObjectPropCodeAlbumArtist: { CMTPTypeString *stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) ); // + stringData - respcode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapperL( iDpConfig, + respcode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, propertyCode, *stringData, - aObject ); + *iTargetObject ); CleanupStack::PopAndDestroy( stringData ); // - stringData } @@ -483,7 +477,7 @@ { respcode = iDpConfig.PropSettingUtility()->SetSpecificObjectPropertyL( iDpConfig, propertyCode, - aObject, + *iTargetObject, element ); } break; @@ -491,6 +485,10 @@ } // end of for loop // ignore errors + if ( respcode == EMTPRespCodeOK ) + { + // do nothing, just to get rid of build warning + } PRINT1( _L( "MM MTP <= CCopyObject::SetPreviousPropertiesL respcode = 0x%x" ), respcode ); } @@ -507,21 +505,21 @@ &aOldObjectName, &aNewObjectName ); - CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo + iTargetObject = CMTPObjectMetaData::NewL(); // 1. Add new object into objectMgr db - objectInfo->SetUint( CMTPObjectMetaData::EDataProviderId, iObjectInfo->Uint( CMTPObjectMetaData::EDataProviderId ) ); - TUint formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode ); - objectInfo->SetUint( CMTPObjectMetaData::EFormatCode, formatCode ); - TUint subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode ); - objectInfo->SetUint( CMTPObjectMetaData::EFormatSubCode, subFormatCode ); - objectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle ); - objectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId ); - objectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewObjectName ); - iFramework.ObjectMgr().InsertObjectL( *objectInfo ); + iTargetObject->SetUint( CMTPObjectMetaData::EDataProviderId, iSourceObject->Uint( CMTPObjectMetaData::EDataProviderId ) ); + TUint formatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatCode ); + iTargetObject->SetUint( CMTPObjectMetaData::EFormatCode, formatCode ); + TUint subFormatCode = iSourceObject->Uint( CMTPObjectMetaData::EFormatSubCode ); + iTargetObject->SetUint( CMTPObjectMetaData::EFormatSubCode, subFormatCode ); + iTargetObject->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle ); + iTargetObject->SetUint( CMTPObjectMetaData::EStorageId, iStorageId ); + iTargetObject->SetDesCL( CMTPObjectMetaData::ESuid, aNewObjectName ); + iFramework.ObjectMgr().InsertObjectL( *iTargetObject ); // 2. Add new object into MPX db - iDpConfig.GetWrapperL().AddObjectL( aNewObjectName, formatCode, subFormatCode ); + iDpConfig.GetWrapperL().AddObjectL( *iTargetObject ); // 3. Set references into references db if ( formatCode == EMTPFormatCodeM3UPlaylist ) @@ -532,8 +530,7 @@ CleanupStack::PopAndDestroy( references ); // - references } - TUint32 handle = objectInfo->Uint( CMTPObjectMetaData::EHandle ); - CleanupStack::PopAndDestroy( objectInfo ); // - objectInfo + TUint32 handle = iTargetObject->Uint( CMTPObjectMetaData::EHandle ); PRINT1( _L( "MM MTP <= CCopyObject::AddObjectToStoreL handle = 0x%x" ), handle ); return handle; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdeleteobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,10 +16,8 @@ */ -#include #include #include -#include #include "cdeleteobject.h" #include "mmmtpdplogger.h" @@ -27,7 +25,8 @@ #include "cmmmtpdpmetadataaccesswrapper.h" #include "mmmtpdputility.h" -// static const TInt KMTPDriveGranularity = 5; +const TInt KMaxDeletionTimes = 10; +const TInt KDeletionThreshold = 100 * 1000; // (100 millisec) // ----------------------------------------------------------------------------- // Verification data for the DeleteObject request @@ -91,8 +90,6 @@ aConnection, sizeof( KMTPDeleteObjectPolicy ) / sizeof( TMTPRequestElementInfo ), KMTPDeleteObjectPolicy ), - iObjectMgr( aFramework.ObjectMgr() ), - iFs( aFramework.Fs() ), iObjectsToDelete( KMmMtpRArrayGranularity ), iDeleteError( KErrNone ), iDpConfig( aDpConfig ) @@ -193,7 +190,7 @@ CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo TUint32 handle = iObjectsToDelete[0]; - iObjectMgr.ObjectL( handle, *objectInfo ); + iFramework.ObjectMgr().ObjectL( handle, *objectInfo ); TFileName fileName( objectInfo->DesC( CMTPObjectMetaData::ESuid ) ); PRINT2( _L( "MM MTP <> CDeleteObject::RunL delete object handle is 0x%x, fileName is %S" ), handle, &fileName ); @@ -227,14 +224,13 @@ TFileName fileName( aObjectInfo.DesC( CMTPObjectMetaData::ESuid ) ); PRINT1( _L( "MM MTP <> CDeleteObject::DeleteObjectL fileName = %S" ), &fileName ); - TParsePtrC parse( fileName ); - iDpConfig.GetWrapperL().SetStorageRootL( parse.Drive() ); + iDpConfig.GetWrapperL().SetStorageRootL( fileName ); // To capture special situation: After copy, move, rename playlist folder name, // record in MPX is not inlined with framework db, playlist should not be deleted // until next session. // This is used to keep the same behavior in mass storage and device file manager. - if ( aObjectInfo.Uint(CMTPObjectMetaData::EFormatCode ) + if ( aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeAbstractAudioVideoPlaylist && !iDpConfig.GetWrapperL().IsExistL( fileName ) ) { @@ -245,26 +241,41 @@ // 1. Delete object from file system TEntry fileInfo; - iFs.Entry( fileName, fileInfo ); + iFramework.Fs().Entry( fileName, fileInfo ); if ( fileInfo.IsReadOnly() ) { iDeleteError = KErrAccessDenied; PRINT1( _L( "MM MTP <= CDeleteObject::DeleteObjectL, \"%S\" is a read-only file"), &fileName ); return; } - iDeleteError = iFs.Delete( fileName ); - if ( iDeleteError != KErrNone && iDeleteError != KErrNotFound ) + // Some other component might be holding on to the file (MDS background harvesting), + // try again after 100 millisec, up to 10 times, before give up + TInt count = KMaxDeletionTimes; + while ( count > 0 ) { - PRINT1( _L( "MM MTP <= CDeleteObject::DeleteObjectL, Delete from file system failed, err = %d" ), iDeleteError ); - return; + iDeleteError = iFramework.Fs().Delete( fileName ); + if ( iDeleteError == KErrNone || iDeleteError == KErrNotFound ) + { + break; + } + else if ( ( iDeleteError == KErrInUse ) && ( count > 1 ) ) + { + User::After( KDeletionThreshold ); + count--; + } + else + { + PRINT1( _L( "MM MTP <= CDeleteObject::DeleteObjectL, Delete from file system failed, err = %d" ), iDeleteError ); + return; + } } // 2. Delete object from metadata db - TRAP( iDeleteError, iDpConfig.GetWrapperL().DeleteObjectL( fileName, aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode ) )); + TRAP( iDeleteError, iDpConfig.GetWrapperL().DeleteObjectL( aObjectInfo ) ); PRINT1( _L( "MM MTP <> CDeleteObject::DeleteObjectL, Delete from Media DB, err = %d" ), iDeleteError ); // 3. Delete object from framework db - iObjectMgr.RemoveObjectL( aObjectInfo.Uint( CMTPObjectMetaData::EHandle ) ); + iFramework.ObjectMgr().RemoveObjectL( aObjectInfo.Uint( CMTPObjectMetaData::EHandle ) ); // 4. If the object has references, Delete references from reference manager if ( MmMtpDpUtility::HasReference( aObjectInfo.Uint( CMTPObjectMetaData::EFormatCode ) ) ) @@ -348,7 +359,7 @@ else { CMTPObjectMetaData* objectInfo = CMTPObjectMetaData::NewLC(); // + objectInfo - iObjectMgr.ObjectL( handles[i], *objectInfo ); + iFramework.ObjectMgr().ObjectL( handles[i], *objectInfo ); if ( EMTPFormatCodeAssociation == objectInfo->Uint( CMTPObjectMetaData::EFormatCode ) ) { GetObjectHandlesL( KMTPStorageAll, handles[i] ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cdescriptionutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -52,6 +52,7 @@ case EMTPObjectPropCodePersistentUniqueObjectIdentifier: case EMTPObjectPropCodeName: case EMTPObjectPropCodeDateAdded: + case EMTPObjectPropCodeAlbumArtist: propertyDesc = CMTPTypeObjectPropDesc::NewL( aPropCode ); break; diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,8 +16,6 @@ */ -#include -#include #include #include "cgetobject.h" @@ -88,7 +86,6 @@ aConnection, sizeof( KMTPGetObjectPolicy ) / sizeof( TMTPRequestElementInfo ), KMTPGetObjectPolicy ), - iFs( iFramework.Fs() ), iError( EMTPRespCodeOK ) { PRINT( _L( "Operation: GetObject(0x1009)" ) ); @@ -141,7 +138,7 @@ // Create the file object delete iFileObject; iFileObject = NULL; - iFileObject = CMTPTypeFile::NewL( iFs, aFileName, EFileRead ); + iFileObject = CMTPTypeFile::NewL( iFramework.Fs(), aFileName, EFileRead ); PRINT( _L( "MM MTP <= CGetObject::GetObjectL" ) ); } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectinfo.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include @@ -26,9 +25,8 @@ #include "tmmmtpdppanic.h" #include "mmmtpdplogger.h" #include "mmmtpdpconfig.h" +#include "tobjectdescription.h" -_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); -const TInt KMtpMaxDateTimeStringLength = 15; // ----------------------------------------------------------------------------- // Verification data for GetObjectInfo request @@ -164,7 +162,7 @@ TUint32 width(0); TUint32 height(0); TInt err = KErrNone; - TRAP( err, iDpConfig.GetWrapperL().GetImageObjPropL( suid, width, height ) ); + TRAP( err, iDpConfig.GetWrapperL().GetImageObjPropL( *object, width, height ) ); if( err != KErrNone ) PRINT1( _L( "MM MTP <> CGetObjectInfo::BuildObjectInfoL TRAP iWrapper.GetImageObjPropL err = %d" ), err ); @@ -188,11 +186,9 @@ TParsePtrC parse( suid ); iObjectInfo->SetStringL( CMTPTypeObjectInfo::EFilename, parse.NameAndExt() ); - TTime dataModified; - dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), suid ); + TBuf date; + MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), suid, date ); - TBuf date; - dataModified.FormatL( date, KMtpDateTimeFormat ); PRINT1( _L( "MM MTP <> CGetObjectInfo::BuildObjectInfo date is %S" ), &date ); // Date Created diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectproplist.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,12 +18,11 @@ #include #include -#include + #include #include #include #include -#include #include "tobjectdescription.h" #include "cgetobjectproplist.h" @@ -34,12 +33,7 @@ #include "cmmmtpdpmetadataaccesswrapper.h" static const TUint32 KMTPAll = 0xffffffff; -_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); -const TInt KMtpMaxDateTimeStringLength = 15; -#if defined(_DEBUG) || defined(MMMTPDP_PERFLOG) -_LIT( KSubFormatParse, "SubFormatParse" ); -#endif // Verification data for the getObjectPropList request const TMTPRequestElementInfo KMTPGetObjectPropListPolicy[] = @@ -178,8 +172,6 @@ if ( iFramework.ObjectMgr().ObjectL( handle, *iObject ) ) // Populate the object meta data { - SetSubFormatCodeL(); - err = ServiceOneObjectPropertyL( handle, iPropCode ); if ( err != KErrNone && err != KErrNotSupported ) break; @@ -268,7 +260,7 @@ TInt i = 0; for ( ; i < count; i++ ) { - if ( groupCode == KSupportedGroupCode[i ] ) + if ( groupCode == KSupportedGroupCode[i] ) break; } if ( i == count ) @@ -363,8 +355,7 @@ { CMTPObjectMetaData* meta( iRequestChecker->GetObjectInfo( iHandle ) ); TPtrC suid( meta->DesC( CMTPObjectMetaData::ESuid ) ); - TParsePtrC parse( suid ); - iDpConfig.GetWrapperL().SetStorageRootL( parse.Drive() ); + iDpConfig.GetWrapperL().SetStorageRootL( suid ); __ASSERT_DEBUG( meta, Panic( EMmMTPDpObjectNull ) ); @@ -389,7 +380,7 @@ // void CGetObjectPropList::GetObjectHandlesL( TUint32 aStorageId, TUint32 aParentHandle, - TUint16 aFormat /*= 0x0000*/) + TUint16 aFormat /*= 0x0000*/ ) { PRINT2( _L( "MM MTP => CGetObjectPropList::GetObjectHandlesL, aStorageId = 0x%x, aParentHandle = 0x%x" ), aStorageId, @@ -560,23 +551,15 @@ const TInt count = iPropertyArray.Count(); TInt err = KErrNone; - TBool successQuery = EFalse; for ( TInt i = 0; i < count; i++ ) { err = ServiceOneObjectPropertyL( aHandle, iPropertyArray[i] ); - if ( err == KErrNone ) - successQuery = ETrue; if ( err == KErrNotSupported || err == KErrNotFound ) // Skip err = KErrNone; if ( err != KErrNone ) break; } - // In PC Suite combined mode, a file that was found at the beginning could be deleted by PC Suite protocol - // Need to fail it here. - if ( successQuery == EFalse ) - err = KErrNotFound; - PRINT1( _L( "MM MTP <= CGetObjectPropList::ServiceGroupPropertiesL err = %d" ), err ); return err; @@ -678,47 +661,35 @@ case EMTPObjectPropCodeName: case EMTPObjectPropCodeDateAdded: + case EMTPObjectPropCodeAlbumArtist: { - if ( ( aPropCode == EMTPObjectPropCodeName ) - || ( ( !MmMtpDpUtility::IsVideoL( iObject->DesC( CMTPObjectMetaData::ESuid ), iFramework ) ) - && ( aPropCode == EMTPObjectPropCodeDateAdded ) ) ) - { - textData = CMTPTypeString::NewLC(); // + textData + textData = CMTPTypeString::NewLC(); // + textData - TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( aPropCode, - *textData, - *iObject ) ); - - PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL err = %d" ), err ); + TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( aPropCode, + *textData, + *iObject ) ); - if ( err == KErrNone ) - { - iPropertyElement = &(iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); - iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars() ); - } + PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL err = %d" ), err ); - CleanupStack::PopAndDestroy( textData ); // - textData - break; - } - // Else, video DB does not support DateAdded field, use the file system date! - // It's the same behavior with DateCreated and DateModified. - // Fall through intentional. + iPropertyElement = &( iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); + iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, textData->StringChars() ); + + CleanupStack::PopAndDestroy( textData ); // - textData } + break; case EMTPObjectPropCodeDateCreated: case EMTPObjectPropCodeDateModified: { - TTime dataModified; - dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), - iObject->DesC( CMTPObjectMetaData::ESuid ) ); + TBuf timeStr; + MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), + iObject->DesC( CMTPObjectMetaData::ESuid ), + timeStr ); + PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr ); - TBuf timeStr; - dataModified.FormatL( timeStr, KMtpDateTimeFormat ); - PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr ); CMTPTypeString* datastring = CMTPTypeString::NewLC( timeStr ); // + datastring - - iPropertyElement = &(iPropertyList->ReservePropElemL(aHandle, aPropCode)); - iPropertyElement->SetStringL(CMTPTypeObjectPropListElement::EValue, datastring->StringChars()); + iPropertyElement = &(iPropertyList->ReservePropElemL( aHandle, aPropCode ) ); + iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, datastring->StringChars() ); CleanupStack::PopAndDestroy( datastring ); // - datastring } break; @@ -773,8 +744,6 @@ if ( iFramework.ObjectMgr().ObjectL( handle, *iObject ) ) // Populate the object meta data { - SetSubFormatCodeL(); - if ( iPropCode == KMTPAll ) err = ServiceAllPropertiesL( handle ); else if ( iPropCode == EMTPObjectPropCodeUndefined ) @@ -815,8 +784,10 @@ // EXPORT_C TInt CGetObjectPropList::RunError( TInt aError ) { - PRINT1( _L( "MM MTP <> CGetObjectPropList::RunError aError = %d" ), aError ); - TRAP_IGNORE( SendResponseL( EMTPRespCodeGeneralError ) ); + if ( aError != KErrNone ) + PRINT1( _L( "MM MTP <> CGetObjectPropList::RunError aError = %d" ), aError ); + + TRAP_IGNORE( SendResponseL( EMTPRespCodeGeneralError ) ); return KErrNone; } @@ -847,7 +818,7 @@ { for ( TInt j = 0; j < count; j++ ) { - if( KPropGroupMapTable[j].iPropCode == (*properties)[i] + if( KPropGroupMapTable[j].iPropCode == ( *properties )[i] && KPropGroupMapTable[j].iGroupCode == aGroupCode ) { aPropArray.Append( (*properties)[i] ); @@ -857,35 +828,4 @@ } } -void CGetObjectPropList::SetSubFormatCodeL() - { - __ASSERT_DEBUG( iObject, Panic( EMmMTPDpObjectNull ) ); - - // Note: Parsing out subformat code in external enumeration phase. - // This process was delayed in internal phase to avoid time-out. - TUint16 formatCode = iObject->Uint( CMTPObjectMetaData::EFormatCode ); - TUint subFormatCode = iObject->Uint( CMTPObjectMetaData::EFormatSubCode ); - PRINT2( _L( "MM MTP <> CGetObjectPropList::SetSubFormatCode, formatCode = 0x%x, subFormatCode = 0x%x" ), - formatCode, - subFormatCode ); - - TBool ifNeedParse = ( ( formatCode == EMTPFormatCodeMP4Container ) - || ( formatCode == EMTPFormatCode3GPContainer ) - || ( formatCode== EMTPFormatCodeASF ) ) - && ( subFormatCode == EMTPSubFormatCodeUnknown ); - if ( ifNeedParse ) - { - PERFLOGSTART( KSubFormatParse ); - - if ( MmMtpDpUtility::IsVideoL( iObject->DesC( CMTPObjectMetaData::ESuid ) ) ) - subFormatCode = EMTPSubFormatCodeVideo; - else - subFormatCode = EMTPSubFormatCodeAudio; - - PERFLOGSTOP( KSubFormatParse ); - - iObject->SetUint( CMTPObjectMetaData::EFormatSubCode, subFormatCode ); - } - } - // end of file diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,9 +18,7 @@ #include #include -#include #include -#include #include #include "cgetobjectpropvalue.h" @@ -28,9 +26,8 @@ #include "cmmmtpdpmetadataaccesswrapper.h" #include "mmmtpdplogger.h" #include "mmmtpdpconfig.h" +#include "tobjectdescription.h" -_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); -const TInt KMtpMaxDateTimeStringLength = 15; // ----------------------------------------------------------------------------- // Verification data for the GetObjectPropValue request @@ -138,7 +135,7 @@ TUint32 objectHandle = Request().Uint32( TMTPTypeRequest::ERequestParameter1 ); TUint32 propCode = Request().Uint32( TMTPTypeRequest::ERequestParameter2 ); PRINT2( _L( "MM MTP <> CGetObjectPropValue::ServiceL objectHandle = 0x%x, propCode = 0x%x" ), - objectHandle, propCode ); + objectHandle, propCode ); // don't have the ownship of the object iObjectInfo = iRequestChecker->GetObjectInfo( objectHandle ); @@ -146,8 +143,6 @@ PRINT1( _L( "MM MTP <> CGetObjectPropValue::ServiceL object file name is %S" ), &suid ); TParsePtrC parse( suid ); - iDpConfig.GetWrapperL().SetStorageRootL( parse.Drive() ); - if ( iMTPTypeString != NULL ) { delete iMTPTypeString; @@ -182,7 +177,7 @@ { iMTPTypeUint16.Set( 0 ); iMTPTypeUint16 = MmMtpDpUtility::GetProtectionStatusL( iFramework.Fs(), - iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); + iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); SendDataL( iMTPTypeUint16 ); } break; @@ -231,29 +226,21 @@ // Name and DataAdded (audio only) fall under the same branch while dateadded(video)/modified/created fall under another case EMTPObjectPropCodeName: // 0xDC44 case EMTPObjectPropCodeDateAdded: // 0xDC4E + case EMTPObjectPropCodeAlbumArtist: { - if ( ( propCode == EMTPObjectPropCodeName) - || ( ( !MmMtpDpUtility::IsVideoL(iObjectInfo->DesC( CMTPObjectMetaData::ESuid ), iFramework ) ) - && ( propCode == EMTPObjectPropCodeDateAdded ) ) ) - { - iMTPTypeString = CMTPTypeString::NewL(); - ServiceMetaDataFromWrapperL( propCode, *iMTPTypeString, *iObjectInfo ); - break; - } - // Else, video DB does not support DateAdded field, use the file system date! - // It's the same behavior with DateCreated and DateModified. - // Fall through intentional. + iMTPTypeString = CMTPTypeString::NewL(); + ServiceMetaDataFromWrapperL( propCode, *iMTPTypeString, *iObjectInfo ); } + break; //lint -fallthrough case EMTPObjectPropCodeDateCreated: case EMTPObjectPropCodeDateModified: { - TTime dataModified; - dataModified = MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), - iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); + TBuf timeStr; + MmMtpDpUtility::GetObjectDateModifiedL( iFramework.Fs(), + iObjectInfo->DesC( CMTPObjectMetaData::ESuid ), + timeStr ); - TBuf timeStr; - dataModified.FormatL( timeStr, KMtpDateTimeFormat ); PRINT1( _L( "MM MTP <> CGetObjectPropValue::ServiceL Date time %S" ), &timeStr ); iMTPTypeString = CMTPTypeString::NewL( timeStr ); SendDataL( *iMTPTypeString ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetobjectreferences.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,10 +17,8 @@ #include -#include #include #ifdef _DEBUG -#include #include #include #endif diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cgetpartialobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,8 +17,6 @@ #include -#include -#include #include "cgetpartialobject.h" #include "mmmtpdplogger.h" @@ -153,7 +151,9 @@ // Get file information CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( iObjectHandle ); __ASSERT_DEBUG( objectInfo, Panic( EMmMTPDpObjectNull ) ); - TBuf fileSuid; + + // NOTE: Change all TBuf into TFileName for easily change when fs change the limitation of filename + TFileName fileSuid; fileSuid.Append( objectInfo->DesC( CMTPObjectMetaData::ESuid ) ); iFileObject = CMTPTypeFile::NewL( iFramework.Fs(), diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cmoveobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -17,10 +17,8 @@ #include -#include #include #include -#include #include #include #include @@ -149,11 +147,14 @@ <= newObjectName.MaxLength() ) { newObjectName.Append( fileNameParser.NameAndExt() ); - } - responseCode = CanMoveObjectL( suid, newObjectName ); + responseCode = CanMoveObjectL( suid, newObjectName ); - if ( responseCode == EMTPRespCodeOK ) - MoveFileL( newObjectName ); + if ( responseCode == EMTPRespCodeOK ) + MoveFileL( newObjectName ); + } + else + // Destination is not appropriate for the full path name shouldn't be longer than 255 + responseCode = EMTPRespCodeInvalidDataset; SendResponseL( responseCode ); @@ -289,16 +290,17 @@ iSameStorage = ETrue; else iSameStorage = EFalse; + + // Move the file first no matter if it will fail in Get/SetPreviousPropertiesL + // Already trapped inside GetPreviousPropertiesL( *iObjectInfo ); - SetPropertiesL( oldFileName, aNewFileName ); + TRAPD( err, SetPropertiesL( aNewFileName ) ); CFileMan* fileMan = CFileMan::NewL( iFramework.Fs() ); - CleanupStack::PushL( fileMan ); - User::LeaveIfError( fileMan->Move( oldFileName, aNewFileName ) ); - CleanupStack::PopAndDestroy( fileMan ); + err = fileMan->Move( oldFileName, aNewFileName ); - User::LeaveIfError( iFramework.Fs().SetModified( aNewFileName, - iPreviousModifiedTime ) ); + if ( err != KErrNone ) + PRINT1( _L( "MM MTP <> CMoveObject::MoveFileL err = %d" ), err ); PRINT( _L( "MM MTP <= CMoveObject::MoveFileL" ) ); } @@ -313,7 +315,6 @@ PRINT( _L( "MM MTP => CMoveObject::GetPreviousPropertiesL" ) ); const TDesC& suid( aObject.DesC( CMTPObjectMetaData::ESuid ) ); - User::LeaveIfError( iFramework.Fs().Modified( suid, iPreviousModifiedTime ) ); // same storage, not necessary to get the properties if ( iSameStorage ) @@ -357,35 +358,28 @@ case EMTPObjectPropCodeName: case EMTPObjectPropCodeDateAdded: - if ( ( propCode == EMTPObjectPropCodeName ) - || ( !MmMtpDpUtility::IsVideoL( aObject.DesC( CMTPObjectMetaData::ESuid ), iFramework ) - && ( propCode == EMTPObjectPropCodeDateAdded ) ) ) - { - CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData + case EMTPObjectPropCodeAlbumArtist: + { + CMTPTypeString* textData = CMTPTypeString::NewLC(); // + textData - TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode, - *textData, - aObject ) ); - - PRINT1( _L( "MM MTP <> CMoveObject::GetPreviousPropertiesL err = %d" ), err ); + TRAP( err, iDpConfig.GetWrapperL().GetObjectMetadataValueL( propCode, + *textData, + aObject ) ); + PRINT1( _L( "MM MTP <> CMoveObject::GetPreviousPropertiesL err = %d" ), err ); - if ( err == KErrNone ) - { - iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) ); - iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, - textData->StringChars() ); - } - else if ( err == KErrNotFound ) - { - iPropertyElement = NULL; - } - else - { - User::Leave( err ); - } + if ( err == KErrNone ) + { + iPropertyElement = &( iPropertyList->ReservePropElemL( handle, propCode ) ); + iPropertyElement->SetStringL( CMTPTypeObjectPropListElement::EValue, + textData->StringChars() ); + } + else + { + iPropertyElement = NULL; + } - CleanupStack::PopAndDestroy( textData ); // - textData - } + CleanupStack::PopAndDestroy( textData ); // - textData + } break; default: @@ -447,13 +441,15 @@ case EMTPObjectPropCodeNonConsumable: iObjectInfo->SetUint( CMTPObjectMetaData::ENonConsumable, element.Uint8L( CMTPTypeObjectPropListElement::EValue ) ); + iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo ); break; case EMTPObjectPropCodeName: + case EMTPObjectPropCodeAlbumArtist: { CMTPTypeString *stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) ); // + stringData - respcode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapperL( iDpConfig, + respcode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, propertyCode, *stringData, *iObjectInfo ); @@ -474,6 +470,10 @@ } // end of for loop // ignore errors + if ( respcode == EMTPRespCodeOK ) + { + // do nothing, just to get rid of build warning + } PRINT1( _L( "MM MTP <= CMoveObject::SetPreviousPropertiesL respcode = 0x%x" ), respcode ); } @@ -483,16 +483,9 @@ // Set the object properties in the object property store. // ----------------------------------------------------------------------------- // -void CMoveObject::SetPropertiesL( const TDesC& aOldFileName, - const TDesC& aNewFileName ) +void CMoveObject::SetPropertiesL( const TDesC& aNewFileName ) { - PRINT2( _L( "MM MTP => CMoveObject::SetPropertiesL aOldFileName = %S, aNewFileName = %S" ), - &aOldFileName, - &aNewFileName ); - - iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewFileName ); - iObjectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId ); - iObjectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle ); + PRINT1( _L( "MM MTP => CMoveObject::SetPropertiesL, aNewFileName = %S" ), &aNewFileName ); TUint32 formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode ); if ( formatCode == EMTPFormatCodeAbstractAudioVideoPlaylist ) @@ -501,23 +494,27 @@ PRINT( _L( "MM MTP <> CMoveObject::SetPropertiesL Playlist file do not update the MPX DB" ) ); } else + // TODO: Need rollback mechanism for consistant with image dp in fw. + // Not sure if it should be trap if something wrong with MPX db. { if ( iSameStorage ) - iDpConfig.GetWrapperL().RenameObjectL( aOldFileName, aNewFileName ); - // if the two object in different storage, we should delete the old one and insert new one - else { - iDpConfig.GetWrapperL().DeleteObjectL( aOldFileName, formatCode ); + iDpConfig.GetWrapperL().RenameObjectL( *iObjectInfo, aNewFileName ); + } + else // if the two object in different storage, we should delete the old one and insert new one + { + iDpConfig.GetWrapperL().DeleteObjectL( *iObjectInfo ); + iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo ); - TUint32 subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode ); - iDpConfig.GetWrapperL().AddObjectL( aNewFileName, - formatCode, - subFormatCode ); - + // Only leave when getting proplist element from data received by fw. + // It should not happen after ReceiveDataL in which construction of proplist already succeed. SetPreviousPropertiesL(); } } + iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, aNewFileName ); + iObjectInfo->SetUint( CMTPObjectMetaData::EStorageId, iStorageId ); + iObjectInfo->SetUint( CMTPObjectMetaData::EParentHandle, iNewParentHandle ); iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo ); // It's not necessary to change references of playlists since Reference DB is used PUID diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/cpropertysettingutility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -40,28 +40,28 @@ } // ----------------------------------------------------------------------------- -// CPropertySettingUtility::SetMetaDataToWrapperL +// CPropertySettingUtility::SetMetaDataToWrapper // // ----------------------------------------------------------------------------- // -EXPORT_C TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapperL( MMmMtpDpConfig& aDpConfig, +EXPORT_C TMTPResponseCode CPropertySettingUtility::SetMetaDataToWrapper( MMmMtpDpConfig& aDpConfig, const TUint16 aPropCode, MMTPType& aNewData, const CMTPObjectMetaData& aObjectMetaData ) { TMTPResponseCode responseCode = EMTPRespCodeOK; TRAPD( err, aDpConfig.GetWrapperL().SetObjectMetadataValueL( aPropCode, - aNewData, - aObjectMetaData ) ); + aNewData, + aObjectMetaData ) ); - PRINT1( _L("MM MTP <> CPropertySettingUtility::SetMetaDataToWrapperL err = %d"), err); + PRINT1( _L("MM MTP <> CPropertySettingUtility::SetMetaDataToWrapper err = %d"), err); if ( err == KErrNone ) responseCode = EMTPRespCodeOK; - else // Other errors are not SetMetaDataToWrapperL related, should be respond before this calling + else // Other errors are not SetMetaDataToWrapper related, should be respond before this calling responseCode = EMTPRespCodeGeneralError; - PRINT1( _L( "MM MTP <= CPropertySettingUtility::SetMetaDataToWrapperL resCode = 0x%x" ), responseCode ); + PRINT1( _L( "MM MTP <= CPropertySettingUtility::SetMetaDataToWrapper resCode = 0x%x" ), responseCode ); return responseCode; } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crenameobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,9 +18,7 @@ #include -#include #include -#include #include #include "crenameobject.h" @@ -147,6 +145,8 @@ if ( iNewFolderName.Length() + iRightPartName.Length() <= KMaxFileName ) { + PerformAdditionalActionL(); + iFileName.Zero(); iFileName.Append( iNewFolderName ); iFileName.Append( iRightPartName ); @@ -155,8 +155,6 @@ iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, iFileName ); iObjectInfo->SetUint( CMTPObjectMetaData::EObjectMetaDataUpdate, 1 ); iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo ); - - PerformAdditionalActionL(); } } @@ -287,7 +285,7 @@ PRINT( _L( "MM MTP => CRenameObject::PerformAdditionalActionL" ) ); // update MPX DB - TRAPD( err, iWrapper.RenameObjectL( iOldFileName, iFileName ) ); + TRAPD( err, iWrapper.RenameObjectL( *iObjectInfo, iFileName ) ); // should not fail for 1 file, keep it going, as folder already renamed if ( err != KErrNone ) diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestchecker.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -80,7 +79,7 @@ // ----------------------------------------------------------------------------- // CRequestChecker::VerifyRequestL -// Verfiy the request +// Verify the request // ----------------------------------------------------------------------------- // TMTPResponseCode CRequestChecker::VerifyRequestL( const TMTPTypeRequest& aRequest, @@ -211,7 +210,7 @@ // ----------------------------------------------------------------------------- // TMTPResponseCode CRequestChecker::VerifySessionId( TUint32 aSessionId, - const TMTPRequestElementInfo& /*aElementInfo*/ ) const + const TMTPRequestElementInfo& /*aElementInfo*/ ) const { TMTPResponseCode ret = EMTPRespCodeOK; @@ -237,7 +236,7 @@ // ----------------------------------------------------------------------------- // TMTPResponseCode CRequestChecker::VerifyObjectHandleL( TUint32 aHandle, - const TMTPRequestElementInfo& aElementInfo ) + const TMTPRequestElementInfo& aElementInfo ) { PRINT1( _L("MM MTP => CRequestChecker::VerifyObjectHandleL aHandle = 0x%x"), aHandle ); TMTPResponseCode ret = EMTPRespCodeOK; @@ -255,58 +254,32 @@ TEntry entry; TInt err = iFramework.Fs().Entry( suid, entry ); - if ( object->Uint( CMTPObjectMetaData::EFormatCode ) == EMTPFormatCodeAssociation ) -// && ( object->Uint( CMTPObjectMetaData::EFormatSubCode ) == EMTPAssociationTypeGenericFolder ) ) + if ( err == KErrNotFound ) { - // Special association type .. not always present on the filesystem. - return ret; + iFramework.ObjectMgr().RemoveObjectL( suid ); + // TODO: workaround for abstractalbumart + // ret = EMTPRespCodeInvalidObjectHandle; } - else + else if ( err != KErrNone ) + ret = EMTPRespCodeGeneralError; + else if ( object->Uint( CMTPObjectMetaData::EFormatCode ) != EMTPFormatCodeAssociation ) { - User::LeaveIfError( err ); - if ( iFramework.ObjectMgr().ObjectOwnerId( aHandle ) != iFramework.DataProviderId() ) - { - PRINT( _L(" ewrwe ret = EMTPRespCodeInvalidObjectHandle;")); ret = EMTPRespCodeInvalidObjectHandle; - } - } - if ( aElementInfo.iElementAttr & EMTPElementAttrWrite ) - { - if ( entry.IsReadOnly() ) - { + if ( ( aElementInfo.iElementAttr & EMTPElementAttrWrite ) && entry.IsReadOnly() ) ret = EMTPRespCodeObjectWriteProtected; - } - } - - //((EMTPRespCodeOK == ret) && (aElementInfo.iElementAttr & EMTPElementAttrFileOrDir)) is - // covered implicitly here, EMTPRespCodeOK will be returned. It is a valid case for an object to be either a folder or file - // for certain operation's request parameter, for instance the first parameter of copyObject or - // moveObject can be either a file or a directory. - // Other cases. - if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrFile) ) - { - if ( entry.IsDir() ) - { + if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrFile ) && entry.IsDir() ) ret = EMTPRespCodeInvalidObjectHandle; - } - } - if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrDir ) ) - { - if (!entry.IsDir()) - { + if ( ( EMTPRespCodeOK == ret ) && ( aElementInfo.iElementAttr & EMTPElementAttrDir ) && !entry.IsDir() ) ret = EMTPRespCodeInvalidParentObject; - } } } else - { - PRINT( _L( "MM MTP <> CRequestChecker::VerifyObjectHandleL, Object does not exist." ) ); ret = EMTPRespCodeInvalidObjectHandle; - } + PRINT1( _L( "MM MTP <= CRequestChecker::VerifyObjectHandleL ret = 0x%x" ), ret ); return ret; @@ -318,7 +291,7 @@ // ----------------------------------------------------------------------------- // TMTPResponseCode CRequestChecker::VerifyStorageIdL( TUint32 aStorageId, - const TMTPRequestElementInfo& aElementInfo ) const + const TMTPRequestElementInfo& aElementInfo ) const { MMTPStorageMgr& mgr( iFramework.StorageMgr() ); TMTPResponseCode ret( EMTPRespCodeOK ); @@ -369,7 +342,7 @@ // ----------------------------------------------------------------------------- // TMTPResponseCode CRequestChecker::VerifyFormatCode( TUint32 aFormatCode, - const TMTPRequestElementInfo& aElementInfo ) const + const TMTPRequestElementInfo& aElementInfo ) const { PRINT1( _L( "MM MTP => CRequestChecker::VerifyFormatCode aFormatCode = 0x%x" ), aFormatCode ); TMTPResponseCode ret = EMTPRespCodeInvalidObjectFormatCode; @@ -407,7 +380,7 @@ // ----------------------------------------------------------------------------- // TBool CRequestChecker::IsSpecialValue( TUint32 aParameter, - const TMTPRequestElementInfo& aElementInfo ) const + const TMTPRequestElementInfo& aElementInfo ) const { TBool result = EFalse; switch ( aElementInfo.iCount ) diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/crequestprocessor.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,7 +18,6 @@ #include #include -#include #include #include #include @@ -414,8 +413,11 @@ // EXPORT_C TInt CRequestProcessor::RunError( TInt aError ) { - PRINT1( _L( "MM MTP <> CRequestProcessor RunError = %d" ), aError ); + if ( aError != KErrNone ) + PRINT1( _L( "MM MTP <> CRequestProcessor RunError = %d" ), aError ); + TRAP_IGNORE( SendResponseL( EMTPRespCodeGeneralError ) ); + return KErrNone; } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csendobject.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,13 +16,11 @@ */ -#include #include #include #include #include #include -#include #include #include @@ -81,10 +79,7 @@ // EXPORT_C CSendObject::~CSendObject() { - if ( ( iProgress == EObjectInfoSucceed - || iProgress == EObjectInfoFail - || iProgress == EObjectInfoInProgress ) - && !iNoRollback ) + if ( !iNoRollback ) { // Not finished SendObjectInfo \ SendObject pair detected. Rollback(); @@ -109,7 +104,7 @@ CSendObject::CSendObject( MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection, MMmMtpDpConfig& aDpConfig ) : - CRequestProcessor( aFramework, aConnection, 0, NULL), + CRequestProcessor( aFramework, aConnection, 0, NULL ), iFs( iFramework.Fs() ), iObjectMgr( iFramework.ObjectMgr() ), iDpConfig( aDpConfig ) @@ -581,53 +576,60 @@ TBool result = ETrue; - delete iFileReceived; - iFileReceived = NULL; - - TEntry fileEntry; - User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) ); - if ( fileEntry.FileSize() != iObjectSize ) + // SendObject is cancelled or connection is dropped. + if ( iCancelled ) { - iFs.Delete( iFullPath ); - iObjectMgr.UnreserveObjectHandleL( *iReceivedObjectInfo ); - TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge; - if ( fileEntry.FileSize() < iObjectSize ) - { - responseCode = EMTPRespCodeIncompleteTransfer; - } - SendResponseL( responseCode ); - result = EFalse; - } - - // SendObject is cancelled or connection is dropped. - if ( result && iCancelled ) - { + // In SendObject response phase, unregister is not necessary. + // But there's no harm, still keep it here. iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest, iConnection ); + Rollback(); SendResponseL( EMTPRespCodeTransactionCancelled ); } - else if ( result && !iCancelled ) + else { - if ( iObjectSize > 0 ) // media file + TEntry fileEntry; + User::LeaveIfError( iFs.Entry( iFullPath, fileEntry ) ); + + if ( fileEntry.FileSize() != iObjectSize ) { - AddMediaToStoreL(); + Rollback(); + TMTPResponseCode responseCode = EMTPRespCodeObjectTooLarge; + if ( fileEntry.FileSize() < iObjectSize ) + { + responseCode = EMTPRespCodeIncompleteTransfer; + } + SendResponseL( responseCode ); + result = EFalse; + } + else + { + if ( iObjectSize > 0 ) // media file + { + TRAPD( err, AddMediaToStoreL() ); + PRINT1( _L( "MM MTP <> CSendObject::DoHandleResponsePhaseObjectL err = %d" ), err ); - if( iPreviousOperation == EMTPOpCodeSendObjectPropList ) - { - SetObjectPropListL( *iObjectPropList ); + if ( ( iPreviousOperation == EMTPOpCodeSendObjectPropList ) + && ( err == KErrNone ) ) + { + // Only leave when getting proplist element from data received by fw. + // It should not happen after ReceiveDataL in which construction of proplist already succeed. + SetObjectPropListL(); + } + + // Commits into MTP data object enumeration store the object handle and + // storage space previously reserved for the specified object. + iFramework.ObjectMgr().CommitReservedObjectHandleL( *iReceivedObjectInfo ); } - // Commits into MTP data object enumeration store the object handle and - // storage space previously reserved for the specified object. - iFramework.ObjectMgr().CommitReservedObjectHandleL( *iReceivedObjectInfo ); - } + // In SendObject response phase, unregister is not necessary. + // But there's no harm, still keep it here. + iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest, + iConnection ); - // Commit object to MTP data store - iFramework.RouteRequestUnregisterL( iExpectedSendObjectRequest, - iConnection ); - - SendResponseL( EMTPRespCodeOK ); + SendResponseL( EMTPRespCodeOK ); + } } PRINT1( _L( "MM MTP <= CSendObject::DoHandleResponsePhaseObjectL result = %d" ), result ); @@ -888,7 +890,7 @@ // Reserve object proplist into database // ----------------------------------------------------------------------------- // -TMTPResponseCode CSendObject::SetObjectPropListL( const CMTPTypeObjectPropList& aPropList ) +TMTPResponseCode CSendObject::SetObjectPropListL() { PRINT( _L( "MM MTP => CSendObject::SetObjectPropListL" ) ); @@ -903,7 +905,8 @@ TUint16 propertyCode = element.Uint16L( CMTPTypeObjectPropListElement::EPropertyCode ); TUint16 dataType = element.Uint16L( CMTPTypeObjectPropListElement::EDatatype ); PRINT2( _L( "MM MTP <> SetObjectPropListL propertyCode = 0x%x, dataType = 0x%x" ), - propertyCode, dataType ); + propertyCode, + dataType ); switch ( propertyCode ) { @@ -924,7 +927,7 @@ case EMTPObjectPropCodeDateCreated: case EMTPObjectPropCodeDateModified: case EMTPObjectPropCodeObjectFileName: - // TODO: Does anything need to be done on these read-only properties? + // Do nothing for read-only properties /* spec: * Object properties that are get-only (0x00 GET) * should accept values during object creation by @@ -933,14 +936,16 @@ break; case EMTPObjectPropCodeProtectionStatus: - SetProtectionStatusL(); + // Already done in AddMediaToStore, it's not necessary to set it again. + // SetProtectionStatus(); break; case EMTPObjectPropCodeName: + case EMTPObjectPropCodeAlbumArtist: { CMTPTypeString* stringData = CMTPTypeString::NewLC( element.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData - responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapperL( iDpConfig, + responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, propertyCode, *stringData, *iReceivedObjectInfo ); @@ -1075,17 +1080,32 @@ PRINT1( _L("MM MTP => CSendObject::GetFullPathNameL aFileName = %S"), &aFileName ); TBool result( EFalse ); + if ( aFileName.Length() > 0 ) { iFullPath.Zero(); iFullPath.Append( *iParentSuid ); - if ( ( iFullPath.Length() + aFileName.Length() ) < KMaxFileName ) + + // TODO: need to be done in derived class + // Only add extension for alb to pass winlogo test cases + TInt length = iFullPath.Length() + aFileName.Length(); + + TParsePtrC parser( aFileName ); + TBool isAlbWithoutExt = + ( ( iObjectFormat == EMTPFormatCodeAbstractAudioAlbum ) && ( !parser.ExtPresent() ) ); + if ( isAlbWithoutExt ) + length += KTxtExtensionALB().Length(); + + if ( length < KMaxFileName ) { iFullPath.Append( aFileName ); + if ( isAlbWithoutExt ) + iFullPath.Append( KTxtExtensionALB ); PRINT1( _L( "MM MTP <> CSendObject::GetFullPathNameL iFullPath = %S" ), &iFullPath ); result = iFramework.Fs().IsValidName( iFullPath ); } } + if ( result && ( iObjectFormat != MmMtpDpUtility::FormatFromFilename( iFullPath ) ) ) { PRINT2( _L( "MM MTP <> %S does not match 0x%x" ), &iFullPath, iObjectFormat ); @@ -1156,15 +1176,22 @@ // Reserves space for and assigns an object handle to the object described // by the specified object information record. TRAP( err, iObjectMgr.ReserveObjectHandleL( *iReceivedObjectInfo, - iObjectSize ) ); + iObjectSize ) ); PRINT2( _L( "MM MTP => CSendObject::ReserveObjectL iObjectsize = %Lu, Operation: 0x%x" ), iObjectSize, iOperationCode ); if ( err != KErrNone ) PRINT1( _L( "MM MTP <> CSendObject::ReserveObjectL err = %d" ), err ); if ( iObjectSize == 0 ) { + // Already trapped inside SaveEmptyFileL. SaveEmptyFileL(); - SetObjectPropListL( *iObjectPropList ); + if( iOperationCode == EMTPOpCodeSendObjectPropList ) + { + // Only leave when getting proplist element from data received by fw. + // It should not happen after ReceiveDataL in which construction of proplist already succeed. + SetObjectPropListL(); + } + iObjectMgr.CommitReservedObjectHandleL( *iReceivedObjectInfo ); } @@ -1182,29 +1209,40 @@ } // ----------------------------------------------------------------------------- -// CSendObject::SetProtectionStatusL +// CSendObject::SetProtectionStatus // ----------------------------------------------------------------------------- // -void CSendObject::SetProtectionStatusL() +void CSendObject::SetProtectionStatus() { - PRINT1( _L( "MM MTP => CSendObject::SetProtectionStatusL iProtectionStatus = %d" ), iProtectionStatus ); + PRINT1( _L( "MM MTP => CSendObject::SetProtectionStatus iProtectionStatus = %d" ), iProtectionStatus ); - if ( iProtectionStatus == EMTPProtectionNoProtection - || iProtectionStatus == EMTPProtectionReadOnly ) + if ( iFileReceived != NULL ) { - // TODO: wait for review - TInt err = KErrNone; - if ( iProtectionStatus == EMTPProtectionNoProtection ) + if ( iProtectionStatus == EMTPProtectionNoProtection + || iProtectionStatus == EMTPProtectionReadOnly ) { - err = iFs.SetAtt( iFullPath, KEntryAttNormal, KEntryAttReadOnly ); + TInt err = KErrNone; + if ( iProtectionStatus == EMTPProtectionNoProtection ) + { + err = iFileReceived->File().SetAtt( KEntryAttNormal, KEntryAttReadOnly ); + } + else + { + err = iFileReceived->File().SetAtt( KEntryAttReadOnly, KEntryAttNormal ); + } + + if ( err != KErrNone ) + { + PRINT1( _L("MM MTP <> CSendObject::SetProtectionStatus err = %d" ), err ); + } } - else - { - err = iFs.SetAtt( iFullPath, KEntryAttReadOnly, KEntryAttNormal ); - } - User::LeaveIfError( err ); + // Close the file after SetProtectionStatus to make sure other process won't open + // the file successfully right at the time calling RFile::SetAtt. + delete iFileReceived; + iFileReceived = NULL; } - PRINT( _L( "MM MTP <= CSendObject::SetProtectionStatusL" ) ); + + PRINT( _L( "MM MTP <= CSendObject::SetProtectionStatus" ) ); } // ----------------------------------------------------------------------------- @@ -1217,28 +1255,28 @@ RFile file; User::LeaveIfError( file.Create( iFs, iFullPath, EFileWrite ) ); - file.Close(); - - // set entry protection status and modified date - SetProtectionStatusL(); - - // add playlist to MPX DB - TParsePtrC parse( iFullPath ); - iDpConfig.GetWrapperL().SetStorageRootL( parse.Drive() ); - iDpConfig.GetWrapperL().AddObjectL( iFullPath, iObjectFormat, EMTPSubFormatCodeUnknown ); + CleanupClosePushL( file ); // + file if ( EMTPFormatCodeAbstractAudioVideoPlaylist == iObjectFormat ) { TInt err = KErrNone; - err = iFs.SetAtt( iFullPath, - KEntryAttSystem | KEntryAttHidden, + err = file.SetAtt( KEntryAttSystem | KEntryAttHidden, KEntryAttReadOnly | KEntryAttNormal ); if ( err != KErrNone ) PRINT1( _L( "MM MTP <> CSendObject::SaveEmptyFileL err = %d" ), err ); iDpConfig.GetWrapperL().AddDummyFileL( iFullPath ); } + CleanupStack::PopAndDestroy( &file ); // - file - PRINT( _L( "MM MTP <= CSendObject::SaveEmptyFileL" ) ); + // add playlist to MPX DB + TRAPD( err, AddMediaToStoreL() ); + + if ( err != KErrNone ) + { + // Ignore err even add into MPX get failed. + } + + PRINT1( _L( "MM MTP <= CSendObject::SaveEmptyFileLerr = %d" ), err ); } // ----------------------------------------------------------------------------- @@ -1250,56 +1288,16 @@ { PRINT( _L( "MM MTP => CSendObject::AddMediaToStoreL" ) ); - TBool isVideo = EFalse; - TMmMtpSubFormatCode subFormatCode; - switch ( iObjectFormat ) - { - case EMTPFormatCode3GPContainer: - case EMTPFormatCodeMP4Container: - case EMTPFormatCodeASF: - { - - if ( MmMtpDpUtility::IsVideoL( iFullPath ) ) - { - subFormatCode = EMTPSubFormatCodeVideo; - isVideo = ETrue; - } - else - { - subFormatCode = EMTPSubFormatCodeAudio; - isVideo = EFalse; - } - - iReceivedObjectInfo->SetUint( CMTPObjectMetaData::EFormatSubCode, - ( TUint ) subFormatCode ); - } - break; + // SetProtectionStatus here make sure no matter the previous operation is SendObjectInfo + // or SendObjectPropList + // Might need to set dateadded and datemodify for further extension. + SetProtectionStatus(); - // put all just video format codes here - case EMTPFormatCodeWMV: - { - isVideo = ETrue; - } - break; - - default: - PRINT( _L( "MM MTP <> CSendObject::DoHandleResponsePhaseObjectL default" ) ); - break; - } + iDpConfig.GetWrapperL().SetStorageRootL( iFullPath ); + PRINT1( _L( "MM MTP <> CSendObject::AddMediaToStoreL iFullPath = %S" ), &iFullPath ); + iDpConfig.GetWrapperL().AddObjectL( *iReceivedObjectInfo ); - TPtrC suid( iReceivedObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); - PRINT1( _L( "MM MTP <> CSendObject::AddMediaToStoreL suid = %S" ), &suid ); - TParsePtrC parse( suid ); - iDpConfig.GetWrapperL().SetStorageRootL( parse.Drive() ); - iDpConfig.GetWrapperL().AddObjectL( iFullPath, iObjectFormat, subFormatCode ); - - if ( isVideo ) - { - TInt err = KErrNone; - TRAP( err, iDpConfig.GetWrapperL().SetImageObjPropL( iFullPath, iWidth, iHeight ) ); - - PRINT1( _L( "MM MTP <= CSendObject::AddVideoToStoreL err = %d" ), err ); - } + iDpConfig.GetWrapperL().SetImageObjPropL( *iReceivedObjectInfo, iWidth, iHeight ); PRINT( _L( "MM MTP <= CSendObject::AddMediaToStoreL" ) ); } @@ -1324,7 +1322,9 @@ void CSendObject::Rollback() { // Delete this object from file system. - if ( iProgress == ESendObjectInProgress ) + if ( iProgress == ESendObjectInProgress + || iProgress == EObjectInfoSucceed + ||iProgress == EObjectInfoFail ) { PRINT1( _L( "MM MTP <> CSendObject::Rollback ROLLBACK_FILE %S" ), &iFullPath ); // Close the interrupted transfer file by delete iFileReceived object diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectproplist.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -219,29 +218,30 @@ case EMTPObjectPropCodeObjectFileName: { TPtrC suid( object->DesC( CMTPObjectMetaData::ESuid ) ); - TBuf newSuid( aPropListElement.StringL( - CMTPTypeObjectPropListElement::EValue ) ); - TInt err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), suid, newSuid ); - PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); - if ( KErrOverflow == err ) // full path name is too long - { + TPtrC ptr( aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) ); + if ( KMaxFileName < ptr.Length() ) responseCode = EMTPRespCodeInvalidDataset; - } - else if ( ( KErrNone == err ) || ( KErrAlreadyExists == err ) ) + else { - TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( suid, newSuid ) ); //Update MPX DB - PRINT1( _L( "MM MTP <> Rename Object err = %d" ), err ); - // it is ok if file is not found in DB, following S60 solution - if ( KErrNotFound == err ) + TFileName newSuid( ptr ); + TInt err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), suid, newSuid ); + PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); + if ( KErrOverflow == err ) // full path name is too long + { + responseCode = EMTPRespCodeInvalidDataset; + } + else if ( KErrNone == err ) // TODO: ( KErrAlreadyExists == err ) { - TUint formatCode = object->Uint( CMTPObjectMetaData::EFormatCode ); - TUint subFormatCode = object->Uint( CMTPObjectMetaData::EFormatSubCode ); - TRAP( err, iDpConfig.GetWrapperL().AddObjectL( newSuid, formatCode, subFormatCode ) ); - PRINT1( _L( "MM MTP <> Add Object err = %d" ), err ); - } + TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *object, newSuid ) ); //Update MPX DB - if ( KErrNone == err ) - { + PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err ); + // it is ok if file is not found in DB, following S60 solution + if ( KErrNotFound == err ) + { + TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *object ) ); + PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err ); + } + object->SetDesCL( CMTPObjectMetaData::ESuid, newSuid ); iFramework.ObjectMgr().ModifyObjectL( *object ); } @@ -254,11 +254,12 @@ break; case EMTPObjectPropCodeName: + case EMTPObjectPropCodeAlbumArtist: { CMTPTypeString* stringData = CMTPTypeString::NewLC( aPropListElement.StringL( CMTPTypeObjectPropListElement::EValue ) );// + stringData - responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapperL( iDpConfig, + responseCode = iDpConfig.PropSettingUtility()->SetMetaDataToWrapper( iDpConfig, propertyCode, *stringData, *object ); @@ -332,7 +333,8 @@ // EXPORT_C TInt CSetObjectPropList::RunError( TInt aError ) { - PRINT1( _L( "MM MTP <> CGetObjectPropList::RunError aError = %d" ), aError ); + if ( aError != KErrNone ) + PRINT1( _L( "MM MTP <> CGetObjectPropList::RunError aError = %d" ), aError ); TRAP_IGNORE( SendResponseL( EMTPRespCodeGeneralError ) ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectpropvalue.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -16,7 +16,6 @@ */ -#include #include #include #include @@ -152,13 +151,13 @@ CMTPObjectMetaData* objectInfo = iRequestChecker->GetObjectInfo( objectHandle ); if ( objectInfo == NULL ) { - PRINT( _L("MM MTP <> CGetObjectPropValue::CheckRequestL, objectInfo is NULL" ) ); + PRINT( _L("MM MTP <> CSetObjectPropValue::CheckRequestL, objectInfo is NULL" ) ); return EMTPRespCodeInvalidObjectHandle; } TFileName fileName = objectInfo->DesC( CMTPObjectMetaData::ESuid ); TUint32 formatCode = objectInfo->Uint( CMTPObjectMetaData::EFormatCode ); - PRINT3( _L( "MM MTP <> CGetObjectPropValue::CheckRequestL, handle = 0x%x, filename = %S, formatCode = 0x%x" ), + PRINT3( _L( "MM MTP <> CSetObjectPropValue::CheckRequestL, handle = 0x%x, filename = %S, formatCode = 0x%x" ), objectHandle, &fileName, formatCode ); @@ -231,6 +230,7 @@ // Get Data for String objects case EMTPObjectPropCodeObjectFileName: // 0xDC07 case EMTPObjectPropCodeName: // 0xDC44 + case EMTPObjectPropCodeAlbumArtist: { delete iMTPTypeString; iMTPTypeString = NULL; @@ -269,32 +269,34 @@ case EMTPObjectPropCodeObjectFileName: { TPtrC suid( iObjectInfo->DesC( CMTPObjectMetaData::ESuid ) ); - TBuf newSuid( iMTPTypeString->StringChars() ); - PRINT2( _L( "MM MTP <> old name = %S, new name = %S" ), &suid, &newSuid ); - TInt err = KErrNone; - err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), - suid, - newSuid ); - PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); - if ( KErrOverflow == err ) // full path name is too long - { + TPtrC ptr ( iMTPTypeString->StringChars() ); + if ( KMaxFileName < ptr.Length() ) responseCode = EMTPRespCodeInvalidDataset; - } - else if ( ( KErrNone == err ) || ( KErrAlreadyExists == err ) ) + else { - TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( suid, newSuid ) ); //Update MPX DB - PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err ); - // it is ok if file is not found in DB, following S60 solution - if ( KErrNotFound == err ) + TFileName newSuid( ptr ); + PRINT2( _L( "MM MTP <> old name = %S, new name = %S" ), &suid, &newSuid ); + TInt err = KErrNone; + err = MmMtpDpUtility::UpdateObjectFileName( iFramework.Fs(), + suid, + newSuid ); + // TODO: if the new name is the same with old name + PRINT1( _L( "MM MTP <> Update object file name err = %d" ), err ); + if ( KErrOverflow == err ) // full path name is too long { - TUint formatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatCode ); - TUint subFormatCode = iObjectInfo->Uint( CMTPObjectMetaData::EFormatSubCode ); - TRAP( err, iDpConfig.GetWrapperL().AddObjectL( newSuid, formatCode, subFormatCode ) ); - PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err ); + responseCode = EMTPRespCodeInvalidDataset; } + else if ( KErrNone == err ) + { + TRAP( err, iDpConfig.GetWrapperL().RenameObjectL( *iObjectInfo, newSuid ) ); //Update MPX DB + PRINT1( _L( "MM MTP <> Rename MPX object file name err = %d" ), err ); + // it is ok if file is not found in DB, following S60 solution + if ( KErrNotFound == err ) + { + TRAP( err, iDpConfig.GetWrapperL().AddObjectL( *iObjectInfo ) ); + PRINT1( _L( "MM MTP <> Add MPX object file name err = %d" ), err ); + } - if ( KErrNone == err ) - { iObjectInfo->SetDesCL( CMTPObjectMetaData::ESuid, newSuid ); iFramework.ObjectMgr().ModifyObjectL( *iObjectInfo ); } @@ -307,6 +309,7 @@ break; case EMTPObjectPropCodeName: // 0xDC44 + case EMTPObjectPropCodeAlbumArtist: { responseCode = ServiceMetaDataToWrapperL( iPropCode, *iMTPTypeString, diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp --- a/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/mmmtpdprequestprocessor/src/csetobjectreferences.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,7 +18,6 @@ #include #include -#include #include #include "csetobjectreferences.h" @@ -28,6 +27,8 @@ #include "mmmtpdputility.h" #include "mmmtpdpconfig.h" +const TInt KMmMtpRefArrayGranularity = 3; + // ----------------------------------------------------------------------------- // Verification data for the SetReferences request // ----------------------------------------------------------------------------- @@ -88,16 +89,14 @@ // Standard c++ constructor // ----------------------------------------------------------------------------- // -EXPORT_C CSetObjectReferences::CSetObjectReferences( - MMTPDataProviderFramework& aFramework, +EXPORT_C CSetObjectReferences::CSetObjectReferences( MMTPDataProviderFramework& aFramework, MMTPConnection& aConnection, MMmMtpDpConfig& aDpConfig ) : - CRequestProcessor( - aFramework, - aConnection, - sizeof( KMTPSetObjectReferencesPolicy )/sizeof( TMTPRequestElementInfo ), - KMTPSetObjectReferencesPolicy ), - iDpConfig( aDpConfig ) + CRequestProcessor( aFramework, + aConnection, + sizeof( KMTPSetObjectReferencesPolicy ) / sizeof( TMTPRequestElementInfo ), + KMTPSetObjectReferencesPolicy ), + iDpConfig( aDpConfig ) { PRINT( _L( "Operation: SetObjectReferences(0x9811)" ) ); } @@ -107,12 +106,15 @@ // set references to DB // ----------------------------------------------------------------------------- // -EXPORT_C void CSetObjectReferences::DoSetObjectReferencesL( CMmMtpDpMetadataAccessWrapper& aWrapper, - TUint16 aObjectFormat, - const TDesC& aSrcFileName, - CDesCArray& aRefFileArray ) +EXPORT_C void CSetObjectReferences::DoSetObjectReferencesL( const CMTPObjectMetaData& aObject ) { - // do nothing, do special thing by inheriting + TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode ); + TBool hasReference = MmMtpDpUtility::HasReference( formatCode ); + + if ( hasReference ) + { + iDpConfig.GetWrapperL().SetReferenceL( aObject, *iReferenceSuids ); + } } // ----------------------------------------------------------------------------- @@ -142,7 +144,7 @@ delete iReferenceSuids; iReferenceSuids = NULL; - iReferenceSuids = new ( ELeave ) CDesCArrayFlat( 3 ); + iReferenceSuids = new ( ELeave ) CDesCArrayFlat( KMmMtpRefArrayGranularity ); if ( !VerifyReferenceHandlesL() ) { @@ -159,10 +161,7 @@ CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC(); // + object iFramework.ObjectMgr().ObjectL( objectHandle, *object ); PRINT1( _L( "MM MTP <> object file name is %S" ), &(object->DesC( CMTPObjectMetaData::ESuid ) ) ); - DoSetObjectReferencesL( iDpConfig.GetWrapperL(), - object->Uint( CMTPObjectMetaData::EFormatCode ), - object->DesC( CMTPObjectMetaData::ESuid ), - *iReferenceSuids ); + DoSetObjectReferencesL( *object ); CleanupStack::PopAndDestroy( object ); // - object @@ -196,8 +195,9 @@ result = EFalse; break; } - - iReferenceSuids->AppendL( object->DesC( CMTPObjectMetaData::ESuid ) ); + // Only audio in playlist is supported + if ( iDpConfig.GetWrapperL().Category( *object ) == EMPXSong ) + iReferenceSuids->AppendL( object->DesC( CMTPObjectMetaData::ESuid ) ); } CleanupStack::PopAndDestroy( object ); // - object PRINT( _L( "MM MTP <= CSetObjectReferences::VerifyReferenceHandlesL" ) ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -50,14 +50,13 @@ // create singleton instance // ----------------------------------------------------------------------------- // -EXPORT_C void CMmMtpDpAccessSingleton::CreateL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +EXPORT_C void CMmMtpDpAccessSingleton::CreateL( MMTPDataProviderFramework& aFramework ) { CMmMtpDpAccessSingleton* self = reinterpret_cast( Dll::Tls() ); if ( self == NULL ) { - self = CMmMtpDpAccessSingleton::NewL( aRfs, aFramework ); + self = CMmMtpDpAccessSingleton::NewL( aFramework ); Dll::SetTls( reinterpret_cast( self ) ); } else @@ -135,12 +134,11 @@ // two-phase construction // ----------------------------------------------------------------------------- // -CMmMtpDpAccessSingleton* CMmMtpDpAccessSingleton::NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +CMmMtpDpAccessSingleton* CMmMtpDpAccessSingleton::NewL( MMTPDataProviderFramework& aFramework ) { CMmMtpDpAccessSingleton* self = new(ELeave) CMmMtpDpAccessSingleton; CleanupStack::PushL( self ); - self->ConstructL(aRfs, aFramework); + self->ConstructL( aFramework ); CleanupStack::Pop( self ); return self; } @@ -150,10 +148,9 @@ // two-phase construction // ----------------------------------------------------------------------------- // -void CMmMtpDpAccessSingleton::ConstructL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +void CMmMtpDpAccessSingleton::ConstructL( MMTPDataProviderFramework& aFramework ) { - iWrapper = CMmMtpDpMetadataAccessWrapper::NewL( aRfs, aFramework ); + iWrapper = CMmMtpDpMetadataAccessWrapper::NewL( aFramework ); } diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadataaccesswrapper.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -18,6 +18,8 @@ #include #include +#include +#include #include #include #include @@ -27,14 +29,14 @@ #include "cmmmtpdpmetadatampxaccess.h" #include "cmmmtpdpmetadatavideoaccess.h" #include "mmmtpdputility.h" +#include "tobjectdescription.h" #include "mmmtpdplogger.h" -const TInt KMMMTPDummyFileArrayGranularity = 5; +const TInt KMmMtpDummyFileArrayGranularity = 5; -CMmMtpDpMetadataAccessWrapper* CMmMtpDpMetadataAccessWrapper::NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +CMmMtpDpMetadataAccessWrapper* CMmMtpDpMetadataAccessWrapper::NewL( MMTPDataProviderFramework& aFramework ) { - CMmMtpDpMetadataAccessWrapper* me = new (ELeave) CMmMtpDpMetadataAccessWrapper( aRfs, aFramework ); + CMmMtpDpMetadataAccessWrapper* me = new (ELeave) CMmMtpDpMetadataAccessWrapper( aFramework ); CleanupStack::PushL( me ); me->ConstructL(); CleanupStack::Pop( me ); @@ -42,10 +44,9 @@ return me; } -CMmMtpDpMetadataAccessWrapper::CMmMtpDpMetadataAccessWrapper( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) : - iRfs( aRfs ), - iFramework( aFramework ) +CMmMtpDpMetadataAccessWrapper::CMmMtpDpMetadataAccessWrapper( MMTPDataProviderFramework& aFramework ) : + iFramework( aFramework ), + iFs( aFramework.Fs() ) { // Do nothing } @@ -59,11 +60,11 @@ { PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::ConstructL" ) ); - iMmMtpDpMetadataMpxAccess = CMmMtpDpMetadataMpxAccess::NewL( iRfs, iFramework ); + iMmMtpDpMetadataMpxAccess = CMmMtpDpMetadataMpxAccess::NewL( iFs ); - iMmMtpDpMetadataVideoAccess = CMmMtpDpMetadataVideoAccess::NewL( iRfs ); + iMmMtpDpMetadataVideoAccess = CMmMtpDpMetadataVideoAccess::NewL( iFs ); - iAbstractMediaArray = new ( ELeave ) CDesCArrayFlat( KMMMTPDummyFileArrayGranularity ); + iAbstractMediaArray = new ( ELeave ) CDesCArrayFlat( KMmMtpDummyFileArrayGranularity ); // Create the PS key to notify subscribers that MTP mode is activated _LIT_SECURITY_POLICY_C1(KKeyReadPolicy, ECapabilityReadUserData); @@ -100,22 +101,24 @@ } // ----------------------------------------------------------------------------- -// CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL +// CMmMtpDpMetadataAccessWrapper::SetReferenceL // Set abstract media to DB // ----------------------------------------------------------------------------- // -EXPORT_C void CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL( const TDesC& aAbstractMediaFileName, - CDesCArray& aRefFileArray, - TMPXGeneralCategory aCategory ) +EXPORT_C void CMmMtpDpMetadataAccessWrapper::SetReferenceL( const CMTPObjectMetaData& aObject, + CDesCArray& aRefFileArray ) { - PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL aAbstractMediaFileName = %S" ), &aAbstractMediaFileName ); + TPtrC refOwner( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetReferenceL reference owner = %S" ), + &refOwner ); - if ( !MmMtpDpUtility::IsVideoL( aAbstractMediaFileName, iFramework ) ) + TMPXGeneralCategory category = Category( aObject ); + if ( category == EMPXPlaylist || category == EMPXAbstractAlbum ) { - iMmMtpDpMetadataMpxAccess->SetAbstractMediaL( aAbstractMediaFileName, aRefFileArray, aCategory ); + iMmMtpDpMetadataMpxAccess->SetReferenceL( refOwner, aRefFileArray, category ); } - PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetAbstractMediaL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetReferenceL" ) ); } // --------------------------------------------------------------------------- @@ -129,18 +132,53 @@ { PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) ); - TPtrC fullFileName( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) ); - if ( !MmMtpDpUtility::IsVideoL( fullFileName, iFramework ) ) + TMPXGeneralCategory category = Category( aObjectMetaData ); + switch ( category ) { - iMmMtpDpMetadataMpxAccess->GetObjectMetadataValueL( aPropCode, - aNewData, - aObjectMetaData ); - } - else - { - iMmMtpDpMetadataVideoAccess->GetObjectMetadataValueL( aPropCode, - aNewData, - aObjectMetaData ); + case EMPXAbstractAlbum: + if ( aPropCode == EMTPObjectPropCodeDateAdded && EMTPTypeString == aNewData.Type() ) + { + TBuf timeStr; + MmMtpDpUtility::GetObjectDateModifiedL( iFs, + aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ), + timeStr ); + PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr ); + + ( ( CMTPTypeString & ) aNewData ).SetL( timeStr ); + break; + } + // else + // get from mpx + case EMPXPlaylist: + case EMPXSong: + { + iMmMtpDpMetadataMpxAccess->GetObjectMetadataValueL( aPropCode, + aNewData, + aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ), + category ); + } + break; + case EMPXVideo: + if ( aPropCode == EMTPObjectPropCodeDateAdded && EMTPTypeString == aNewData.Type() ) + { + TBuf timeStr; + MmMtpDpUtility::GetObjectDateModifiedL( iFs, + aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ), + timeStr ); + PRINT1( _L( "MM MTP <> CGetObjectPropList::ServiceOneObjectPropertyL Date time %S" ), &timeStr ); + + ( ( CMTPTypeString & ) aNewData ).SetL( timeStr ); + } + else + { + iMmMtpDpMetadataVideoAccess->GetObjectMetadataValueL( aPropCode, + aNewData, + aObjectMetaData ); + } + break; + default: + // do nothing + break; } PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::GetObjectMetadataValueL" ) ); @@ -157,99 +195,90 @@ { PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) ); - // In SendObjectPropList, formatCode has already know, but object handle has not been committed into db - // In that case, format couldn't be get from object manager - TUint formatCode = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ); - TUint formatSubCode = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatSubCode ); - - TBool isVideo = EFalse; - isVideo = MmMtpDpUtility::IsVideoL( formatCode, formatSubCode ); - - if ( isVideo ) + TMPXGeneralCategory category = Category( aObjectMetaData ); + switch ( category ) { - iMmMtpDpMetadataVideoAccess->SetObjectMetadataValueL( aPropCode, - aNewData, - aObjectMetaData ); - } - else - { - iMmMtpDpMetadataMpxAccess->SetObjectMetadataValueL( aPropCode, - aNewData, - aObjectMetaData ); + case EMPXAbstractAlbum: + case EMPXSong: + case EMPXPlaylist: + iMmMtpDpMetadataMpxAccess->SetObjectMetadataValueL( aPropCode, + aNewData, + aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ), + category ); + break; + case EMPXVideo: + iMmMtpDpMetadataVideoAccess->SetObjectMetadataValueL( aPropCode, + aNewData, + aObjectMetaData ); + break; + default: + break; } PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL" ) ); } // --------------------------------------------------------------------------- -// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL +// CMmMtpDpMetadataAccessWrapper::RenameObjectL // Renames the file part of a record in the collection database // --------------------------------------------------------------------------- // -EXPORT_C void CMmMtpDpMetadataAccessWrapper::RenameObjectL( const TDesC& aOldFileName, +EXPORT_C void CMmMtpDpMetadataAccessWrapper::RenameObjectL( const CMTPObjectMetaData& aOldObject, const TDesC& aNewFileName ) { + TPtrC oldFileName( aOldObject.DesC( CMTPObjectMetaData::ESuid ) ); PRINT2( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RenameObjectL old = %S, new = %S" ), - &aOldFileName, + &oldFileName, &aNewFileName ); - if ( MmMtpDpUtility::IsVideoL( aOldFileName, iFramework ) ) - { - iMmMtpDpMetadataVideoAccess->RenameRecordL( aOldFileName, aNewFileName ); - } - else + TMPXGeneralCategory category = Category( aOldObject ); + switch ( category ) { - CMTPObjectMetaData* object = CMTPObjectMetaData::NewLC(); - iFramework.ObjectMgr().ObjectL( aOldFileName, *object ); - iMmMtpDpMetadataMpxAccess->RenameObjectL( aOldFileName, - aNewFileName, - object->Uint( CMTPObjectMetaData::EFormatCode ) ); - CleanupStack::PopAndDestroy( object ); + case EMPXSong: + case EMPXAbstractAlbum: + case EMPXPlaylist: + { + iMmMtpDpMetadataMpxAccess->RenameObjectL( oldFileName, + aNewFileName, + category ); + } + break; + case EMPXVideo: + iMmMtpDpMetadataVideoAccess->RenameRecordL( oldFileName, aNewFileName ); + break; + default: + break; } + PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RenameObjectL" ) ); } // --------------------------------------------------------------------------- -// CMmMtpDpMetadataAccessWrapper::SetObjectMetadataValueL +// CMmMtpDpMetadataAccessWrapper::DeleteObjectL // Deletes metadata information associated with the object // --------------------------------------------------------------------------- // -void CMmMtpDpMetadataAccessWrapper::DeleteObjectL( const TDesC& aFullFileName, - const TUint aFormatCode ) +void CMmMtpDpMetadataAccessWrapper::DeleteObjectL( const CMTPObjectMetaData& aObject ) { - PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::DeleteObjectL" ) ); - - TMPXGeneralCategory category = Category( aFormatCode ); + TPtrC fileName( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::DeleteObjectL name = %S" ), &fileName ); - // Have to do this. File might not be in file system anymore, have to - // reply on ObjectManager - if ( ( aFormatCode == EMTPFormatCodeMP4Container ) - || ( aFormatCode == EMTPFormatCode3GPContainer ) - || ( aFormatCode == EMTPFormatCodeASF ) ) - { - if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) ) - { - category = EMPXVideo; - } - else - { - category = EMPXSong; - } - } + TMPXGeneralCategory category = Category( aObject ); switch ( category ) { + case EMPXSong: + case EMPXAbstractAlbum: case EMPXPlaylist: - case EMPXSong: { - iMmMtpDpMetadataMpxAccess->DeleteObjectL( aFullFileName, category ); + iMmMtpDpMetadataMpxAccess->DeleteObjectL( fileName, category ); } break; case EMPXVideo: { - iMmMtpDpMetadataVideoAccess->DeleteRecordL( aFullFileName ); + iMmMtpDpMetadataVideoAccess->DeleteRecordL( fileName ); } break; @@ -275,19 +304,24 @@ PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::SetStorageRootL" ) ); } + // ----------------------------------------------------------------------------- // CMmMtpDpMetadataMpxAccess::SetImageObjPropL // set image specific properties specific to videos // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataAccessWrapper::SetImageObjPropL( const TDesC& aFullFileName, +void CMmMtpDpMetadataAccessWrapper::SetImageObjPropL( const CMTPObjectMetaData& aObject, const TUint32 aWidth, const TUint32 aHeight ) { - if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) ) + TMPXGeneralCategory category = Category( aObject ); + if ( category == EMPXVideo ) { - iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName ); - iMmMtpDpMetadataVideoAccess->SetImageObjPropL( aFullFileName, aWidth, aHeight ); + TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + iMmMtpDpMetadataVideoAccess->SetStorageRootL( fullFileName ); + iMmMtpDpMetadataVideoAccess->SetImageObjPropL( fullFileName, + aWidth, + aHeight ); } } @@ -296,16 +330,19 @@ // get image specific properties specific to videos // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataAccessWrapper::GetImageObjPropL( const TDesC& aFullFileName, +void CMmMtpDpMetadataAccessWrapper::GetImageObjPropL( const CMTPObjectMetaData& aObject, TUint32& aWidth, TUint32& aHeight ) { - if ( MmMtpDpUtility::IsVideoL( aFullFileName, iFramework ) ) + TMPXGeneralCategory category = Category( aObject ); + if ( category == EMPXVideo ) { - iMmMtpDpMetadataVideoAccess->SetStorageRootL( aFullFileName ); - iMmMtpDpMetadataVideoAccess->GetImageObjPropL( aFullFileName, aWidth, aHeight ); + TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + iMmMtpDpMetadataVideoAccess->SetStorageRootL( fullFileName ); + iMmMtpDpMetadataVideoAccess->GetImageObjPropL( fullFileName, aWidth, aHeight ); } } + // ----------------------------------------------------------------------------- // CMmMtpDpMetadataAccessWrapper::OpenSessionL // Called when the MTP session is initialised @@ -340,29 +377,61 @@ // Get category according format code // --------------------------------------------------------------------------- // -TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::Category( const TUint aFormatCode ) +TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::Category( const CMTPObjectMetaData& aObject ) { TMPXGeneralCategory category = EMPXNoCategory; - switch ( aFormatCode ) + TUint formatCode = aObject.Uint( CMTPObjectMetaData::EFormatCode ); + switch ( formatCode ) { + case EMTPFormatCodeASF: + case EMTPFormatCodeMP4Container: + case EMTPFormatCode3GPContainer: + { + TUint aSubFormatCode = aObject.Uint( CMTPObjectMetaData::EFormatSubCode ); + if ( aSubFormatCode == EMTPSubFormatCodeUnknown ) + { + category = ContainerCategory( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + if ( category == EMPXSong ) + aSubFormatCode = EMTPSubFormatCodeAudio; + else if ( category == EMPXVideo ) + aSubFormatCode = EMTPSubFormatCodeVideo; + else + aSubFormatCode = EMTPSubFormatCodeUndefine; + const_cast(aObject).SetUint( CMTPObjectMetaData::EFormatSubCode, aSubFormatCode ); + // If object doesn't exist, do nothing + TRAP_IGNORE( iFramework.ObjectMgr().ModifyObjectL( aObject ) ); + } + else if ( aSubFormatCode == EMTPSubFormatCodeAudio ) + category = EMPXSong; + else if ( aSubFormatCode == EMTPSubFormatCodeVideo ) + category = EMPXVideo; + else if( aSubFormatCode == EMTPSubFormatCodeUndefine ) + category = EMPXOther; + } + break; + case EMTPFormatCodeMP3: case EMTPFormatCodeWAV: case EMTPFormatCodeWMA: case EMTPFormatCodeAAC: - case EMTPFormatCodeASF: - case EMTPFormatCodeMP4Container: - case EMTPFormatCode3GPContainer: { category = EMPXSong; } break; + case EMTPFormatCodeM3UPlaylist: case EMTPFormatCodeAbstractAudioVideoPlaylist: { category = EMPXPlaylist; } break; + case EMTPFormatCodeAbstractAudioAlbum: + { + category = EMPXAbstractAlbum; + } + break; + case EMTPFormatCodeWMV: { category = EMPXVideo; @@ -372,6 +441,46 @@ default: break; } + PRINT1( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::Category category = %d" ), category ); + return category; + } + +TMPXGeneralCategory CMmMtpDpMetadataAccessWrapper::ContainerCategory( const TDesC& aFullFileName ) + { + PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::ContainerCategory aFullFileName = %S" ), &aFullFileName ); + + TMPXGeneralCategory category = EMPXNoCategory; + TParsePtrC pathParser( aFullFileName ); + TPtrC ext( pathParser.Ext() ); + + if ( ext.Length() <= 0 ) + category = EMPXOther; + + if ( ext.CompareF( KTxtExtensionMP4 ) == 0 + || ext.CompareF( KTxtExtension3GP ) == 0 + || ext.CompareF( KTxtExtension3G2 ) == 0 + || ext.CompareF( KTxtExtensionODF ) == 0 + || ext.CompareF( KTxtExtensionASF ) == 0 ) + { + HBufC8* mimetype = MmMtpDpUtility::ContainerMimeType( aFullFileName ); + if ( mimetype != NULL ) + { + TMmMtpSubFormatCode subFormatCode = MmMtpDpUtility::SubFormatCodeFromMime( *mimetype ); + + if ( subFormatCode == EMTPSubFormatCodeVideo ) + category = EMPXVideo; + else if( subFormatCode == EMTPSubFormatCodeAudio ) + category = EMPXSong; + else + category = EMPXOther; + } + } + else if ( ext.CompareF( KTxtExtensionO4V ) == 0 ) + category = EMPXVideo; + else + category = EMPXOther; + + PRINT1( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::ContainerCategory, category = %d" ), category ); return category; } @@ -409,38 +518,27 @@ // Add object (music, video, playlist and abstract media) info to DB // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataAccessWrapper::AddObjectL( const TDesC& aFullFileName, TUint aFormatCode, TUint aSubFormatCode ) +void CMmMtpDpMetadataAccessWrapper::AddObjectL( const CMTPObjectMetaData& aObject ) { - PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL aFullFileName = %S" ), &aFullFileName ); + PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL" ) ); + TMPXGeneralCategory category = Category( aObject ); - if ( aFullFileName.Length() <= 0 ) - { - User::Leave( KErrArgument ); - } - if ( MmMtpDpUtility::IsVideoL( aFormatCode, aSubFormatCode ) ) + TPtrC fullFileName( aObject.DesC( CMTPObjectMetaData::ESuid ) ); + if ( category == EMPXVideo ) { PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL Addvideo" ) ); - iMmMtpDpMetadataVideoAccess->AddVideoL( aFullFileName ); + iMmMtpDpMetadataVideoAccess->AddVideoL( fullFileName ); } - else + else if ( category == EMPXPlaylist || category == EMPXAbstractAlbum ) { - if ( aFormatCode == EMTPFormatCodeM3UPlaylist - || aFormatCode == EMTPFormatCodeMPLPlaylist - || aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist - || aFormatCode == EMTPFormatCodeAbstractAudioPlaylist - || aFormatCode == EMTPFormatCodeAbstractVideoPlaylist - || aFormatCode == EMTPFormatCodeASXPlaylist - || aFormatCode == EMTPFormatCodePLSPlaylist ) - { - PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddPlaylist" ) ); - iMmMtpDpMetadataMpxAccess->AddAbstractMediaL( aFullFileName, - EMPXPlaylist ); - } - else - { - PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddSong" ) ); - iMmMtpDpMetadataMpxAccess->AddSongL( aFullFileName ); - } + PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddPlaylist" ) ); + iMmMtpDpMetadataMpxAccess->AddAbstractMediaL( fullFileName, + category ); + } + else if ( category == EMPXSong ) + { + PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::AddObjectL AddSong" ) ); + iMmMtpDpMetadataMpxAccess->AddSongL( fullFileName ); } PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::AddObjectL" ) ); @@ -519,7 +617,7 @@ EMTPFormatCodeAbstractAudioVideoPlaylist ) { RFile newfile; - TInt err = newfile.Replace( iFramework.Fs(), aPlaylistName, EFileWrite ); + TInt err = newfile.Replace( iFs, aPlaylistName, EFileWrite ); if ( err != KErrNone ) { @@ -530,7 +628,7 @@ { err = newfile.Flush(); newfile.Close(); - err = iFramework.Fs().SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden, + err = iFs.SetAtt( aPlaylistName, KEntryAttSystem | KEntryAttHidden, KEntryAttReadOnly | KEntryAttNormal ); if ( err != KErrNone ) PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::CreateDummyFile Dummy Playlist file created. err = %d" ), err ); @@ -540,7 +638,7 @@ // ----------------------------------------------------------------------------- // CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles -// Remove all dummy file of which format is "pla", and leave the "m3u" +// Remove all dummy file of which format is "pla" and "alb", and leave the "m3u" // ----------------------------------------------------------------------------- // void CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles() @@ -548,24 +646,43 @@ PRINT( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) ); TInt count = iAbstractMediaArray->Count(); + PRINT1( _L( "MM MTP => CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, count = %d" ), count ); // Check if playlist file is a dummy file or an imported file for ( TInt i = 0; i < count; i++ ) { - if ( MmMtpDpUtility::FormatFromFilename( (*iAbstractMediaArray)[i] ) != - EMTPFormatCodeM3UPlaylist ) + TPtrC fileName( (*iAbstractMediaArray)[i] ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, fileName = %S" ), &fileName ); + + TMTPFormatCode format = MmMtpDpUtility::FormatFromFilename( fileName ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles, format = 0x%x" ), format ); + if ( format == EMTPFormatCodeAbstractAudioAlbum ) { - // delete the virtual playlist - // iFramework has release don't use iFramework.FS() - TInt err = iRfs.Delete( ( *iAbstractMediaArray )[i] ); + // delete the abstract album if its size is zero + TEntry entry; + TInt err = iFs.Entry( fileName, entry ); + if ( err == KErrNone && entry.iSize == 0 ) + { + TRAP( err, iMmMtpDpMetadataMpxAccess->DeleteObjectL( fileName, EMPXAbstractAlbum ) ); + if( err == KErrNone ) + { + err = iFs.Delete( fileName ); + } + } + PRINT3( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d, entry.iSize = %d" ), + &fileName, err, entry.iSize ); + } + else if ( format != EMTPFormatCodeM3UPlaylist ) + { + TInt err = iFs.Delete( fileName ); PRINT2( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile filename = %S, err %d" ), - &( (*iAbstractMediaArray)[i] ), + &fileName, err ); } else { // leave the Imported playlist in the file system - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &( (*iAbstractMediaArray)[i] ) ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataAccessWrapper::RemoveDummyFile, Don't delete m3u file [%S]" ), &fileName ); } } PRINT( _L( "MM MTP <= CMmMtpDpMetadataAccessWrapper::RemoveDummyFiles" ) ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatampxaccess.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include // from MPX #include @@ -44,15 +42,13 @@ #include "mmmtpdplogger.h" #include "mmmtpdputility.h" #include "tmmmtpdppanic.h" +#include "tobjectdescription.h" static const TInt KMtpInvalidSongID = 0x1FFFFFFF; static const TInt KMtpChannelMono = 1; static const TInt KMtpChannelStereo = 2; -static const TInt KMtpDateTimeStringLength = 15; -static const TInt KMtpMaxStringLength = 255; -static const TInt KMtpMaxDescriptionLength = 0x200; -_LIT( KMtpDateTimeFormat, "%F%Y%M%DT%H%T%S" ); + _LIT( KMtpDateTimeConnector, "T" ); _LIT( KEmptyText, "" ); @@ -73,10 +69,9 @@ _LIT( KMtpMpxPanic, "CMmMtpDpMetadataMpxAccess" ); #endif -CMmMtpDpMetadataMpxAccess* CMmMtpDpMetadataMpxAccess::NewL( RFs& aRfs, - MMTPDataProviderFramework& aFramework ) +CMmMtpDpMetadataMpxAccess* CMmMtpDpMetadataMpxAccess::NewL( RFs& aRfs ) { - CMmMtpDpMetadataMpxAccess* self = new(ELeave) CMmMtpDpMetadataMpxAccess( aRfs, aFramework ); + CMmMtpDpMetadataMpxAccess* self = new( ELeave ) CMmMtpDpMetadataMpxAccess( aRfs ); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); @@ -84,10 +79,8 @@ return self; } -CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs, - MMTPDataProviderFramework& aFramework ): - iRfs( aRfs ), - iFramework( aFramework ) +CMmMtpDpMetadataMpxAccess::CMmMtpDpMetadataMpxAccess( RFs& aRfs ): + iRfs( aRfs ) { // Do nothing } @@ -131,25 +124,18 @@ // void CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL( const TUint16 aPropCode, MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ) + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ) { PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - // File Path - HBufC* suid = aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ).AllocLC(); // + suid - TUint format = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ); - TMPXGeneralCategory category = ( format == EMTPFormatCodeAbstractAudioVideoPlaylist ) || - ( format == EMTPFormatCodeM3UPlaylist ) ? EMPXPlaylist : EMPXSong; - PERFLOGSTART( KMpxCollectionGetL ); - const CMPXMedia& media = CollectionHelperL()->GetL( *suid, category ); + const CMPXMedia& media = CollectionHelperL()->GetL( aFullFileName, aCategory ); PERFLOGSTOP( KMpxCollectionGetL ); - CleanupStack::PopAndDestroy( suid ); // - suid - TMPXAttributeData attrib( MpxAttribFromPropL( aPropCode ) ); TBool isSupported = media.IsSupported( attrib ); - PRINT1(_L( "MM MTP <> CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL isSupported = %d" ), isSupported); + PRINT1(_L( "MM MTP <> CMmMtpDpMetadataMpxAccess::GetObjectMetadataValueL isSupported = %d" ), isSupported ); if ( aPropCode != EMTPObjectPropCodeOriginalReleaseDate && aPropCode != EMTPObjectPropCodeDRMStatus @@ -206,7 +192,7 @@ case EMTPObjectPropCodeDateCreated: { TTime time( *media.Value ( attrib ) ); - TBuf timeStr; + TBuf timeStr; time.FormatL( timeStr, KMtpDateTimeFormat ); if ( EMTPTypeString == aNewData.Type() ) @@ -258,7 +244,7 @@ case EMTPObjectPropCodeOriginalReleaseDate: { // Compose DateTime string in format YYYYMMDDTHHMMSS - TBuf dateTime; + TBuf dateTime; dateTime.Zero(); // NOTE: Handled specially, shouldn't leave like other property, following S60 @@ -431,7 +417,6 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXGroup ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); searchMedia->SetTObjectValueL( aWMPMediaID, aFlag ); - searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray songAttributes; @@ -440,8 +425,7 @@ PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC searchMedia setup with no problems" ) ); - CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( - *searchMedia, + CMPXMedia* foundMedia = CollectionHelperL()->FindAllL( *searchMedia, songAttributes.Array() ); PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::FindWMPMediaLC foundMedia assigned from FindAllL" ) ); @@ -606,25 +590,14 @@ // void CMmMtpDpMetadataMpxAccess::RenameObjectL( const TDesC& aOldFileName, const TDesC& aNewFileName, - TUint aFormatCode ) + TMPXGeneralCategory aCategory ) { PRINT2( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::RenameObjectL aOldFileName = %S, aNewFileName = %S" ), &aOldFileName, &aNewFileName ); TInt err = KErrNone; - - if ( ( aFormatCode == EMTPFormatCodeAbstractAudioVideoPlaylist ) - || ( aFormatCode == EMTPFormatCodeM3UPlaylist ) ) - { - PRINT( _L( "MM MTP <> Playlist" ) ); - TRAP( err, CollectionHelperL()->RenameL( aOldFileName, aNewFileName, EMPXPlaylist ) ); - } - else // Not a playlist - { - PRINT( _L( "MM MTP <> Non-Playlist" ) ); - TRAP( err, CollectionHelperL()->RenameL( aOldFileName, aNewFileName, EMPXSong ) ); - } + TRAP( err, CollectionHelperL()->RenameL( aOldFileName, aNewFileName, aCategory ) ); if ( KErrNotFound == err ) { @@ -643,112 +616,35 @@ // ----------------------------------------------------------------------------- void CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL( const TUint16 aPropCode, const MMTPType& aNewData, - const TDesC& aSuid ) + const TDesC& aFullFileName, + TMPXGeneralCategory aCategory ) { - PRINT2( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x aSuid = %S" ), - aPropCode, - &aSuid ); - CMPXMedia* media = NULL; + PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - // Creat media properties for the song RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs + contentIDs.AppendL( KMPXMediaIdGeneral ); - contentIDs.AppendL( KMPXMediaIdAudio ); - contentIDs.AppendL( KMPXMediaIdMusic ); - contentIDs.AppendL( KMPXMediaIdMTP ); - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PopAndDestroy( &contentIDs ); // - contentIDs + if ( aCategory == EMPXSong ) + { + contentIDs.AppendL( KMPXMediaIdAudio ); + contentIDs.AppendL( KMPXMediaIdMusic ); + contentIDs.AppendL( KMPXMediaIdMTP ); + } + + CMPXMedia* media = CMPXMedia::NewL( contentIDs.Array() ); CleanupStack::PushL( media ); // + media - media->SetTObjectValueL( - KMPXMediaGeneralCategory, - EMPXSong ); + media->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); // MPXMedia default types media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - // Get file path - TParsePtrC parse( aSuid ); - media->SetTextValueL( KMPXMediaGeneralUri, aSuid ); + TParsePtrC parse( aFullFileName ); + media->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - TRAPD( err, SetMetadataValueL( aPropCode, aNewData, *media ) ); - - if ( err == KErrNone ) - { - SetStorageRootL( parse.Drive() ); - - // Update the song's metadata with the media object - PERFLOGSTART( KMpxCollectionSetL ); - CollectionHelperL()->SetL( media ); - PERFLOGSTOP( KMpxCollectionSetL ); - } - else - { - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL ERROR = %d" ), err ); - - User::Leave( err ); - } - - CleanupStack::PopAndDestroy( media ); // - media - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL" ) ); - } - -// ----------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL -// Updated object metadata in MPX database -// ----------------------------------------------------------------------------- -void CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL( const TUint16 aPropCode, - const MMTPType& aNewData, - const CMTPObjectMetaData& aObjectMetaData ) - { - PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL aPropCode = 0x%x" ), aPropCode ); - CMPXMedia* media = NULL; - - RArray contentIDs; - CleanupClosePushL( contentIDs ); // + contentIDs - - TUint format = aObjectMetaData.Uint( CMTPObjectMetaData::EFormatCode ); - if ( ( format == EMTPFormatCodeAbstractAudioVideoPlaylist ) - || ( format == EMTPFormatCodeM3UPlaylist ) ) - { - PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetObjectMetadataValueL format is abstract media" ) ); - contentIDs.AppendL( KMPXMediaIdGeneral ); - - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PushL( media ); // + media - - media->SetTObjectValueL( KMPXMediaGeneralCategory, - EMPXPlaylist ); - } - else - { - // Creat media properties for the song - contentIDs.AppendL( KMPXMediaIdGeneral ); - contentIDs.AppendL( KMPXMediaIdAudio ); - contentIDs.AppendL( KMPXMediaIdMusic ); - contentIDs.AppendL( KMPXMediaIdMTP ); - - media = CMPXMedia::NewL( contentIDs.Array() ); - CleanupStack::PushL( media ); // + media - - media->SetTObjectValueL( - KMPXMediaGeneralCategory, - EMPXSong ); - } - - // MPXMedia default types - media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - - // Get file path - HBufC* suid = aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ).AllocLC(); // + suid - TParsePtrC parse( *suid ); - media->SetTextValueL( KMPXMediaGeneralUri, *suid ); - media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - CleanupStack::PopAndDestroy( suid ); // - suid - PERFLOGSTART( KSetMetadataValue ); SetMetadataValueL( aPropCode, aNewData, *media ); PERFLOGSTOP( KSetMetadataValue ); @@ -842,10 +738,10 @@ MMTPType::CopyL( aNewData, *textData ); TBuf data; - data.Copy( textData->StringChars().Left( KMtpDateTimeStringLength ) ); + data.Copy( textData->StringChars().Left( KMtpMaxDateTimeStringLength ) ); PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL 0xDC99 date = %S" ), &data ); - if ( data.Length() < KMtpDateTimeStringLength ) + if ( data.Length() < KMtpMaxDateTimeStringLength ) { PRINT( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL 0xDC99 date string is too short" ) ); break; @@ -927,13 +823,16 @@ length ); if ( length != 0 ) { - TBuf text; - text.Zero(); + length = ( length < KMTPMaxDescriptionLen ) ? length : KMTPMaxDescriptionLen; + HBufC* text = HBufC::NewLC( length ); // + text + TPtr ptr = text->Des(); + for ( TUint i = 0; i < length; i++ ) - text.Append( desData->ElementUint( i ) ); + ptr.Append( desData->ElementUint( i ) ); PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL text = %S" ), - &text ); - aMediaProp.SetTextValueL( KMPXMediaGeneralComment, text ); + text ); + aMediaProp.SetTextValueL( KMPXMediaGeneralComment, *text ); + CleanupStack::PopAndDestroy( text ); // - text } else { @@ -952,6 +851,27 @@ } break; + case EMTPObjectPropCodeRepresentativeSampleData: + { + const CMTPTypeArray& mtpTypeArray = static_cast( aNewData ); + TUint32 numElements = mtpTypeArray.NumElements(); + const TDesC& suid = aMediaProp.ValueText( KMPXMediaGeneralUri ); + PRINT2( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL SampleData numElements = %d, suid = %S" ), numElements, &suid ); + + HBufC8* sampleData = HBufC8::NewLC( numElements * sizeof( TUint8 ) ); + TPtr8 samplePtr = sampleData->Des(); + mtpTypeArray.ToDes( samplePtr ); + RFile sampleFile; + CleanupClosePushL( sampleFile ); + User::LeaveIfError( sampleFile.Replace( iRfs, suid, EFileWrite ) ); + User::LeaveIfError( sampleFile.Write( samplePtr ) ); + CleanupStack::PopAndDestroy( &sampleFile ); + CleanupStack::PopAndDestroy( sampleData ); + aMediaProp.SetTObjectValueL( attrib, ETrue ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL SampleData is ready = %u" ), 1 ); + } + break; + default: { User::Leave( KErrNotSupported ); @@ -984,6 +904,7 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); searchMedia->SetTextValueL( KMPXMediaGeneralUri, aFullFileName ); + searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray songAttributes; CleanupClosePushL( songAttributes ); // + songAttributes @@ -1156,13 +1077,17 @@ TParsePtrC parse( aFullFileName ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); - if ( aCategory == EMPXPlaylist ) + if ( ( aCategory == EMPXPlaylist ) || ( aCategory == EMPXAbstractAlbum ) ) { media->SetTextValueL( KMPXMediaGeneralTitle, parse.Name() ); } media->SetTObjectValueL( KMPXMediaGeneralSynchronized, ETrue ); media->SetCObjectValueL( KMPXMediaArrayContents, abstractMediaArray ); media->SetTObjectValueL( KMPXMediaArrayCount, abstractMediaArray->Count() ); + if ( aCategory == EMPXAbstractAlbum ) + { + media->SetTObjectValueL( KMPXMediaMTPSampleDataFlag, EFalse ); + } PERFLOGSTART( KMpxCollectionAddL ); CollectionHelperL()->AddL( media ); @@ -1180,26 +1105,21 @@ } // ----------------------------------------------------------------------------- -// CMmMtpDpMetadataMpxAccess::SetAbstractMediaL +// CMmMtpDpMetadataMpxAccess::SetReferenceL // Set abstract media to DB // ----------------------------------------------------------------------------- // -void CMmMtpDpMetadataMpxAccess::SetAbstractMediaL( const TDesC& aAbstractMediaFileName, - CDesCArray& aRefFileArray, TMPXGeneralCategory aCategory ) +void CMmMtpDpMetadataMpxAccess::SetReferenceL( const TDesC& aRefOwnerName, + CDesCArray& aRefFileArray, + TMPXGeneralCategory aCategory ) { - PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetAbstractMediaL" ) ); + PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetReferenceL" ) ); CMPXMediaArray* abstractMediaArray = CMPXMediaArray::NewL(); CleanupStack::PushL( abstractMediaArray ); // + abstractMediaArray TUint count = aRefFileArray.Count(); for ( TUint j = 0; j < count; j++ ) { - // if the file is video, skip it and continue - if ( MmMtpDpUtility::IsVideoL( aRefFileArray[j], iFramework ) ) - { - continue; - } - // Creat media properties for the song RArray contentIDs; CleanupClosePushL( contentIDs ); // + contentIDs @@ -1217,10 +1137,10 @@ EMPXItem ); media->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXSong ); - // File Path - // + + media->SetTextValueL( KMPXMediaGeneralUri, aRefFileArray[j] ); + // TODO: need to confirm that should set drive letter or storage root path. TParsePtrC parse( aRefFileArray[j] ); - media->SetTextValueL( KMPXMediaGeneralUri, aRefFileArray[j] ); media->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); // Add media into array contents @@ -1238,12 +1158,9 @@ CleanupStack::PushL( abstractMedia ); // + abstractMedia abstractMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); - abstractMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); - - abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aAbstractMediaFileName ); - - TParsePtrC parse( aAbstractMediaFileName ); + abstractMedia->SetTextValueL( KMPXMediaGeneralUri, aRefOwnerName ); + TParsePtrC parse( aRefOwnerName ); abstractMedia->SetTextValueL( KMPXMediaGeneralDrive, parse.Drive() ); abstractMedia->SetTObjectValueL( KMPXMediaGeneralSynchronized, ETrue ); @@ -1257,11 +1174,9 @@ PERFLOGSTOP( KMpxCollectionSetReferenceL ); CleanupStack::PopAndDestroy( abstractMedia ); // - abstractMedia - - // Clear the array CleanupStack::PopAndDestroy( abstractMediaArray ); // - abstractMediaArray - PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetAbstractMediaL" ) ); + PRINT( _L( "MM MTP <= CMmMtpDpMetadataMpxAccess::SetReferenceL" ) ); } // --------------------------------------------------------------------------- @@ -1274,8 +1189,7 @@ PRINT1( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::SetStorageRoot aStoreRoot = %S" ), &aStorageRoot ); // get the drive number - TParse pathParser; - User::LeaveIfError( pathParser.Set( aStorageRoot, NULL, NULL ) ); + TParsePtrC pathParser( aStorageRoot ); TChar driveChar( pathParser.Drive()[0] ); TInt driveNumber; @@ -1312,8 +1226,8 @@ aMediaProp.SetTextValueL( KMPXMediaMusicGenre, KNullDesC ); // Composer aMediaProp.SetTextValueL( KMPXMediaMusicComposer, KNullDesC ); - // Album artFilename - aMediaProp.SetTextValueL( KMPXMediaMusicAlbumArtFileName, KNullDesC ); + // Album Artist + aMediaProp.SetTextValueL( KMPXMediaMusicAlbumArtist, KNullDesC ); // URL aMediaProp.SetTextValueL( KMPXMediaMusicURL, KNullDesC ); @@ -1358,7 +1272,8 @@ { EMTPObjectPropCodeAudioBitRate, KMPXMediaAudioBitrate }, { EMTPObjectPropCodeSampleRate, KMPXMediaAudioSamplerate }, { EMTPObjectPropCodeAudioWAVECodec, KMPXMediaAudioAudioCodec }, - { EMTPObjectPropCodeAlbumArtist, KMPXMediaMusicArtist } + { EMTPObjectPropCodeAlbumArtist, KMPXMediaMusicAlbumArtist }, + { EMTPObjectPropCodeRepresentativeSampleData,KMPXMediaMTPSampleDataFlag } }; TInt i = 0; @@ -1385,7 +1300,8 @@ // --------------------------------------------------------------------------- // void CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL( const TDesC& aStoreRoot, - CMPXMediaArray** aAbstractMedias, TMPXGeneralCategory aCategory ) + CMPXMediaArray** aAbstractMedias, + TMPXGeneralCategory aCategory ) { PRINT( _L( "MM MTP => CMmMtpDpMetadataMpxAccess::GetAllAbstractMediaL" ) ); @@ -1549,6 +1465,14 @@ } name = aAbstractMedia->ValueText( KMPXMediaGeneralUri ).AllocL(); } + else if ( aCategory == EMPXAbstractAlbum ) + { + if ( !aAbstractMedia->IsSupported( KMPXMediaGeneralTitle ) ) + { + User::Leave( KErrNotSupported ); + } + name = aAbstractMedia->ValueText( KMPXMediaGeneralTitle ).AllocL(); + } else { User::Leave( KErrNotSupported ); @@ -1638,6 +1562,7 @@ searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, EMPXPlaylist ); searchMedia->SetTextValueL( KMPXMediaGeneralUri, aSuid ); + searchMedia->SetTextValueL( KMPXMediaGeneralDrive, iStoreRoot ); RArray playlistAttributes; CleanupClosePushL( playlistAttributes ); // + playlistAttributes diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpmetadatavideoaccess.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -38,9 +38,8 @@ #include "mmmtpdputility.h" #include "tmmmtpdppanic.h" #include "mmmtpvideodbdefs.h" +#include "tobjectdescription.h" -static const TInt KMtpMaxStringLength = 255; -static const TInt KMtpMaxDescriptionLength = 0x200; const TInt KStorageRootMaxLength = 10; #ifdef _DEBUG @@ -304,10 +303,6 @@ formatBuf.Append( KMtpVideoParentalRatingType ); formatBuf.Append( KMtpVideoCommaSign ); - formatBuf.Append( KMtpVideoUseCount ); - formatBuf.Append( KMtpVideoUseCountType ); - formatBuf.Append( KMtpVideoCommaSign ); - formatBuf.Append( KMtpVideoDRM ); formatBuf.Append( KMtpVideoDRMType ); formatBuf.Append( KMtpVideoCommaSign ); @@ -663,9 +658,6 @@ num = iColSet->ColNo( KMtpVideoParentalRating ); iRecordSet.SetColL( num, KNullDesC ); - num = iColSet->ColNo( KMtpVideoUseCount ); - iRecordSet.SetColL( num, 0 ); - num = iColSet->ColNo( KMtpVideoDRM ); iRecordSet.SetColL( num, 0 ); } @@ -1007,22 +999,6 @@ } break; - case EMTPObjectPropCodeUseCount: - { - PRINT( _L( "MM MTP <> EMTPObjectPropCodeUseCount-MD" ) ); - num = iColSet->ColNo( KMtpVideoUseCount ); - uInt32 = iRecordSet.ColUint32( num ); - if ( EMTPTypeUINT32 == aNewData.Type() ) - { - ( ( TMTPTypeUint32 & ) aNewData ).Set( uInt32 ); - } - else - { - User::Leave( KErrArgument ); - } - } - break; - case EMTPObjectPropCodeDRMStatus: { PRINT( _L( "MM MTP <> EMTPObjectPropCodeDRMStatus-MD" ) ); @@ -1087,18 +1063,8 @@ // Get file path TPtrC suid( aObjectMetaData.DesC( CMTPObjectMetaData::ESuid ) ); - TParsePtrC parse( suid ); SetRecordL( suid, ERecordWrite ); - TRAPD( err, SetMetadataL( aPropCode, aNewData ) ); - - if ( err < KErrNone ) // EPOC error condition - { - PRINT1( _L( "MM MTP <> Metadata write failed, with error %d" ), err ); - SetRecordL( suid, EFailedWrite ); - } - - if ( err != KErrNone ) - User::Leave( err ); + SetMetadataL( aPropCode, aNewData ); PRINT( _L( "MM MTP <= CMmMtpDpMetadataVideoAccess::SetObjectMetadataValueL" ) ); } @@ -1150,18 +1116,21 @@ desData = CMTPTypeArray::NewLC( EMTPTypeAUINT16 ); // + desData MMTPType::CopyL( aNewData, *desData ); TUint length = desData->NumElements(); - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataVideoAccess::SetMetadataL length = %d" ), length ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL length = %d" ), + length ); if ( length != 0 ) { - TBuf text; - text.Zero(); + length = ( length < KMTPMaxDescriptionLen ) ? length : KMTPMaxDescriptionLen; + HBufC* text = HBufC::NewLC( length ); // + text + TPtr ptr = text->Des(); + for ( TUint i = 0; i < length; i++ ) - { - text.Append( desData->ElementUint( i ) ); - } - PRINT1( _L( "MM MTP <> CMmMtpDpMetadataVideoAccess::SetMetadataL text = %S" ), - &text ); - WriteLongTextL( KMtpVideoComment, text ); + ptr.Append( desData->ElementUint( i ) ); + PRINT1( _L( "MM MTP <> CMmMtpDpMetadataMpxAccess::SetMetadataValueL text = %S" ), + text ); + + WriteLongTextL( KMtpVideoComment, *text ); + CleanupStack::PopAndDestroy( text ); // - text } else { @@ -1182,7 +1151,6 @@ case EMTPObjectPropCodeVideoBitRate: case EMTPObjectPropCodeFramesPerThousandSeconds: case EMTPObjectPropCodeKeyFrameDistance: - case EMTPObjectPropCodeUseCount: { if ( EMTPTypeUINT32 != aNewData.Type() ) { @@ -1507,7 +1475,6 @@ { EMTPObjectPropCodeScanType, KMtpVideoScanType }, { EMTPObjectPropCodeEncodingProfile, KMtpVideoEncodingProfile }, { EMTPObjectPropCodeParentalRating, KMtpVideoParentalRating }, - { EMTPObjectPropCodeUseCount, KMtpVideoUseCount }, { EMTPObjectPropCodeAudioWAVECodec, KMtpVideoAudioCodec }, { EMTPObjectPropCodeDRMStatus, KMtpVideoDRM }, }; @@ -1533,8 +1500,7 @@ PRINT1( _L( "MM MTP => CMmMtpDpMetadataVideoAccess::SetStorageRoot aStoreRoot = %S" ), &aStorageRoot ); // get the drive number - TParse pathParser; - User::LeaveIfError( pathParser.Set( aStorageRoot, NULL, NULL ) ); + TParsePtrC pathParser( aStorageRoot ); TChar driveChar( pathParser.Drive()[0] ); User::LeaveIfError( RFs::CharToDrive( driveChar, iStoreNum ) ); diff -r 835a21e50645 -r 37df1c05d427 mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp --- a/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappcomponents/mmmtpdataprovider/src/mmmtpdputility.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -45,6 +45,9 @@ _LIT( KHxMimeTypeWma, "audio/x-hx-wma" ); _LIT( KHxMimeTypeWmv, "video/x-hx-wmv" ); +const TInt KMaxRenameTimes = 10; +const TInt KRenameThreshold = 100 * 1000; // (100 millisec) + // ----------------------------------------------------------------------------- // MmMtpDpUtility::FormatFromFilename // Utility function to get the type of an object from the filename @@ -61,6 +64,9 @@ TParsePtrC file( aFullFileName ); + if ( !file.ExtPresent() ) + return EMTPFormatCodeUndefined; + // need to do it in popularity of format, to optmize performance if ( file.Ext().CompareF( KTxtExtensionMP3 ) == 0 ) return EMTPFormatCodeMP3; @@ -75,6 +81,7 @@ return EMTPFormatCodeMP4Container; if ( ( file.Ext().CompareF( KTxtExtension3GP ) == 0 ) + || ( file.Ext().CompareF( KTxtExtension3G2 ) == 0 ) || ( file.Ext().CompareF( KTxtExtensionO4A ) == 0 ) || ( file.Ext().CompareF( KTxtExtensionO4V ) == 0 ) ) return EMTPFormatCode3GPContainer; @@ -116,6 +123,9 @@ } } + if ( file.Ext().CompareF( KTxtExtensionALB ) == 0 ) + return EMTPFormatCodeAbstractAudioAlbum; + if (( file.Ext().CompareF( KTxtExtensionPLA ) == 0 ) || ( file.Ext().CompareF( KTxtExtensionVIR ) == 0 ) ) return EMTPFormatCodeAbstractAudioVideoPlaylist; @@ -163,117 +173,6 @@ } // ----------------------------------------------------------------------------- -// MmMtpDpUtility::IsVideoL (Slow Version) -// Utility function to determine whether a format is Video or not -// ----------------------------------------------------------------------------- -// -EXPORT_C TBool MmMtpDpUtility::IsVideoL( const TDesC& aFullFileName ) - { - PRINT1( _L( "MM MTP => MmMtpDpUtility::IsVideoL (Slow Version) aFullFileName = %S" ), &aFullFileName ); - - TParse pathParser; - User::LeaveIfError( pathParser.Set( aFullFileName, NULL, NULL ) ); - - TPtrC ext( pathParser.Ext() ); - - if ( ext.Length() <= 0 ) - { - PRINT( _L( "MM MTP <> MmMtpDpUtility::IsVideoL ext len <= 0, return false" ) ); - return EFalse; - } - - // move WMV early to optmize comparison - if ( ext.CompareF( KTxtExtensionWMV ) == 0 ) - { - return ETrue; - } - else if ( ext.CompareF( KTxtExtensionMP4 ) == 0 - || ext.CompareF( KTxtExtension3GP ) == 0 - || ext.CompareF( KTxtExtensionODF ) == 0 - || ext.CompareF( KTxtExtensionASF ) == 0 ) - { - HBufC8* mimetype = ContainerMimeType( aFullFileName ); - User::LeaveIfNull( mimetype ); - - CleanupStack::PushL( mimetype ); // + mimetype - - TMmMtpSubFormatCode subFormatCode; - - User::LeaveIfError( SubFormatCodeFromMime( *mimetype, subFormatCode ) ); - CleanupStack::PopAndDestroy( mimetype ); // - mimetype - - if ( subFormatCode == EMTPSubFormatCodeVideo ) - { - return ETrue; - } - else - { - return EFalse; - } - } - else if ( ext.CompareF( KTxtExtensionO4V ) == 0 ) - return ETrue; - - // other format, as audio - return EFalse; - } - -// ----------------------------------------------------------------------------- -// MmMtpDpUtility::IsVideoL (Fast Version) -// Utility function to determine whether a format is Video or not -// ----------------------------------------------------------------------------- -// -TBool MmMtpDpUtility::IsVideoL( const TDesC& aFullFileName, - const MMTPDataProviderFramework& aFramework ) - { - PRINT1( _L( "MM MTP => MmMtpDpUtility::IsVideoL (Fast Version) aFullFileName = %S" ), &aFullFileName ); - - CMTPObjectMetaData* info = CMTPObjectMetaData::NewLC(); // + info - aFramework.ObjectMgr().ObjectL( aFullFileName, *info ); - - TUint formatCode = info->Uint( CMTPObjectMetaData::EFormatCode ); - TUint subFormatCode = info->Uint( CMTPObjectMetaData::EFormatSubCode ); - - CleanupStack::PopAndDestroy( info ); // - info - - return MmMtpDpUtility::IsVideoL( formatCode, subFormatCode ); - } - -// ----------------------------------------------------------------------------- -// MmMtpDpUtility::IsVideoL (Fast Version) -// Utility function to determine whether a format is Video or not -// ----------------------------------------------------------------------------- -// -TBool MmMtpDpUtility::IsVideoL( TUint aFormatCode, TUint aSubFormatCode ) - { - if ( aFormatCode == KMTPFormatsAll ) - User::Leave( KErrArgument ); - - if ( aFormatCode == EMTPFormatCodeWMV ) - { - return ETrue; - } - else if ( ( aFormatCode == EMTPFormatCodeMP4Container ) - || ( aFormatCode == EMTPFormatCode3GPContainer ) - || ( aFormatCode == EMTPFormatCodeASF ) ) - { - if ( aSubFormatCode == EMTPSubFormatCodeAudio ) - { - return EFalse; - } - else if ( aSubFormatCode == EMTPSubFormatCodeVideo ) - { - return ETrue; - } - } - - PRINT( _L( "MM MTP <= MmMtpDpUtility::IsVideoL (Fast Version)" ) ); - - // other format, as audio - return EFalse; - } - -// ----------------------------------------------------------------------------- // MmMtpDpUtility::ValidateFilename // Check the filename to see if it exceeds Symbian 256 limit. // ----------------------------------------------------------------------------- @@ -309,16 +208,14 @@ // Get the file date modified. // ----------------------------------------------------------------------------- // -TTime MmMtpDpUtility::GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName ) +void MmMtpDpUtility::GetObjectDateModifiedL( RFs& aFs, const TDesC& aFullFileName, TDes& aDateModified ) { - TTime dataModified; + TTime date; TEntry fileInfo; // Shouldn't leave User::LeaveIfError( aFs.Entry( aFullFileName, fileInfo ) ); - - dataModified = fileInfo.iModified; - - return dataModified; + date = fileInfo.iModified; + date.FormatL( aDateModified, KMtpDateTimeFormat ); } // ----------------------------------------------------------------------------- @@ -350,7 +247,7 @@ // Check if property type match datatype. // ----------------------------------------------------------------------------- // -TMTPResponseCode MmMtpDpUtility::CheckPropType(TUint16 aPropertyCode, TUint16 aDataType) +TMTPResponseCode MmMtpDpUtility::CheckPropType( TUint16 aPropertyCode, TUint16 aDataType ) { PRINT2( _L( "MM MTP => MmMtpDpUtility::CheckPropCode aPropertyCode = 0x%x, aDataType = 0x%x" ), aPropertyCode, @@ -370,6 +267,10 @@ case EMTPObjectPropCodeDateModified: case EMTPObjectPropCodeDateAdded: case EMTPObjectPropCodeVideoBitRate: + case EMTPObjectPropCodeRepresentativeSampleFormat: + case EMTPObjectPropCodeRepresentativeSampleSize: + case EMTPObjectPropCodeRepresentativeSampleHeight: + case EMTPObjectPropCodeRepresentativeSampleWidth: { responseCode = EMTPRespCodeAccessDenied; } @@ -385,6 +286,7 @@ case EMTPObjectPropCodeOriginalReleaseDate: // 0xDC99 case EMTPObjectPropCodeAlbumName: // 0xDC9A case EMTPObjectPropCodeEncodingProfile: // 0xDEA1 + case EMTPObjectPropCodeAlbumArtist: // 0xDC9B { if ( aDataType != EMTPTypeString ) { @@ -406,7 +308,6 @@ case EMTPObjectPropCodeWidth: // 0xDC87 case EMTPObjectPropCodeHeight: // 0xDC88 case EMTPObjectPropCodeDuration: // 0xDC89 - case EMTPObjectPropCodeUseCount: // 0xDC91 case EMTPObjectPropCodeSampleRate: // 0xDE93 case EMTPObjectPropCodeAudioWAVECodec: // 0xDE99 case EMTPObjectPropCodeAudioBitRate: // 0xDE9A @@ -445,6 +346,15 @@ } break; + case EMTPObjectPropCodeRepresentativeSampleData: + { + if ( aDataType != EMTPTypeAUINT8 ) + { + responseCode = EMTPRespCodeInvalidObjectPropFormat; + } + } + break; + default: { responseCode = EMTPRespCodeInvalidObjectPropCode; @@ -479,7 +389,27 @@ aNewName.Insert( 0, ptr ); } - return aFs.Rename( aFullFileName, aNewName ); + TInt ret = KErrNone; + // Some other component might be holding on to the file (MDS background harvesting), + // try again after 100 millisec, up to 10 times, before give up + TInt count = KMaxRenameTimes; + while ( count > 0 ) + { + ret = aFs.Rename( aFullFileName, aNewName ); + if ( ( ret == KErrInUse ) && ( count > 1 ) ) + { + User::After( KRenameThreshold ); + count--; + } + else + { + break; + } + } + + PRINT1( _L( "MM MTP <> MmMtpDpUtility::UpdateObjectFileName, ret = %d" ), ret ); + + return ret; } // ----------------------------------------------------------------------------- @@ -492,13 +422,7 @@ PRINT( _L( "MM MTP => MmMtpDpUtility::ContainerMimeType" ) ); // parse the file path - TParse pathParser; - TInt retCode = pathParser.Set( aFullPath, NULL, NULL ); - if ( retCode != KErrNone ) - { - PRINT( _L( "MM MTP <> MmMtpDpUtility::ContainerMimeType parse path failed" ) ); - return NULL; - } + TParsePtrC pathParser( aFullPath ); // get the extension of file TPtrC ext( pathParser.Ext() ); @@ -513,14 +437,15 @@ // MP4/3GP if ( ext.CompareF( KTxtExtensionMP4 ) == 0 - || ext.CompareF( KTxtExtension3GP ) == 0 ) + || ext.CompareF( KTxtExtension3GP ) == 0 + || ext.CompareF( KTxtExtension3G2 ) == 0 ) { TRAP( err, mimebuf = Mp4MimeTypeL( aFullPath ) ); PRINT1( _L("MM MTP <> MmMtpDpUtility::ContainerMimeType, Mp4MimeTypeL err = %d"), err ); } else if ( ext.CompareF( KTxtExtensionODF ) == 0 ) { - TRAP( err, mimebuf = Mp4MimeTypeL( aFullPath ) ); + TRAP( err, mimebuf = OdfMimeTypeL( aFullPath ) ); PRINT1( _L("MM MTP <> MmMtpDpUtility::ContainerMimeType, OdfMimeTypeL err = %d"), err ); } #ifdef __WINDOWS_MEDIA @@ -547,7 +472,8 @@ TParsePtrC file( aFullPath ); if ( file.Ext().CompareF( KTxtExtensionMP4 ) == 0 - || file.Ext().CompareF( KTxtExtension3GP ) == 0 ) + || file.Ext().CompareF( KTxtExtension3GP ) == 0 + || file.Ext().CompareF( KTxtExtension3G2 ) == 0 ) { // get mime from file MP4Handle mp4Handle = NULL; @@ -583,7 +509,8 @@ if ( mp4err == MP4_OK ) { - if ( file.Ext().CompareF( KTxtExtension3GP ) == 0 ) + if ( file.Ext().CompareF( KTxtExtension3GP ) == 0 + || file.Ext().CompareF( KTxtExtension3G2 ) == 0 ) { mimebuf = KMimeTypeAudio3gpp().Alloc(); } @@ -596,7 +523,8 @@ // is video file else if ( mp4err == MP4_OK ) { - if ( file.Ext().CompareF( KTxtExtension3GP ) == 0 ) + if ( file.Ext().CompareF( KTxtExtension3GP ) == 0 + || file.Ext().CompareF( KTxtExtension3G2 ) == 0 ) { mimebuf = KMimeTypeVideo3gpp().Alloc(); } @@ -688,7 +616,7 @@ // HBufC8* MmMtpDpUtility::AsfMimeTypeL( const TDesC& aFullPath ) { - PRINT( _L( "MM MTP => MmMtpDpUtility::AsfMimeTypeL" ) ); + PRINT1( _L( "MM MTP => MmMtpDpUtility::AsfMimeTypeL, aFullPath = %S" ), &aFullPath ); HBufC8* mimebuf = NULL; @@ -701,6 +629,7 @@ CleanupStack::PushL( hxUtility ); hxUtility->OpenFileL( aFullPath ); + PRINT( _L( "MM MTP <> MmMtpDpUtility::AsfMimeTypeL OpenFileL" ) ); HXMetaDataKeys::EHXMetaDataId id; TUint count = 0; @@ -761,11 +690,12 @@ // Get subformat code from mime string // ----------------------------------------------------------------------------- // -TInt MmMtpDpUtility::SubFormatCodeFromMime( const TDesC8& aMimeType, - TMmMtpSubFormatCode& aSubFormatCode ) +TMmMtpSubFormatCode MmMtpDpUtility::SubFormatCodeFromMime( const TDesC8& aMimeType ) { PRINT( _L( "MM MTP => MmMtpDpUtility::SubFormatCodeFromMime" ) ); + TMmMtpSubFormatCode subFormatCode = EMTPSubFormatCodeUnknown; + if ( aMimeType.CompareF( KMimeTypeVideoMp4 ) == 0 || aMimeType.CompareF( KMimeTypeVideo3gpp ) == 0 #ifdef __WINDOWS_MEDIA @@ -773,7 +703,7 @@ #endif ) { - aSubFormatCode = EMTPSubFormatCodeVideo; + subFormatCode = EMTPSubFormatCodeVideo; } else if ( aMimeType.CompareF( KMimeTypeAudioMp4 ) == 0 || aMimeType.CompareF( KMimeTypeAudio3gpp ) == 0 @@ -782,16 +712,17 @@ #endif ) { - aSubFormatCode = EMTPSubFormatCodeAudio; + subFormatCode = EMTPSubFormatCodeAudio; } else { PRINT( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime format not supported" ) ); - return KErrNotFound; + subFormatCode = EMTPSubFormatCodeUndefine; } - PRINT( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime" ) ); - return KErrNone; + PRINT1( _L( "MM MTP <= MmMtpDpUtility::SubFormatCodeFromMime SubFormatCode = %d" ), subFormatCode ); + + return subFormatCode; } // ----------------------------------------------------------------------------- diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h --- a/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/inc/CollectionHelperTestClass.h Fri Apr 02 16:24:05 2010 +0100 @@ -73,6 +73,28 @@ _LIT( KRenameOldUri, "c:\\Blackbird.aac"); _LIT( KRenameNewUri, "c:\\data\\Blackbird.aac"); +_LIT( KFileWmaSong, "f:\\1.wma"); + +_LIT( KFile1, "e:\\data\\sounds\\digital\\1.mp3"); //ok +_LIT( KOldAbstractAlbumName, "1.wma"); //ok +_LIT( KNewAbstractAlbumName, "The 99 Most Essential Beethoven MasterpiecesVarious Artists"); //ok +_LIT( KFile3, "e:\\data\\sounds\\digital\\(01) Amber - Yes.mp3"); //ok +_LIT( KFilet, "e:\\data\\sounds\\digital\\02 What A Wonderful World.mp3"); //ok + + +_LIT( KTestFile3, "e:\\data\\sounds\\digital\\Atomic Kitten - It's Ok.mp3"); //ok +_LIT( KSongtest, "e:\\data\\sounds\\digital\\02 What A Wonderful World.mp3"); //ok + +_LIT( KAbstractalbum1, "f:\\1.alb"); +_LIT( KAbstractalbum2, "f:\\2.alb"); +_LIT( KAbstractalbum3, "f:\\3.alb"); +_LIT( KStoreRoot, "f:\\"); + +_LIT( KAbstractAlbumName, "The 99 Most Essential Beethoven MasterpiecesVarious Artists"); + +_LIT( KAlbumArtistShort, "testAlbumArtist"); + + // FORWARD DECLARATIONS class CCollectionHelperTestClass; @@ -300,7 +322,6 @@ TInt SetAllowedPanic( CStifItemParser& aItem ); void CreateTestMediaL( CMPXMedia*& aNewProperty ); - /** * Connect to the default client to the server * @since S60 3.2 @@ -316,8 +337,21 @@ virtual TInt CloseUiHelperL(CStifItemParser& aItem); virtual TInt CloseHelperL(CStifItemParser& aItem); virtual TInt CloseCachedHelperL(CStifItemParser& aItem); - + virtual TInt AddSongL(CStifItemParser& aItem); + TInt FindMediaL(const TDesC& aPath, TMPXGeneralCategory aCategory); + virtual TInt RemoveSongL(CStifItemParser& aItem ); + virtual TInt AddAbstractAlbumL(CStifItemParser& aItem); + virtual TInt RemoveAbstractAlbumL(CStifItemParser& aItem); + virtual TInt SetAbstractAlbumL(CStifItemParser& aItem); + virtual TInt SetSongAlbumArtistL(CStifItemParser& aItem); + virtual TInt GetSongAlbumArtistL(CStifItemParser& aItem); + virtual TInt SetAbstractAlbumArtistL(CStifItemParser& aItem); + virtual TInt GetAbstractAlbumArtistL(CStifItemParser& aItem); + virtual TInt UpdateAbstractAlbumNameL(CStifItemParser& aItem); + virtual TInt GetAbstractAlbumAndSongsL(CStifItemParser& aItem); + virtual TInt RenameAbstractAlbumL(CStifItemParser& aItem); + void AttachSongsL(CMPXMediaArray* aAbstractalbumArray, const TDesC& aPath); /** * From MMPXCollectionRemoveObserver * Handles removing a collection path @@ -339,7 +373,8 @@ * @param aError error code */ void HandleFindAllL(const CMPXMedia& aResults, TBool aComplete,TInt aError); - + + public: // Data protected: // Data diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp --- a/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/collection_helper_api/tsrc/CollectionHelperTestClass/src/CollectionHelperTestClassBlocks.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -30,6 +30,7 @@ #include #include #include "debug.h" +#include // EXTERNAL DATA STRUCTURES //extern ?external_data; @@ -134,10 +135,22 @@ ENTRY( "NewUiHelper", CCollectionHelperTestClass::NewUiHelperL ), ENTRY( "NewHelper", CCollectionHelperTestClass::NewHelperL ), ENTRY( "NewCachedHelper", CCollectionHelperTestClass::NewCachedHelperL ), + ENTRY( "AddSong", CCollectionHelperTestClass::AddSongL ), + ENTRY( "RemoveSong", CCollectionHelperTestClass::RemoveSongL ), + ENTRY( "AddAbstractAlbum", CCollectionHelperTestClass::AddAbstractAlbumL ), + ENTRY( "RemoveAbstractAlbum", CCollectionHelperTestClass::RemoveAbstractAlbumL ), + ENTRY( "SetAbstractAlbum", CCollectionHelperTestClass::SetAbstractAlbumL ), + ENTRY( "SetSongAlbumArtist", CCollectionHelperTestClass::SetSongAlbumArtistL ), + ENTRY( "GetSongAlbumArtist", CCollectionHelperTestClass::GetSongAlbumArtistL ), +ENTRY( "SetAbstractAlbumArtist", CCollectionHelperTestClass::SetAbstractAlbumArtistL ), +ENTRY( "GetAbstractAlbumArtist", CCollectionHelperTestClass::GetAbstractAlbumArtistL ), +ENTRY( "UpdateAbstractAlbumName", CCollectionHelperTestClass::UpdateAbstractAlbumNameL ), + ENTRY("GetAbstractAlbumAndSongs",CCollectionHelperTestClass::GetAbstractAlbumAndSongsL), + ENTRY( "RenameAbstractAlbum", CCollectionHelperTestClass::RenameAbstractAlbumL ), ENTRY( "CloseUiHelper", CCollectionHelperTestClass::CloseUiHelperL ), ENTRY( "CloseHelper", CCollectionHelperTestClass::CloseHelperL ), ENTRY( "CloseCachedHelper", CCollectionHelperTestClass::CloseCachedHelperL ), - }; + }; const TInt count = sizeof( KFunctions ) / sizeof( TStifFunctionInfo ); @@ -511,6 +524,640 @@ return result; } + + +//Removing song from collection +//By calling CMPXCollectionCachedHelper API RemoveL +TInt CCollectionHelperTestClass::RemoveSongL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::RemoveSongL"))); + TRAPD(result, iCachedHelper->RemoveL(KFileWmaSong, EMPXSong)); + iLog->Log(_L("CCollectionHelperTestClass::RemoveSong done with result=[%d]"), result); + return result; + } + +//Removing AbstractAlbum from collection +//By calling CMPXCollectionCachedHelper API RemoveL +//precondition: e:\\data\\sounds\\digital\\1.alb on test HW +//output: 1.alb is delete from MPX DB +TInt CCollectionHelperTestClass::RemoveAbstractAlbumL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::RemoveAbstractAlbumL"))); + TRAPD(result, iCachedHelper->RemoveL(KAbstractalbum1, EMPXAbstractAlbum)); + iLog->Log(_L("CCollectionHelperTestClass::RemoveAbstractAlbumL done with result=[%d]"), result); + return result; + } +//Adds song to the database +//WMP to MTP step1 +//By calling CMPXCollectionCachedHelper API AddL +//precondition: c:\\data\\sounds\\digital\\1.wma on test emulator +//precondition: e:\\data\\sounds\\digital\\1.wma on test HW +//output: 1.wma is added into MPX DB +TInt CCollectionHelperTestClass::AddSongL(CStifItemParser& /*aItem*/ ) + { + FTRACE(FPrint(_L("CCollectionHelperTest::AddSongL"))); + //Does a record already exist for this abstractalbum? + //this is the part to check if the song already exist in db? + TInt result; + TPtrC name(KFileWmaSong); + TInt mediafound = FindMediaL(name, EMPXSong); + + //media already in collection DB, no need to add + if (mediafound == 1) + { + return 0; + } + + else if (mediafound == 0) //media not in collection DB, continue to add*/ + { + // Create media properties for the song will added + iLog->Log(_L("Create media properties")); + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + contentIDs.AppendL(KMPXMediaIdAudio); + contentIDs.AppendL(KMPXMediaIdMusic); + contentIDs.AppendL(KMPXMediaIdMTP); + + CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(media); + contentIDs.Close(); + + // MPXMedia default types + media->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + media->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong); + + // File Path + TParsePtrC parse(name); + + media->SetTextValueL(KMPXMediaGeneralUri, name); + media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive()); + + // Title + media->SetTextValueL(KMPXMediaGeneralTitle, parse.NameAndExt()); + // Comment + media->SetTextValueL(KMPXMediaGeneralComment, KNullDesC); + // Artist + media->SetTextValueL(KMPXMediaMusicArtist, KNullDesC); + // Album + media->SetTextValueL(KMPXMediaMusicAlbum, KNullDesC); + //AlbumArtist + media->SetTextValueL(KMPXMediaMusicAlbumArtist, KAlbumArtistShort); + // Track + media->SetTextValueL(KMPXMediaMusicAlbumTrack, KNullDesC); + // Genre + media->SetTextValueL(KMPXMediaMusicGenre, KNullDesC); + // Composer + media->SetTextValueL(KMPXMediaMusicComposer, KNullDesC); + // URL + media->SetTextValueL(KMPXMediaMusicURL, KNullDesC); + iLog->Log(_L("Default values set to Media")); + + // Update MPX WMP Roundtrip Metadata of the media object + media->SetTObjectValueL(KMPXMediaGeneralDeleted, EFalse); + media->SetTObjectValueL(KMPXMediaGeneralModified, EFalse); + media->SetTObjectValueL(KMPXMediaGeneralSynchronized, ETrue); + + media->SetTObjectValueL(KMPXMediaGeneralFlags, KMPXMediaGeneralFlagsIsInvalid|KMPXMediaGeneralFlagsIsCorrupted); + + // Add new media to collection + TRAP(result, iCachedHelper->AddL(media)); + FTRACE(FPrint(_L("CCollectionHelperTestClass::AddSongL, Media added into collection"))); + + CleanupStack::PopAndDestroy(media); + } + iLog->Log(_L("CCollectionHelperTestClass::AddSongL done with result=[%d]"), result); + + return result; + } + +//Adds abstractalbum to the database, *.alb file +//WMP to MTP step2 +//By calling CMPXCollectionCachedHelper API AddL +//precondition: c:\\data\\sounds\\digital\\1.alb on test emulator +//precondition: e:\\data\\sounds\\digital\\1.alb on test HW +//output: 1.alb is added into MPX DB +TInt CCollectionHelperTestClass::AddAbstractAlbumL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTestClass::AddAbstractAlbumL"))); + TInt result; + TPtrC name(KAbstractalbum1); + TInt mediafound = FindMediaL(name, EMPXAbstractAlbum); + + //media already in collection DB, no need to add + if (mediafound == 1) + { + return 0; + } + + else if(mediafound == 0) // media not in collection DB, continue to add*/ + { + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMediaArray* abstractalbumArray = CMPXMediaArray::NewL(); + CleanupStack::PushL(abstractalbumArray); + + CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(media); + contentIDs.Close(); + + // MPXMedia default types + media->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + //EMPXAbstractAlbum is the new category added for non-embedded art + media->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum); + + // File Path + media->SetTextValueL(KMPXMediaGeneralUri, name); + TParsePtrC parse(name); + media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive()); + media->SetTextValueL(KMPXMediaGeneralTitle, parse.Name()); + + //AlbumArtist + media->SetTextValueL(KMPXMediaMusicAlbumArtist, KAlbumArtistShort); + media->SetTObjectValueL(KMPXMediaGeneralSynchronized, ETrue); + media->SetTObjectValueL( KMPXMediaMTPSampleDataFlag, EFalse ); + media->SetCObjectValueL(KMPXMediaArrayContents, abstractalbumArray); + media->SetTObjectValueL(KMPXMediaArrayCount, abstractalbumArray->Count()); + + // Add new media to collection + TRAP( result, iCachedHelper->AddL(media)); + CleanupStack::PopAndDestroy(media); + + // Clear the array + CleanupStack::PopAndDestroy(abstractalbumArray); + } + iLog->Log(_L("CCollectionHelperTestClass::AddAbstractAlbumL done with result=[%d]"), result); + return result; + } + +//Associate abstractalbum with songs +//WMP to MTP step3 +//By calling CMPXCollectionCachedHelper API SetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.wma +// c:\\data\\sounds\\digital\\1.alb +//precondition on HW : f:\\1.wma +// f:\\1.alb +//output: 1.wma and 1.alb is associated +TInt CCollectionHelperTestClass::SetAbstractAlbumL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::SetAbstractAlbumL"))); + + CMPXMediaArray* mediaArray = CMPXMediaArray::NewL(); + CleanupStack::PushL(mediaArray); + //add songs to media array + AttachSongsL(mediaArray, KFileWmaSong()); + iLog->Log(_L("song added to abstractalbumArray, mediaArray->Count()=%d"), mediaArray->Count() ); + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* abstractalbumMedia = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(abstractalbumMedia); + contentIDs.Close(); + + abstractalbumMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + abstractalbumMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum); + + abstractalbumMedia->SetTextValueL(KMPXMediaGeneralUri, KAbstractalbum1()); + + TParsePtrC parse(KAbstractalbum1()); + abstractalbumMedia->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive()); + abstractalbumMedia->SetTObjectValueL(KMPXMediaGeneralSynchronized, ETrue); + + abstractalbumMedia->SetCObjectValueL(KMPXMediaArrayContents, mediaArray); + abstractalbumMedia->SetTObjectValueL(KMPXMediaArrayCount, mediaArray->Count()); + + TRAPD( result, iCachedHelper->SetL(abstractalbumMedia)); + CleanupStack::PopAndDestroy(abstractalbumMedia); + + // Clear the array + CleanupStack::PopAndDestroy(mediaArray); + iLog->Log(_L("CCollectionHelperTestClass::SetAbstractAlbumL done with result=[%d]"), result); + + return result; +} + +//Update AlbumArtist field in Music table +//By calling CMPXCollectionCachedHelper API SetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.wma +//precondition on HW: f:\\1.wma +//output: MUSIC.AlbumArtist field of song 1.wma is changed +TInt CCollectionHelperTestClass::SetSongAlbumArtistL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::SetSongAlbumArtistL"))); + + CMPXMedia* media = NULL; + + // Creat media properties for the song + RArray contentIDs; + contentIDs.AppendL( KMPXMediaIdGeneral ); + contentIDs.AppendL( KMPXMediaIdAudio ); + contentIDs.AppendL( KMPXMediaIdMusic ); + contentIDs.AppendL( KMPXMediaIdMTP ); + + media = CMPXMedia::NewL( contentIDs.Array() ); + CleanupStack::PushL( media ); // + media + contentIDs.Close(); + + media->SetTObjectValueL( + KMPXMediaGeneralCategory, + EMPXSong ); + + // MPXMedia default types + media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + + // Get file path + media->SetTextValueL( KMPXMediaGeneralUri, KFileWmaSong() ); //wma test file + + media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() ); + media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAlbumArtistShort()); + + TRAPD( result, iCachedHelper->SetL(media)); + + CleanupStack::PopAndDestroy( media ); // - media + iLog->Log(_L("CCollectionHelperTestClass::SetSongAlbumArtistL done with result=[%d]"), result); + + return result; +} +//Retrive MUSIC.AlbumArtist field +//By calling CMPXCollectionCachedHelper GetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.wma +//precondition on HW: f:\\1.wma +//output: song 1.wma is returned and MUSIC.AlbumArtist field of song 1.wma is retrived. +TInt CCollectionHelperTestClass::GetSongAlbumArtistL(CStifItemParser& /*aItem*/) +{ + FTRACE(FPrint(_L("CCollectionHelperTest::GetSongAlbumArtistL"))); + TMPXGeneralCategory category = EMPXSong; + // CMPXMedia* foundMedia= NULL; + + const CMPXMedia& foundMedia = iCachedHelper->GetL( KFileWmaSong(), category ); + + if (foundMedia.IsSupported(KMPXMediaMusicAlbumArtist)) + { + const TDesC& albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ); + } + iLog->Log(_L("CCollectionHelperTestClass::GetSongAlbumArtistL done ")); + + return 1; +} + + + +//Update ABSTRACTALBUM.AlbumArtist +//Update AlbumArtist field in Abstractalbum table +//By calling CMPXCollectionCachedHelper API SetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.alb +//precondition on HW: f:\\1.alb +//output: ABSTRACTALBUM.AlbumArtist field of abstractalbum 1.alb is changed +TInt CCollectionHelperTestClass::SetAbstractAlbumArtistL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::SetAbstractAlbumArtistL"))); + + CMPXMedia* media = NULL; + + RArray contentIDs; + contentIDs.AppendL( KMPXMediaIdGeneral ); + + media = CMPXMedia::NewL( contentIDs.Array() ); + CleanupStack::PushL( media ); // + media + contentIDs.Close(); + media->SetTObjectValueL( KMPXMediaGeneralCategory, + EMPXAbstractAlbum ); + media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + + media->SetTextValueL( KMPXMediaGeneralUri, KAbstractalbum1() ); + media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() ); + + media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAlbumArtistShort() ); + + TRAPD( result, iCachedHelper->SetL(media)); + + CleanupStack::PopAndDestroy(media); + iLog->Log(_L("CCollectionHelperTestClass::SetAbstractAlbumArtistL done with result=[%d]"), result); + + + return result; +} + +//Retrieve ABSTRACTALBUM.AlbumArtist +//By calling CMPXCollectionCachedHelper API GetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.alb +//precondition on HW: f:\\1.alb +//output: abstractalbum 1.alb is returned and ABSTRACTALBUM.AlbumArtist field of 1.alb is retrived. +TInt CCollectionHelperTestClass::GetAbstractAlbumArtistL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::GetAbstractAlbumArtistL"))); + TMPXGeneralCategory category = EMPXAbstractAlbum; + const CMPXMedia& foundMedia = iCachedHelper->GetL( KAbstractalbum1(), category ); //wma test file + + + //print out foundMedia attributes + if (foundMedia.IsSupported(KMPXMediaMusicAlbumArtist)) + { + iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.AlbumArtist retrived")); + + + + + const TDesC& albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ); + + } + + if (foundMedia.IsSupported(KMPXMediaGeneralTitle)) + { + + + // HBufC* albumartist; + // albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ).AllocLC(); // + data + const TDesC& name = foundMedia.ValueText( KMPXMediaGeneralTitle ); + iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.name retrived")); + + + + } + if (foundMedia.IsSupported(KMPXMediaGeneralUri)) + { + + + // HBufC* albumartist; + // albumartist = foundMedia.ValueText( KMPXMediaMusicAlbumArtist ).AllocLC(); // + data + const TDesC& uri = foundMedia.ValueText( KMPXMediaGeneralUri ); + iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL, ABSTRACTALBUM.uri retrived")); + + } + iLog->Log(_L("CCollectionHelperTestClass::GetAbstractAlbumArtistL done")); + return 1; + } + + +//Update ABSTRACTALBUM.Name +//Update Name field in Abstractalbum table +//By calling CMPXCollectionCachedHelper API SetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.alb +//precondition on HW: f:\\1.alb +//output: ABSTRACTALBUM.name field of 1.alb is changed. +TInt CCollectionHelperTestClass::UpdateAbstractAlbumNameL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::UpdateAbstractAlbumNameL"))); + CMPXMedia* media = NULL; + + // Creat media properties for the song + RArray contentIDs; + contentIDs.AppendL( KMPXMediaIdGeneral ); + + media = CMPXMedia::NewL( contentIDs.Array() ); + + CleanupStack::PushL( media ); // + media + contentIDs.Close(); //- contentIDs + + media->SetTObjectValueL( + KMPXMediaGeneralCategory, + EMPXAbstractAlbum ); + + media->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + + media->SetTextValueL( KMPXMediaGeneralUri, KAbstractalbum1() ); + media->SetTextValueL( KMPXMediaGeneralDrive, KStoreRoot() ); + + //media->SetTextValueL( KMPXMediaMusicAlbumArtist, KAbstractAlbumName() ); + media->SetTextValueL( KMPXMediaGeneralTitle, KAbstractAlbumName() ); + // media->SetTextValueL( KMPXMediaMusicAlbumArtFileName, KNewAbstractAlbumName() ); + + TRAPD( result, iCachedHelper->SetL(media)); + CleanupStack::PopAndDestroy(media); // - media + + iLog->Log(_L("CCollectionHelperTestClass::UpdateAbstractAlbumNameL, done with result[%d]"), result); + return result; +} + + +//Find all abstractalbums on KStoreRoot +//Find all songs associated with the found Abstractalbums +//By calling CMPXCollectionCachedHelper API GetL +//precondition on emulator: c:\\data\\sounds\\digital\\1.wma +// c:\\data\\sounds\\digital\\1.alb +//1.wma and 1.alb are associated +//precondition on HW : f:\\1.wma +// f:\\1.alb +//1.wma and 1.alb are associated +//all AbstractAlbum on drive c: (e:) is returned, all songs associated with the returned AbstractAlbum are returned. +TInt CCollectionHelperTestClass::GetAbstractAlbumAndSongsL(CStifItemParser& /*aItem*/) + { + FTRACE(FPrint(_L("CCollectionHelperTest::GetAlbumAndSongsL"))); + TUint32 abstractalbumId(0); + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* searchMedia = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(searchMedia); + contentIDs.Close(); + + searchMedia->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + searchMedia->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXAbstractAlbum); + searchMedia->SetTextValueL(KMPXMediaGeneralDrive, KStoreRoot()); + + RArray abstractalbumAttributes; + CleanupClosePushL(abstractalbumAttributes); + abstractalbumAttributes.AppendL(KMPXMediaGeneralId); + abstractalbumAttributes.AppendL(KMPXMediaGeneralTitle); + abstractalbumAttributes.AppendL(KMPXMediaGeneralUri); + + //foundMedia will hold all .alb on KStoreRoot() + CMPXMedia* foundMedia = NULL; + TRAPD( err, foundMedia = iCachedHelper->FindAllL( + *searchMedia, abstractalbumAttributes.Array())); + + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, foundMedia assigned from FindAllL")); + + CleanupStack::PopAndDestroy(&abstractalbumAttributes); + CleanupStack::PopAndDestroy(searchMedia); + CleanupStack::PushL(foundMedia); //+ foundMedia + + if ( err != KErrNone ) + { + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, err = [%d]"), err ); + iCachedHelper->Close(); + iCachedHelper = NULL; + User::Leave( KErrGeneral ); + } + + if (!foundMedia->IsSupported(KMPXMediaArrayCount)) + { + User::Leave(KErrNotSupported); + } + + TInt foundItemCount = *foundMedia->Value(KMPXMediaArrayCount); + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, foundItemCount=%d"), foundItemCount ); + + CMPXMediaArray* foundArray = + foundMedia->Value(KMPXMediaArrayContents); + CleanupStack::PopAndDestroy(foundMedia); + + for (TInt j = 0; j < foundItemCount; ++j) + { + CMPXMedia* abstractalbumMedia = CMPXMedia::NewL(*(*foundArray)[j]); + CleanupStack::PushL(abstractalbumMedia); + + //to print out founded media attributes + if (abstractalbumMedia->IsSupported(KMPXMediaGeneralTitle)) + { + const TDesC& name = abstractalbumMedia->ValueText( KMPXMediaGeneralTitle ); + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, found abstractalbumName = [%s]"), name ); + } + + if (abstractalbumMedia->IsSupported(KMPXMediaGeneralId)) + { + abstractalbumId = abstractalbumMedia->ValueTObjectL(KMPXMediaGeneralId); + abstractalbumMedia->ValueTObjectL(KMPXMediaGeneralId); + } + + // find the media object that contains a list of songs in the abstractalbum + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + + CMPXMedia* searchMediaSong = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(searchMediaSong); + contentIDs.Close(); + + searchMediaSong->SetTObjectValueL(KMPXMediaGeneralType, EMPXGroup); + + searchMediaSong->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong); + searchMediaSong->SetTObjectValueL(KMPXMediaGeneralId, abstractalbumId); + + RArray songAttributes; + CleanupClosePushL(songAttributes); + songAttributes.AppendL(KMPXMediaGeneralId); + songAttributes.AppendL(KMPXMediaGeneralUri); + + //search from MPX collection to get all songs associated with .alb + CMPXMedia* foundSongs = NULL; + TRAPD( err, foundSongs = iCachedHelper->FindAllL( + *searchMediaSong, songAttributes.Array())); + + CleanupStack::PopAndDestroy(&songAttributes); + CleanupStack::PopAndDestroy(searchMediaSong); + CleanupStack::PopAndDestroy(abstractalbumMedia); + + CleanupStack::PushL( foundSongs ); // + foundSongs + if ( err != KErrNone ) + { + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, err = [%d]"), err ); + iCachedHelper->Close(); + iCachedHelper = NULL; + User::Leave( KErrGeneral ); + } + + if (!foundSongs->IsSupported(KMPXMediaArrayCount)) + { + User::Leave(KErrNotSupported); + } + + // Number of references + TInt numOfSongsRefs = *foundSongs->Value(KMPXMediaArrayCount); + iLog->Log(_L("CCollectionHelperTestClass::GetAlbumAndSongsL, numOfSongsRefs=%d"), numOfSongsRefs ); + CleanupStack::PopAndDestroy( foundSongs ); // - foundSong + } + return 1; + } + + +//By calling CMPXCollectionCachedHelper API RenameL +//precondition on emulator: c:\\data\\sounds\\digital\\1.wma +// c:\\data\\sounds\\digital\\1.alb +//1.wma and 1.alb are associated +//precondition on HW : f:\\1.wma +// f:\\1.alb +//output: 1.alb is renamed to 2.alb and all songs associated with 1.alb are updated in MUSIC table +TInt CCollectionHelperTestClass::RenameAbstractAlbumL(CStifItemParser& /*aItem*/) + { + TRAPD( result, iCachedHelper->RenameL( KAbstractalbum1, KAbstractalbum2, EMPXAbstractAlbum ) ); + iLog->Log(_L("CCollectionHelperTestClass::RenameAbstractAlbumL, done with result=[%d]")); + + return result; + } + +//Helper function for Finding in the MPX DB +//By calling CMPXCollectionCachedHelper API FindAllL +//output: all media with filename: aPath and aCategory is returned +TInt CCollectionHelperTestClass::FindMediaL(const TDesC& aPath, TMPXGeneralCategory aCategory) +{ + FTRACE(FPrint(_L("CCollectionHelperTestClass::FindL"))); + // Check does a record already exist for this aPath(URI)? + RArray contentIDs; + contentIDs.AppendL( KMPXMediaIdGeneral ); + + CMPXMedia* searchMedia = CMPXMedia::NewL( contentIDs.Array() ); + CleanupStack::PushL( searchMedia ); // + searchMedia + contentIDs.Close(); + searchMedia->SetTObjectValueL( KMPXMediaGeneralType, EMPXItem ); + searchMedia->SetTObjectValueL( KMPXMediaGeneralCategory, aCategory ); + searchMedia->SetTextValueL( KMPXMediaGeneralUri, aPath ); + +//note: some of the attributes are not needed + RArray mediaAttributes; + CleanupClosePushL( mediaAttributes ); // + mediaAttributes + mediaAttributes.AppendL( KMPXMediaGeneralId ); + mediaAttributes.AppendL( KMPXMediaGeneralTitle ); + mediaAttributes.AppendL( KMPXMediaGeneralUri ); + + CMPXMedia* foundMedia = iCachedHelper->FindAllL( *searchMedia, + mediaAttributes.Array() ); + + CleanupStack::PopAndDestroy( &mediaAttributes ); // - mediaAttributes + CleanupStack::PopAndDestroy( searchMedia ); // - searchMedia + CleanupStack::PushL( foundMedia ); // + foundMedia + + if ( !foundMedia->IsSupported( KMPXMediaArrayCount ) ) + { + CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia + return KErrNotSupported; + } + TInt foundItemCount = *foundMedia->Value( KMPXMediaArrayCount ); + CleanupStack::PopAndDestroy( foundMedia ); // - foundMedia + + iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, foundItemCount=[%d]"), foundItemCount); + if ( foundItemCount >1) //more than 1 same item in collection + { + iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, error, find more than 1 same media in collection")); + return KErrGeneral; + } + + else if ( foundItemCount ==0 || foundItemCount ==1 ) //no such item in collection + { + iLog->Log(_L("CCollectionHelperTestClass::FindMediaL, error, no this item in collection")); + return foundItemCount; + } + + return KErrNone; + } + + + +//Helper function for appending songs for SetAbstractAlbumL() +void CCollectionHelperTestClass::AttachSongsL(CMPXMediaArray* aAbstractAlbumArray, const TDesC& aPath) +{ + FTRACE(FPrint(_L("CCollectionHelperTestClass::AttachSongsL"))); + RArray contentIDs; + contentIDs.AppendL(KMPXMediaIdGeneral); + contentIDs.AppendL(KMPXMediaIdAudio); + contentIDs.AppendL(KMPXMediaIdMusic); + contentIDs.AppendL(KMPXMediaIdMTP); + CMPXMedia* media = CMPXMedia::NewL(contentIDs.Array()); + CleanupStack::PushL(media); + contentIDs.Close(); + + // MPXMedia default types + media->SetTObjectValueL(KMPXMediaGeneralType, EMPXItem); + media->SetTObjectValueL(KMPXMediaGeneralCategory, EMPXSong); + // File Path + TParsePtrC parse(aPath); + media->SetTextValueL(KMPXMediaGeneralUri, aPath); + media->SetTextValueL(KMPXMediaGeneralDrive, parse.Drive()); + + // Add media into array contents + aAbstractAlbumArray->AppendL(media); + CleanupStack::Pop(media); +} + // ----------------------------------------------------------------------------- // CCollectionHelperTestClass::CloseUiHelperL() // Returns: Symbian OS errors. diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg --- a/mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/collection_helper_api/tsrc/conf/CollectionHelperTestClass.cfg Fri Apr 02 16:24:05 2010 +0100 @@ -66,4 +66,165 @@ [Endtest] +[Test] +title 4. Add Song +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test AddSong +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] +title 5. Remove Song +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test RemoveSong +test CloseCachedHelper +delete test +pause 1000 +[Endtest] + +[Test] +title 6. AddAbstractAlbum +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test AddAbstractAlbum +test CloseCachedHelper +delete test +pause 1000 +[Endtest] + +[Test] +title 7. Remove AbstractAlbum +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test RemoveAbstractAlbum +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +RemoveAbstractAlbumL + + +[Test] +title 8. Associate Song with AbstractAlbum +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test SetAbstractAlbum +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + + +[Test] +title 9. Set SongAlbumArtist +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test SetSongAlbumArtist +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + + +[Test] +title 10. Get SongAlbumArtist +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test GetSongAlbumArtist +test CloseCachedHelper +delete test +pause 1000 +[Endtest] + +[Test] +title 11. set AbstractAlbumArtist +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test SetAbstractAlbumArtist +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + +[Test] +title 12. Get AbstractAlbumArtist +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test GetAbstractAlbumArtist +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + + +[Test] +title 13. Update AbstractAlbumName +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test UpdateAbstractAlbumName +test CloseCachedHelper +delete test +pause 1000 +[Endtest] + + +title 14. Get AbstractAlbum and Songs +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test GetAbstractAlbumAndSongs +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + +title 15. Rename AbstractAlbum +create CollectionHelperTestClass test +test OpenCollectionUtility +waittestclass test +test NewCachedHelper +test RenameAbstractAlbum +test CloseCachedHelper +delete test +pause 1000 +[Endtest] +[Test] + + + + + + + + + \ No newline at end of file diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/collection_helper_api/tsrc/group/bld.inf --- a/mmappfw_plat/collection_helper_api/tsrc/group/bld.inf Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/collection_helper_api/tsrc/group/bld.inf Fri Apr 02 16:24:05 2010 +0100 @@ -28,5 +28,3 @@ PRJ_TESTMMPFILES #include "../CollectionHelperTestClass/group/bld.inf" - -PRJ_TESTMMPFILES diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini --- a/mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/collection_helper_api/tsrc/init/TestFramework.ini Fri Apr 02 16:24:05 2010 +0100 @@ -1,5 +1,5 @@ # -# This is STIF initialization file +# This is STIFTestFramework initialization file # Comment lines start with '#'-character. # See STIF TestFramework users guide.doc for instructions @@ -29,15 +29,12 @@ # # - File Creation Mode indicates test report overwriting if file exist. # + OVERWRITE, Overwrites if the Test report file exist. -# + APPEND, Continue logging after the old Test report information if +# + APPEND, Continue logging after the old Test report information if # report exist. # - Sets a device reset module's dll name(Reboot). # + If Nokia specific reset module is not available or it is not correct one # StifHWResetStub module may use as a template for user specific reset -# module. -# - Sets STIF test measurement disable options. e.g. pluging1 and pluging2 disablation -# DisableMeasurement= stifmeasurementplugin01 stifmeasurementplugin02 -# +# module. [Engine_Defaults] @@ -46,8 +43,9 @@ CreateTestReport= YES # Possible values: YES or NO -TestReportFilePath= C:\LOGS\TestFramework\ -TestReportFileName= TestReport_CollectionHelperTestClass +#TestReportFilePath= C:\LOGS\TestFramework\ +TestReportFilePath= c:\testing\log\ +TestReportFileName= TestReport TestReportFormat= TXT # Possible values: TXT or HTML TestReportOutput= FILE # Possible values: FILE or RDEBUG @@ -55,14 +53,6 @@ DeviceResetDllName= StifResetForNokia.dll # e.g. 'StifHWResetStub.dll' for user specific reseting -DisableMeasurement= stifmeasurementdisablenone # Possible values are: - # 'stifmeasurementdisablenone', 'stifmeasurementdisableall' - # 'stifmeasurementplugin01', 'stifmeasurementplugin02', - # 'stifmeasurementplugin03', 'stifmeasurementplugin04', - # 'stifmeasurementplugin05' or 'stifbappeaprofiler' - -Timeout= 0 # Default timeout value for each test case. In milliseconds -UITestingSupport= YES [End_Defaults] # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -88,29 +78,28 @@ # In the simplest case it is enough to specify only the # name of the test module when adding new test module -[New_Module] -ModuleName= testscripter -TestCaseFile= c:\testframework\CollectionHelperTestClass.cfg -[End_Module] +#[New_Module] +#ModuleName= demomodule +#[End_Module] # Load testmoduleXXX, optionally with initialization file and/or test case files -#[New_Module] -#ModuleName= testmodulexxx +[New_Module] +ModuleName= testscripter #TestModuleXXX used initialization file #IniFile= c:\testframework\init.txt #TestModuleXXX used configuration file(s) -#TestCaseFile= c:\testframework\testcases1.cfg -#TestCaseFile= c:\testframework\testcases2.cfg -#TestCaseFile= c:\testframework\manualtestcases.cfg - -#[End_Module] +#TestCaseFile= c:\testframework\epos_omasuplpostestercfg.cfg +TestCaseFile= c:\testframework\CollectionHelperTestClass.cfg +[End_Module] # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- + + # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -# Set STIF logging overwrite parameters for Logger. +# Set STIFTestFramework logging overwrite parameters for Logger. # Hardware and emulator environment logging path and styles can # be configured from here to overwrite the Logger's implemented values. # @@ -155,41 +144,34 @@ # + NO, No line break(s). # # - Will event ranking include to the log file. -# + YES, Event ranking number added to each line in log file(s). Ranking number +# + YES, Event ranking number added to each line in log file(s). Ranking number # depends on environment's tics, for example(includes time stamp also) # '012 12.Nov.2003 115958 LOGGING INFO' # + NO, No event ranking. # -# - Will write log file in unicode format. -# + YES, Log file will be written in unicode format -# + NO, Log will be written as normal, not unicode, file. -# [Logger_Defaults] -#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' -#NOTE: TestEngine and TestServer logging settings cannot change here +#NOTE: If you want to set Logger using next setting(s) remove comment(s)'#' -#CreateLogDirectories= YES # Possible values: YES or NO +#CreateLogDirectories= YES # Possible values: YES or NO #EmulatorBasePath= C:\LOGS\TestFramework\ -#EmulatorFormat= HTML # Possible values: TXT or HTML -#EmulatorOutput= FILE # Possible values: FILE or RDEBUG +#EmulatorFormat= HTML # Possible values: TXT or HTML +#EmulatorOutput= FILE # Possible values: FILE or RDEBUG #HardwareBasePath= D:\LOGS\TestFramework\ -#HardwareFormat= HTML # Possible values: TXT or HTML -#HardwareOutput= FILE # Possible values: FILE or RDEBUG +#HardwareFormat= HTML # Possible values: TXT or HTML +#HardwareOutput= FILE # Possible values: FILE or RDEBUG -#FileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND +#FileCreationMode= OVERWRITE # Possible values: OVERWRITE or APPEND -#ThreadIdToLogFile= YES # Possible values: YES or NO -#WithTimeStamp= YES # Possible values: YES or NO -#WithLineBreak= YES # Possible values: YES or NO -#WithEventRanking= YES # Possible values: YES or NO +#ThreadIdToLogFile= YES # Possible values: YES or NO +#WithTimeStamp= YES # Possible values: YES or NO +#WithLineBreak= YES # Possible values: YES or NO +#WithEventRanking= YES # Possible values: YES or NO -#FileUnicode= YES # Possible values: YES or NO -#AddTestCaseTitle= YES # Possible values: YES or NO [End_Logger_Defaults] # -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -# End of file +# End of file \ No newline at end of file diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/harvester_collection_mediator_api/inc/mpxcollectionmediator.h --- a/mmappfw_plat/harvester_collection_mediator_api/inc/mpxcollectionmediator.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/harvester_collection_mediator_api/inc/mpxcollectionmediator.h Fri Apr 02 16:24:05 2010 +0100 @@ -89,6 +89,14 @@ IMPORT_C void AddItemL( CMPXMedia*& aMediaProp ); /** + * Add a media to the collection asynchronously. + * + * @param aMediaProp media item. + * @leave KErrArgument leave if not a supported media type + */ + IMPORT_C void AddItemAsyncL( CMPXMedia*& aMediaProp ); + + /** * Add a list of files to the collection db. * @since S60 v3.2.3 * @param aArray list of media item. diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/harvester_collection_mediator_api/tsrc/group/bld.inf --- a/mmappfw_plat/harvester_collection_mediator_api/tsrc/group/bld.inf Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/harvester_collection_mediator_api/tsrc/group/bld.inf Fri Apr 02 16:24:05 2010 +0100 @@ -29,4 +29,4 @@ PRJ_TESTMMPFILES #include "../HarvesterCollectionMediatorTest/group/bld.inf" -PRJ_TESTMMPFILES + diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h --- a/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/harvester_metadata_extractor_api/inc/mpxmetadataextractor.h Fri Apr 02 16:24:05 2010 +0100 @@ -168,6 +168,13 @@ const TDesC& aFile, TDesC8& aValue); + /** + * Check if can send request to TNM or not. + * @since 5.0 + * + */ + void CheckBeforeSendRequest(); + private: /** diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h --- a/mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_albumart_utility_api/inc/mpxalbumartutility.h Fri Apr 02 16:24:05 2010 +0100 @@ -21,7 +21,7 @@ #include #include -#include +#include class CMPXMedia; class CMPXImageUtil; diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h --- a/mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_common_api/inc/mpxmediageneraldefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -451,7 +451,7 @@ EMPXFile, EMPXImage, EMPXVideo, - EMPXRadio, + EMPXAbstractAlbum, EMPXMessage, EMPXTag, EMPXCommand, diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h --- a/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_common_api/inc/mpxmediamtpdefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -34,6 +34,7 @@ * Attributes supported for KMPXMediaIdMTP */ const TMPXAttributeData KMPXMediaMTPDrmStatus = {KMPXMediaIdMTP, 0x0001}; // TUint16 +const TMPXAttributeData KMPXMediaMTPSampleDataFlag = {KMPXMediaIdMTP, 0x0002}; // TBool const TMPXAttributeData KMPXMediaMTPAll = {KMPXMediaIdMTP, 0xffffffff}; #endif // MPXMEDIAMTPDEFS_H diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h --- a/mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_common_api/inc/mpxmediamusicdefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -44,6 +44,8 @@ const TMPXAttributeData KMPXMediaMusicOriginalAlbumArtFileName={KMPXMediaIdMusic,0x200}; // Text const TMPXAttributeData KMPXMediaMusicAlbumArtThumbnail={KMPXMediaIdMusic,0x400}; // CFbsImage const TMPXAttributeData KMPXMediaMusicAlbumArtThumbnailSize={KMPXMediaIdMusic,0x800}; // TSint +const TMPXAttributeData KMPXMediaMusicAlbumArtChanged={KMPXMediaIdMusic,0x1000}; // TInt +const TMPXAttributeData KMPXMediaMusicAlbumArtist={KMPXMediaIdMusic,0x2000}; // Text const TMPXAttributeData KMPXMediaMusicAll={KMPXMediaIdMusic,0xffffffff}; // Text /** @@ -65,6 +67,7 @@ EMPXMediaMusicOriginalAlbumArtFileName=0x200, // Text EMPXMediaMusicAlbumArtThumbnail=0x400, EMPXMediaMusicAlbumArtThumbnailSize=0x800, + EMPXMediaMusicAlbumArtist=0x2000, EMPXMediaMusicAll=0xffffffff }; diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_common_definition_api/inc/mpxplaybackpluginversion2.h --- a/mmappfw_plat/mpx_playback_common_definition_api/inc/mpxplaybackpluginversion2.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_common_definition_api/inc/mpxplaybackpluginversion2.h Fri Apr 02 16:24:05 2010 +0100 @@ -39,8 +39,9 @@ * @param aUri URI of the item * @param aType the mime type of the item * @param aAccessPoint the access point + * @param aPosition the starting position */ - virtual void InitStreamingL(const TDesC& aUri, const TDesC8& aType, TInt aAccessPoint) = 0; + virtual void InitStreamingL(const TDesC& aUri, const TDesC8& aType, TInt aAccessPoint, TInt aPosition = 0) = 0; /** * Initializes a file handle for playback. @@ -48,8 +49,9 @@ * @since S60 9.2 * @param aFile file handle of a file * @param aAccessPoint the access point + * @param aPosition the starting position */ - virtual void InitStreamingL(RFile& aFile, TInt aAccessPoint) = 0; + virtual void InitStreamingL(RFile& aFile, TInt aAccessPoint, TInt aPosition = 0) = 0; #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API /** @@ -58,17 +60,39 @@ * @since S60 9.2 * @param aFile 64 bit file handle of a file * @param aAccessPoint the access point + * @param aPosition the starting position */ - virtual void InitStreaming64L(RFile64& aFile, TInt aAccessPoint) = 0; + virtual void InitStreaming64L(RFile64& aFile, TInt aAccessPoint, TInt aPosition = 0) = 0; /** * Initializes a song for playback. * * @since S60 9.2 * @param aFile 64 bit file handle of a song + * @param aPosition the starting position */ - virtual void Initialise64L(RFile64& aSong) = 0; + virtual void Initialise64L(RFile64& aSong, TInt aPosition = 0) = 0; #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + + + /** + * Initializes a song for playback. + * + * @since S60 9.2 + * @param aSong the song path + * @param aPosition the starting position + */ + virtual void InitialiseWithPositionL(const TDesC& aSong, TInt aPosition = 0) = 0; + + /** + * Initializes a song for playback. + * + * @since S60 9.2 + * @param aFile file handle of a song + * @param aPosition the starting position + */ + virtual void InitialiseWithPositionL(RFile& aSong, TInt aPosition = 0) = 0; + }; #endif // CMPXPLAYBACKPLUGINVERSION2_H diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/conf/mpxplaybackutilitytest.cfg Fri Apr 02 16:24:05 2010 +0100 @@ -1,40 +1,253 @@ + +[Define] +KErrNotFound -1 +KErrNotSupported -5 +KErrArgument -6 +KErrNotReady -18 +KErrAccessDenied -21 + +KTrue 1 +KFalse 0 + +// UID definition for playback mode +KPbModeDefault 271067440 // 0x10282930 Uses same player as any other player running in same. +KPbModeActivePlayer 271067441 // 0x10282931 Currently active player or any player if no active player. +KPbModeNewPlayer 271067442 // 0x10282932 New player +KPbModeAppUID 111 // Application UID + +// Category for playback utility creation. +KMPXCategoryUndefined 0 +KMPXCategoryMusic 1 +KMPXCategoryVideo 2 + +// UID for Helix Plugin +KVideoHelixPlaybackPluginUid 271066449 // 0x10282551 + +// Timers +KTimerEndTest 5000 // 5 sec + +[Enddefine] + [Test] +// +// Test NewL +// - Mode NewPlayer +// - Category Default(Music) +// title 1 MMPXPlaybackUtilityNewL -create mpxplaybackutilitytest foobar -foobar MMPXPlaybackUtilityNewL -delete foobar +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityNewL KPbModeNewPlayer +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test NewL +// - Mode ActivePlayer +// - Category Video +// +title 2 MMPXPlaybackUtilityNewL with category video +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityNewWithCatL KMPXCategoryVideo KPbModeActivePlayer +pbutil EndTest +delete pbutil [Endtest] [Test] -title 2 MMPXPlaybackUtilityUtilityL -create mpxplaybackutilitytest foobar -foobar MMPXPlaybackUtilityUtilityL -delete foobar +// +// Test UtilityL +// - Mode UID +// - Category Default(Music) +// +title 3 MMPXPlaybackUtilityUtilityL +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityL KPbModeAppUID +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test UtilityL +// - Mode Default +// - Category Video +// +title 4 MMPXPlaybackUtilityUtilityL with category video +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeDefault +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test InitL with Playlist +// - Mode NewPlayer +// - Category Default (Music) +// +title 5 MMPXPlaybackUtilityInitL(playlist) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityL KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityInitWithPlaylistL +pause KTimerEndTest +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test InitL with URI +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitL with URI, File Battle_160x100_30kbps.rm +// +title 6 MMPXPlaybackUtilityInitL(uri) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitWithUriL Battle_160x100_30kbps.rm +pause KTimerEndTest +pbutil EndTest +delete pbutil [Endtest] [Test] -title 3 MMPXPlaybackUtilityInit64L -create mpxplaybackutilitytest foobar -foobar MMPXPlaybackUtilityNewL -foobar MMPXPlaybackUtilityInit64L Battle_160x100_30kbps.rm -delete foobar +// +// Test InitL with URI +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitL with URI, File XVID_176x144_15fps_261Kbps.avi +// +title 7 MMPXPlaybackUtilityInitL(uri) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitWithUriL XVID_176x144_15fps_261Kbps.avi +pause KTimerEndTest +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test InitL with RFile +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitL with RFile, File 20k_H263_WB_176x144_15fps.3gp +// +title 8 MMPXPlaybackUtilityInitL(rfile) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitWithRFileL 20k_H263_WB_176x144_15fps.3gp +pause KTimerEndTest +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test InitStreamingL with URI +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitStreamingL with URI, File 30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4 +// +title 9 MMPXPlaybackUtilityInitStreamingL(uri) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitStreamingWithUriL 30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4 +pause KTimerEndTest +pbutil EndTest +delete pbutil [Endtest] [Test] -title 4 MMPXPlaybackUtilityInitStreaming64L -create mpxplaybackutilitytest foobar -foobar MMPXPlaybackUtilityNewL -foobar MMPXPlaybackUtilityInitStreaming64L Battle_160x100_30kbps.rm -delete foobar +// +// Test InitStreamingL with RFile +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitStreamingL with RFile, File 80k_H264_AAC16M22_176x144_15fps.3gp +// +title 10 MMPXPlaybackUtilityInitStreamingL(rfile) +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitStreamingWithRFileL 80k_H264_AAC16M22_176x144_15fps.3gp +pause KTimerEndTest +pbutil EndTest +delete pbutil +[Endtest] + +[Test] +// +// Test Init64L +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - Init64L with RFile64, File DivX_MP3_256x112_30fps_300Kbps.avi +// +title 11 MMPXPlaybackUtilityInit64L +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInit64L DivX_MP3_256x112_30fps_300Kbps.avi +pause KTimerEndTest +pbutil EndTest +delete pbutil [Endtest] [Test] -title 5 MMPXPlaybackUtilityFile64L -create mpxplaybackutilitytest foobar -foobar MMPXPlaybackUtilityNewL -foobar MMPXPlaybackUtilityInit64L Battle_160x100_30kbps.rm -foobar MMPXPlaybackUtilityFile64L -delete foobar +// +// Test InitStreaming64L +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - InitStreaming64L with RFile64, File honey_im_home_horror_ad.avi +// +title 12 MMPXPlaybackUtilityInitStreaming64L +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInitStreaming64L honey_im_home_horror_ad.avi +pause KTimerEndTest +pbutil EndTest +delete pbutil [Endtest] +[Test] +// +// Test File64L +// - UtilityL with Mode NewPlayer, Category Video +// - Add Observer +// - SelectPlayerL with HelixPlugin UID +// - Init64L with RFile64, File MPEG4_VBR_176x144_15fps.3gp +// - File64L to get RFile64 file handler +// +title 13 MMPXPlaybackUtilityFile64L +create mpxplaybackutilitytest pbutil +pbutil MMPXPlaybackUtilityUtilityWithCatL KMPXCategoryVideo KPbModeNewPlayer +pbutil MMPXPlaybackUtilityAddObserverL +pbutil MMPXPlaybackUtilityPlayerManagerSelectPlayerL KVideoHelixPlaybackPluginUid +pbutil MMPXPlaybackUtilityInit64L MPEG4_VBR_176x144_15fps.3gp +pause KTimerEndTest +pbutil MMPXPlaybackUtilityFile64L +pbutil EndTest +delete pbutil +[Endtest] + diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/20k_H263_WB_176x144_15fps.3gp Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/20k_H263_WB_176x144_15fps.3gp has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4 Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4 has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/80k_H264_AAC16M22_176x144_15fps.3gp Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/80k_H264_AAC16M22_176x144_15fps.3gp has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/DivX_MP3_256x112_30fps_300Kbps.avi Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/DivX_MP3_256x112_30fps_300Kbps.avi has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/MPEG4_VBR_176x144_15fps.3gp Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/MPEG4_VBR_176x144_15fps.3gp has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/XVID_176x144_15fps_261Kbps.avi Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/XVID_176x144_15fps_261Kbps.avi has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/honey_im_home_horror_ad.avi Binary file mmappfw_plat/mpx_playback_utility_api/tsrc/data/mmc/honey_im_home_horror_ad.avi has changed diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.mmp Fri Apr 02 16:24:05 2010 +0100 @@ -54,6 +54,7 @@ LIBRARY stiftestengine.lib LIBRARY mpxplaybackutility.lib LIBRARY mpxcommon.lib +LIBRARY mpxcollectionutility.lib LANG SC diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/group/mpxplaybackutilitytest.pkg Fri Apr 02 16:24:05 2010 +0100 @@ -21,7 +21,7 @@ &EN ; Provide value for uid -#{"STIF mpxplaybackutilitytest Application"},(0x10005942),1,1,0,TYPE=SA +#{"MPX PlaybackUtility STIF"}, (0x101FB3E3), 1, 0, 1, TYPE=SA, RU ; Series60 product id for S60 3.0 [0x101F7961], 0, 0, 0, {"Series60ProductID"} @@ -32,35 +32,16 @@ ; Unique Vendor name :"Nokia" -; Logo -; None - -; Package signature - Optional -; None - -; Start of Package body - -; Condition blocks -; None - -; Options list -; None +; Install files +"\epoc32\release\armv5\udeb\mpxplaybackutilitytest.dll" - "!:\Sys\Bin\mpxplaybackutilitytest.dll" +"..\..\init\TestFramework.ini" - "c:\testframework\TestFramework.ini" +"..\..\conf\mpxplaybackutilitytest.cfg" - "c:\testframework\mpxplaybackutilitytest.cfg" -; Install files -"..\..\data\mmc\Battle_160x100_30kbps.rm" - "e:\testing\data\Battle_160x100_30kbps.rm" - -"..\..\init\TestFramework.ini" - "c:\testframework\TestFramework.ini" -"..\..\conf\mpxplaybackutilitytest.cfg" - "c:\testframework\mpxplaybackutilitytest.cfg" - -"\epoc32\release\armv5\udeb\mpxplaybackutilitytest.dll" - "c:\Sys\Bin\mpxplaybackutilitytest.dll" - -; Embedded SIS -; None - -; End of Package body - -; PKG dependencies -; None - -; PKG capabilities -; None +"..\..\data\mmc\Battle_160x100_30kbps.rm" - "f:\testing\data\Battle_160x100_30kbps.rm" +"..\..\data\mmc\20k_H263_WB_176x144_15fps.3gp" - "f:\testing\data\20k_H263_WB_176x144_15fps.3gp" +"..\..\data\mmc\30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4" - "f:\testing\data\30k_MPEG4_AAC_8Khz_176x144_15fps_30secs.mp4" +"..\..\data\mmc\80k_H264_AAC16M22_176x144_15fps.3gp" - "f:\testing\data\80k_H264_AAC16M22_176x144_15fps.3gp" +"..\..\data\mmc\DivX_MP3_256x112_30fps_300Kbps.avi" - "f:\testing\data\DivX_MP3_256x112_30fps_300Kbps.avi" +"..\..\data\mmc\honey_im_home_horror_ad.avi" - "f:\testing\data\honey_im_home_horror_ad.avi" +"..\..\data\mmc\MPEG4_VBR_176x144_15fps.3gp" - "f:\testing\data\MPEG4_VBR_176x144_15fps.3gp" +"..\..\data\mmc\XVID_176x144_15fps_261Kbps.avi" - "f:\testing\data\XVID_176x144_15fps_261Kbps.avi" diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytest.h Fri Apr 02 16:24:05 2010 +0100 @@ -27,11 +27,8 @@ #include #include #include -// CONSTANTS -//const ?type ?constant_var = ?constant; // MACROS -//#define ?macro ?macro_def #define TEST_CLASS_VERSION_MAJOR 0 #define TEST_CLASS_VERSION_MINOR 0 #define TEST_CLASS_VERSION_BUILD 0 @@ -45,26 +42,29 @@ // data file _LIT( KmpxplaybackutilityTestFilePath, "C:\\testing\\data\\" ); #else -_LIT( KmpxplaybackutilitytestLogPath, "\\logs\\testframework\\mpxplaybackutilitytest\\" ); +_LIT( KmpxplaybackutilitytestLogPath, "f:\\logs\\testframework\\mpxplaybackutilitytest\\" ); // Log file _LIT( KmpxplaybackutilitytestLogFile, "mpxplaybackutilitytest.txt" ); _LIT( KmpxplaybackutilitytestLogFileWithTitle, "mpxplaybackutilitytest_[%S].txt" ); // data file -_LIT( KmpxplaybackutilityTestFilePath, "e:\\testing\\data\\" ); +_LIT( KmpxplaybackutilityTestFilePath, "f:\\testing\\data\\" ); #endif + // FUNCTION PROTOTYPES //?type ?function_name(?arg_list); // FORWARD DECLARATIONS //class ?FORWARD_CLASSNAME; -class Cmpxplaybackutilitytest; -class MMPXPlaybackUtility; -class MMPXPlaybackObserver; // DATA TYPES -//enum ?declaration -//typedef ?declaration -//extern ?data_type; +typedef struct +{ + TInt iEvent; + TInt iType; + TInt iData; +} TMpxPlaybackTestEvent; + +typedef CArrayPtrFlat CMpxPlaybackTestEventArray; // CLASS DECLARATION @@ -76,82 +76,151 @@ * @since ?Series60_version */ NONSHARABLE_CLASS(Cmpxplaybackutilitytest) : public CScriptBase, - public MMPXPlaybackObserver + public MMPXPlaybackObserver, + public MMPXPlaybackCallback { - public: // Constructors and destructor +public: // Constructors and destructor - /** - * Two-phased constructor. - */ - static Cmpxplaybackutilitytest* NewL( CTestModuleIf& aTestModuleIf ); + /** + * Two-phased constructor. + */ + static Cmpxplaybackutilitytest* NewL( CTestModuleIf& aTestModuleIf ); - /** - * Destructor. - */ - virtual ~Cmpxplaybackutilitytest(); + /** + * Destructor. + */ + virtual ~Cmpxplaybackutilitytest(); - - public: // Functions from base classes +public: // Functions from base classes - /** - * From CScriptBase Runs a script line. - * @since ?Series60_version - * @param aItem Script line containing method name and parameters - * @return Symbian OS error code - */ - virtual TInt RunMethodL( CStifItemParser& aItem ); - - // From base class MMPXPlaybackObserver - /** - * Handle playback message - * - * @since 3.1 - * @param aMessage playback message - * @param aErr system error code. - */ - void HandlePlaybackMessage( - CMPXMessage* aMessage, TInt aError ); - private: + /** + * From CScriptBase Runs a script line. + * @since ?Series60_version + * @param aItem Script line containing method name and parameters + * @return Symbian OS error code + */ + virtual TInt RunMethodL( CStifItemParser& aItem ); + + // From base class MMPXPlaybackObserver + /** + * Handle playback message + * + * @since 3.1 + * @param aMessage playback message + * @param aErr system error code. + */ + void HandlePlaybackMessage( CMPXMessage* aMessage, TInt aError ); + + /** + * Handle playback property. + * + * @since S60 3.2.3 + * @param aProperty the property + * @param aValue the value of the property + * @param aError error code + */ + void HandlePropertyL(TMPXPlaybackProperty aProperty, TInt aValue, TInt aError); - /** - * C++ default constructor. - */ - Cmpxplaybackutilitytest( CTestModuleIf& aTestModuleIf ); - /** - * By default Symbian 2nd phase constructor is private. - */ - void ConstructL(); - // Prohibit copy constructor if not deriving from CBase. - // ?classname( const ?classname& ); - // Prohibit assigment operator if not deriving from CBase. - // ?classname& operator=( const ?classname& ); - /** - * Frees all resources allocated from test methods. - * @since ?Series60_version - */ - void Delete(); - /** - * Test methods are listed below. - */ - TInt MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/); - TInt MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/); - TInt MMPXPlaybackUtilityInit64L(CStifItemParser& /*aItem*/); - TInt MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& /*aItem*/); - TInt MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/); - - /** - * Method used to log version of test class - */ - void SendTestClassVersion(); - //ADD NEW METHOD DEC HERE - //[TestMethods] - Do not remove - private: // Friend classes - //From mpxplaybackutility.h - MMPXPlaybackUtility* iMPXPlaybackUtility; - RFs iFs; + /** + * Method is called continously until aComplete=ETrue, signifying that + * it is done and there will be no more callbacks. + * Only new items are passed each time. + * + * @since S60 3.2.3 + * @param aPlayer UID of the subplayer + * @param aSubPlayers a list of sub players + * @param aComplete ETrue no more sub players. EFalse more subplayer + * expected + * @param aError error code + */ + void HandleSubPlayerNamesL(TUid aPlayer, + const MDesCArray* aSubPlayers, + TBool aComplete, + TInt aError); + + /** + * Call back of media request. + * + * @since S60 3.2.3 + * @param aMedia media + * @param aError error code + */ + void HandleMediaL(const CMPXMedia& aProperties, TInt aError); + + /** + * Handle completion of a asynchronous command. + * Note: All clients should implement this callback. + * + * @since S60 3.2.3 + * @param aCommandResult result of the command, NULL if error + * @param aError error code + */ + void HandlePlaybackCommandComplete(CMPXCommand* aCommandResult, TInt aError); + +private: // functions + + /** + * C++ default constructor. + */ + Cmpxplaybackutilitytest( CTestModuleIf& aTestModuleIf ); + /** + * By default Symbian 2nd phase constructor is private. + */ + void ConstructL(); + // Prohibit copy constructor if not deriving from CBase. + // ?classname( const ?classname& ); + // Prohibit assigment operator if not deriving from CBase. + // ?classname& operator=( const ?classname& ); + /** + * Frees all resources allocated from test methods. + * @since ?Series60_version + */ + void Delete(); + + /* + * Create resources + */ + void CreateL(); + + void AddExpectedEventL(TInt aEvent, TInt aType, TInt aData); + void RemoveExpectedEventL(TInt aEvent, TInt aType, TInt aData); + + /** + * Test methods are listed below. + */ + TInt MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityNewWithCatL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityUtilityWithCatL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitWithPlaylistL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitWithUriL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitWithRFileL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitStreamingWithUriL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitStreamingWithRFileL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInit64L(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityAddObserverL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityRemoveObserverL(CStifItemParser& /*aItem*/); + TInt MMPXPlaybackUtilityPlayerManagerSelectPlayerL(CStifItemParser& /*aItem*/); + TInt EndTest(CStifItemParser& /*aItem*/); + + /** + * Method used to log version of test class + */ + void SendTestClassVersion(); + //ADD NEW METHOD DEC HERE + //[TestMethods] - Do not remove + +private: // data + MMPXPlaybackUtility* iMPXPlaybackUtility; + CMpxPlaybackTestEventArray* iExpectedEventArray; + RFs iFs; + TInt iCallbackError; + RFile iFile; #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - RFile64 iFile64; + RFile64 iFile64; #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API }; diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytestdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/inc/mpxplaybackutilitytestdefs.h Fri Apr 02 16:24:05 2010 +0100 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2002 - 2007 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: mpxplaybackutilitytestdefs header for STIF Test Framework TestScripter. +* +*/ + +#ifndef MPXPLAYBACKUTILITYTESTDEFS_H +#define MPXPLAYBACKUTILITYTESTDEFS_H + +const TInt KGeneralPlaybackMsgOffset = 0; +const TInt KVideoPlaybackMsgOffset = 100; +const TInt KStifPlaybackMsgOffset = 200; +const TInt KMPXMessageStif = 0x20011397; + + +#endif // MPXPLAYBACKUTILITYTESTDEFS_H + +// End of File diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytest.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -131,10 +131,8 @@ EFalse ); SendTestClassVersion(); - - - iFs.Connect(); - iFs.ShareProtected(); + + CreateL(); } // ----------------------------------------------------------------------------- diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp --- a/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mpx_playback_utility_api/tsrc/mpxplaybackutilitytest/src/mpxplaybackutilitytestBlocks.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -21,18 +21,105 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "mpxplaybackutilitytest.h" +#include "mpxplaybackutilitytestdefs.h" + // ============================ MEMBER FUNCTIONS =============================== // --------------------------------------------------------------------------- // From MMPXPlaybackObserver // Handle playback message. // --------------------------------------------------------------------------- // -void Cmpxplaybackutilitytest::HandlePlaybackMessage( - CMPXMessage* /*aMessage*/, TInt aError ) +void Cmpxplaybackutilitytest::HandlePlaybackMessage( CMPXMessage* aMessage, TInt aError ) { - iLog->Log(_L("Cmpxharvestertest::HandlePlaybackMessage: %d"), aError); + iLog->Log(_L("Cmpxharvestertest::HandlePlaybackMessage: Error %d"), aError); + if ( !aError ) + { + TMPXMessageId id( *(aMessage->Value(KMPXMessageGeneralId)) ); + TInt event( *aMessage->Value( KMPXMessageGeneralEvent ) ); + TInt type( *aMessage->Value( KMPXMessageGeneralType ) ); + TInt data( *aMessage->Value( KMPXMessageGeneralData ) ); + + if ( KMPXMessageGeneral == id ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() General event = %d type = %d value = %d"), + event, type, data ); + RemoveExpectedEventL( KGeneralPlaybackMsgOffset + event, type, data ); + } + else if ( KMPXMediaIdVideoPlayback == id ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() Video event = %d type = %d value = %d"), + event, type, data ); + RemoveExpectedEventL( KVideoPlaybackMsgOffset + event, type, data ); + } + else if ( KMPXMessageStif ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::HandlePlaybackMessage() STIF event = %d type = %d value = %d"), + event, type, data ); + RemoveExpectedEventL( KStifPlaybackMsgOffset + event, type, data ); + } + } + else + { + if ( !iCallbackError ) + { + iCallbackError = aError; + } + } } + +// --------------------------------------------------------------------------- +// Handle playback property. +// --------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::HandlePropertyL( TMPXPlaybackProperty aProperty, TInt aValue, TInt aError ) + { + iLog->Log(_L("Cmpxharvestertest::HandlePropertyL: Property %d, Value %d, Error %d"), + aProperty, aValue, aError); + } + +// --------------------------------------------------------------------------- +// Method is called continously until aComplete=ETrue, signifying that +// it is done and there will be no more callbacks. +// Only new items are passed each time. +// --------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::HandleSubPlayerNamesL( TUid aPlayer, + const MDesCArray* aSubPlayers, + TBool aComplete, + TInt aError ) + { + iLog->Log(_L("Cmpxharvestertest::HandleSubPlayerNamesL: Complete %d, Error %d"), aComplete, aError); + } + +// --------------------------------------------------------------------------- +// Call back of media request. +// --------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::HandleMediaL( const CMPXMedia& aProperties, TInt aError ) + { + iLog->Log(_L("Cmpxharvestertest::HandleMediaL: Error %d"), aError); + } + +// --------------------------------------------------------------------------- +// Handle completion of a asynchronous command. +// Note: All clients should implement this callback. +// --------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::HandlePlaybackCommandComplete( CMPXCommand* aCommandResult, TInt aError ) + { + iLog->Log(_L("Cmpxharvestertest::HandlePlaybackCommandComplete: Error %d"), aError); + } + // ----------------------------------------------------------------------------- // Cmpxplaybackutilitytest::Delete // Delete here all resources allocated and opened from test methods. @@ -45,7 +132,58 @@ #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API iFile64.Close(); #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + iFile.Close(); iFs.Close(); + iExpectedEventArray->ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::CreateL +// Create here all resources needed for test methods. +// Called from ConstructL(). +// ----------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::CreateL() + { + iFs.Connect(); + iFs.ShareProtected(); + + iExpectedEventArray = new (ELeave) CArrayPtrFlat( 1 ); + iCallbackError = KErrNone; + iMPXPlaybackUtility = NULL; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::AddExpectedEventL +// ----------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::AddExpectedEventL( TInt aEvent, TInt aType, TInt aData ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::AddExpectedEventL() event = %d type = %d value = %d"), + aEvent, aType, aData ); + + TMpxPlaybackTestEvent* event = new (ELeave) TMpxPlaybackTestEvent; + event->iEvent = aEvent; + event->iType = aType; + event->iData = aData; + iExpectedEventArray->AppendL( event ); + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::RemoveExpectedEventL +// ----------------------------------------------------------------------------- +// +void Cmpxplaybackutilitytest::RemoveExpectedEventL( TInt aEvent, TInt aType, TInt aData ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::RemoveExpectedEventL() event = %d type = %d value = %d"), + aEvent, aType, aData ); + + if ( (iExpectedEventArray->Count() > 0) && + ((*iExpectedEventArray)[0]->iEvent == aEvent) ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::RemoveExpectedEventL() event = %d removed."), aEvent); + iExpectedEventArray->Delete( 0 ); + } } // ----------------------------------------------------------------------------- @@ -53,32 +191,38 @@ // Run specified method. Contains also table of test mothods and their names. // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::RunMethodL( - CStifItemParser& aItem ) +TInt Cmpxplaybackutilitytest::RunMethodL( CStifItemParser& aItem ) { - static TStifFunctionInfo const KFunctions[] = { // Copy this line for every implemented function. // First string is the function name used in TestScripter script file. // Second is the actual implementation member function. - + + //ADD NEW ENTRY HERE + // [test cases entries] - Do not remove ENTRY( "MMPXPlaybackUtilityNewL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL ), + ENTRY( "MMPXPlaybackUtilityNewWithCatL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL ), ENTRY( "MMPXPlaybackUtilityUtilityL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL ), + ENTRY( "MMPXPlaybackUtilityUtilityWithCatL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL ), + ENTRY( "MMPXPlaybackUtilityInitWithPlaylistL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL ), + ENTRY( "MMPXPlaybackUtilityInitWithUriL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL ), + ENTRY( "MMPXPlaybackUtilityInitWithRFileL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL ), + ENTRY( "MMPXPlaybackUtilityInitStreamingWithUriL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL ), + ENTRY( "MMPXPlaybackUtilityInitStreamingWithRFileL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL ), ENTRY( "MMPXPlaybackUtilityInit64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L ), ENTRY( "MMPXPlaybackUtilityInitStreaming64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L ), ENTRY( "MMPXPlaybackUtilityFile64L", Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L ), - - //ADD NEW ENTRY HERE - // [test cases entries] - Do not remove - + ENTRY( "MMPXPlaybackUtilityAddObserverL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL ), + ENTRY( "MMPXPlaybackUtilityRemoveObserverL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL ), + ENTRY( "MMPXPlaybackUtilityPlayerManagerSelectPlayerL", Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL ), + ENTRY( "EndTest", Cmpxplaybackutilitytest::EndTest ), }; const TInt count = sizeof( KFunctions ) / sizeof( TStifFunctionInfo ); return RunInternalL( KFunctions, count, aItem ); - } // ----------------------------------------------------------------------------- @@ -87,49 +231,325 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL(CStifItemParser& /*aItem*/) +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL( CStifItemParser& aItem ) { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewL")); TInt err = KErrNone; - - TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL(KPbModeDefault,this )); + TInt mode; + + if ( aItem.GetNextInt(mode) != KErrNone ) + { + iLog->Log(_L("MMPXPlaybackUtilityNewL - Missing playback mode.")); + err = KErrArgument; + return err; + } + + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: mode %d"), mode); + TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL(TUid::Uid(mode), this )); if (err!= KErrNone) { - iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: %d"), err); + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewL: error %d"), err); } return err; } // ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL +// NewL test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityNewWithCatL")); + TInt err = KErrNone; + TInt mode; + TInt category; + if ( aItem.GetNextInt(category) != KErrNone ) + { + iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing category.")); + err = KErrArgument; + return err; + } + + if ( aItem.GetNextInt(mode) != KErrNone ) + { + iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing playback mode.")); + err = KErrArgument; + return err; + } + + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: category %d"), category); + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: mode %d"), mode); + TRAP( err,iMPXPlaybackUtility = MMPXPlaybackUtility::NewL((TMPXCategory)category, TUid::Uid(mode), this )); + + if (err!= KErrNone) + { + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityNewWithCatL: error %d"), err); + } + return err; + } + +// ----------------------------------------------------------------------------- // Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL // UtilityL test method function. // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL(CStifItemParser& /*aItem*/) +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL( CStifItemParser& aItem ) { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityL")); TInt err = KErrNone; + TInt mode = 0; - TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL()); + aItem.GetNextInt(mode); + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: mode %d"), mode); + if ( mode ) + { + TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL(TUid::Uid(mode))); + } + else + { + TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL()); + } - if (err!= KErrNone) - { - iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: %d"), err); - } + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityL: error %d"), err); return err; } // ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL +// UtilityL test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityUtilityWithCatL")); + TInt err = KErrNone; + TInt category; + TInt mode = 0; + + if ( aItem.GetNextInt(category) != KErrNone ) + { + iLog->Log(_L("MMPXPlaybackUtilityNewWithCatL - Missing category.")); + err = KErrArgument; + return err; + } + + aItem.GetNextInt(mode); + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: category %d"), category); + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: mode %d"), mode); + if ( mode ) + { + TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL((TMPXCategory)category, TUid::Uid(mode))); + } + else + { + TRAP(err,iMPXPlaybackUtility = MMPXPlaybackUtility::UtilityL((TMPXCategory)category)); + } + + iLog->Log(_L("Cmpxharvestertest::MMPXPlaybackUtilityUtilityWithCatL: error %d"), err); + + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL +// InitL(CMPXCollectionPlaylist) test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL( CStifItemParser& /*aItem*/ ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL")); + TInt err = KErrNone; + CMPXCollectionPlaylist* playlist = CMPXCollectionPlaylist::NewL(); + CleanupStack::PushL(playlist); + TRAP(err,iMPXPlaybackUtility->InitL(*playlist)); + CleanupStack::PopAndDestroy(playlist); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithPlaylistL - error=%d"),err); + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL +// InitL(Uri) test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL")); + TInt err = KErrNone; + TPtrC string; + + if( aItem.GetNextString( string ) == KErrNone ) + { + TBuf<120> uri; + uri.Append(KmpxplaybackutilityTestFilePath); + uri.Append(string); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL - uri = %S."), &uri); + TRAP(err,iMPXPlaybackUtility->InitL(uri)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithUriL - error=%d"),err); + } + else + { + iLog->Log(_L("MMPXPlaybackUtilityInitWithUriL - Missing file name.")); + err = KErrArgument; + } + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL +// Init64L test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL")); + TInt err = KErrNone; + TPtrC string; + + if( aItem.GetNextString( string ) == KErrNone ) + { + TBuf<120> KFrom; + KFrom.Append(KmpxplaybackutilityTestFilePath); + KFrom.Append(string); + if ( iFile.SubSessionHandle() ) + { + iFile.Close(); + } + err = iFile.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters); + if ( err == KErrNone ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL - Open passed.")); + TRAP(err,iMPXPlaybackUtility->InitL(iFile)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } + } + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitWithRFileL - error=%d"),err); + } + else + { + iLog->Log(_L("MMPXPlaybackUtilityInitWithRFileL - Missing file name.")); + err = KErrArgument; + } + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL +// InitStreamingL(Uri) test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL")); + TInt err = KErrNone; + TPtrC string; + TInt accessPoint = 1; + + if( aItem.GetNextString( string ) == KErrNone ) + { + TBuf<120> uri; + uri.Append(KmpxplaybackutilityTestFilePath); + uri.Append(string); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL - uri = %S."), &uri); + TRAP(err,iMPXPlaybackUtility->InitStreamingL(uri, NULL, accessPoint)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithUriL - error=%d"),err); + } + else + { + iLog->Log(_L("MMPXPlaybackUtilityInitStreamingWithUriL - Missing file name.")); + err = KErrArgument; + } + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL +// InitStreamingL(RFile) test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL( CStifItemParser& aItem ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL")); + TInt err = KErrNone; + TPtrC string; + TInt accessPoint = 1; + + if( aItem.GetNextString( string ) == KErrNone ) + { + TBuf<120> KFrom; + KFrom.Append(KmpxplaybackutilityTestFilePath); + KFrom.Append(string); + if ( iFile.SubSessionHandle() ) + { + iFile.Close(); + } + err = iFile.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters); + if ( err == KErrNone ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL - Open passed.")); + TRAP(err,iMPXPlaybackUtility->InitStreamingL(iFile, accessPoint)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } + } + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreamingWithRFileL - error=%d"),err); + } + else + { + iLog->Log(_L("MMPXPlaybackUtilityInitStreamingWithRFileL - Missing file name.")); + err = KErrArgument; + } + return err; + } + +// ----------------------------------------------------------------------------- // Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L // Init64L test method function. // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L(CStifItemParser& aItem) +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L( CStifItemParser& aItem ) { - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() begin")); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L")); TInt err = KErrNone; #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API err = KErrNotSupported; @@ -149,10 +569,18 @@ err = iFile64.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters); if ( err == KErrNone ) { - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() Open passed.")); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L - Open passed.")); TRAP(err,iMPXPlaybackUtility->Init64L(iFile64)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } } - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L testing Init64L() error=%d"),err); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInit64L - error=%d"),err); } else { @@ -169,13 +597,13 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L(CStifItemParser& aItem) +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L( CStifItemParser& aItem ) { - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() begin")); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L")); TInt err = KErrNone; #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API err = KErrNotSupported; - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() error=%d"),err); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - error=%d"),err); #else // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API TPtrC string; TInt accessPoint = 1; @@ -192,10 +620,18 @@ err = iFile64.Open(iFs, KFrom, EFileRead | EFileShareReadersOrWriters); if ( err == KErrNone ) { - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() Open passed.")); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - Open passed.")); TRAP(err,iMPXPlaybackUtility->InitStreaming64L(iFile64, accessPoint)); + + if ( !err ) + { + TInt event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EPlayerChanged; + AddExpectedEventL(event, 0, 0); + event = KGeneralPlaybackMsgOffset + TMPXPlaybackMessage::EInitializeComplete; + AddExpectedEventL(event, 0, 0); + } } - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L testing InitStreaming64L() error=%d"),err); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityInitStreaming64L - error=%d"),err); } else { @@ -212,22 +648,106 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L(CStifItemParser& /*aItem*/) +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L( CStifItemParser& /*aItem*/ ) { - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() begin")); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L")); TInt err = KErrNone; #ifndef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API err = KErrNotSupported; - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() error=%d"),err); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L - error=%d"),err); #else // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API - RFile64* file64Ptr; + RFile64* file64Ptr=NULL; TRAP(err, file64Ptr=iMPXPlaybackUtility->Source()->File64L()); if ( !file64Ptr->SubSessionHandle() ) { iLog->Log(_L("MMPXPlaybackUtilityFile64L - file64 = NULL.")); } - iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L testing File64L() error=%d"),err); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityFile64L - error=%d"),err); #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API return err; } +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL +// AddObserverL test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL( CStifItemParser& /*aItem*/ ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL")); + TInt err = KErrNone; + TRAP(err, iMPXPlaybackUtility->AddObserverL(*this)); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityAddObserverL - error=%d"),err); + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL +// RemoveObserverL test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL( CStifItemParser& /*aItem*/ ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL")); + TInt err = KErrNone; + TRAP(err, iMPXPlaybackUtility->RemoveObserverL(*this)); + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityRemoveObserverL - error=%d"),err); + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL +// RemoveObserverL test method function. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL(CStifItemParser& aItem) + { + iLog->Log(_L("Cmpxplaybackutilitytest::MMPXPlaybackUtilityPlayerManagerSelectPlayerL")); + TInt uidInt; + TInt err = KErrNone; + + // read in UID + if ( aItem.GetNextInt(uidInt) != KErrNone ) + { + iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - Missing UID.")); + err = KErrArgument; + return err; + } + + iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - UID = 0x%x."), uidInt); + if ( iMPXPlaybackUtility ) + { + MMPXPlayerManager& manager = iMPXPlaybackUtility->PlayerManager(); + TRAP( err, manager.SelectPlayerL( TUid::Uid(uidInt) ) ); + iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - SelectPlayer err = %d."), err); + } + else + { + iLog->Log(_L("MMPXPlaybackUtilityPlayerManagerSelectPlayerL - MPX Playback Utility not created.")); + err = KErrGeneral; + } + return err; + } + +// ----------------------------------------------------------------------------- +// Cmpxplaybackutilitytest::EndTest +// ----------------------------------------------------------------------------- +// +TInt Cmpxplaybackutilitytest::EndTest( CStifItemParser& /*aItem*/ ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::EndTest")); + TInt err = iCallbackError; + + // check if event queue is empty + if ( !err && (iExpectedEventArray->Count() > 0 ) ) + { + iLog->Log(_L("Cmpxplaybackutilitytest::EndTest error = KErrTimedOut")); + err = KErrTimedOut; + } + return err; + } + +// end of file diff -r 835a21e50645 -r 37df1c05d427 mmappfw_plat/mtp_keys_api/group/bld.inf --- a/mmappfw_plat/mtp_keys_api/group/bld.inf Fri Feb 26 18:11:38 2010 +0000 +++ b/mmappfw_plat/mtp_keys_api/group/bld.inf Fri Apr 02 16:24:05 2010 +0100 @@ -23,4 +23,4 @@ DEFAULT PRJ_EXPORTS -../inc/MtpPrivatePSKeys.h MW_LAYER_PLATFORM_EXPORT_PATH(MtpPrivatePSKeys.h) +../inc/mtpprivatepskeys.h MW_LAYER_PLATFORM_EXPORT_PATH(mtpprivatepskeys.h) diff -r 835a21e50645 -r 37df1c05d427 mpx/collectionframework/collectionengine/src/mpxcollectionclientcontext.cpp --- a/mpx/collectionframework/collectionengine/src/mpxcollectionclientcontext.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/collectionframework/collectionengine/src/mpxcollectionclientcontext.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -2440,7 +2440,11 @@ // Check for open playlist only mode. If in that mode, do not return the media // from the cache but call the plugin to open, as that will callback a // different HandleOpenL() with the collection path instead. - TMPXOpenMode mode( iBrowsePath->OpenNextMode() ); + TMPXOpenMode mode = EMPXOpenDefault; + if(iBrowsePath) + { + mode = iBrowsePath->OpenNextMode(); + } CMPXCollectionPlugin* plugin = LoadedPlugin(EContextBrowse); if ( !iFilter && mode != EMPXOpenPlaylistOnly ) { diff -r 835a21e50645 -r 37df1c05d427 mpx/commonframework/common/src/mpxclientlist.cpp --- a/mpx/commonframework/common/src/mpxclientlist.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/commonframework/common/src/mpxclientlist.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -24,6 +24,41 @@ #include "mpxclientlist.h" #include +// ============================ LOCAL FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// Searches process id for target selector plugin. +// When the player has been opened in a mode, which is bound to the same engine +// than certain application's engine, then need to fetch its process id. +// (As a reference for parameter aMode see MMPXPlaybackUtility modes.) +// Otherwise target selector plugin is notified wrongly about registered client +// and key events are not propagated to correct application. +// ---------------------------------------------------------------------------- +// +static void FindProcessIdForTsp( TInt aMode, TProcessId& aProcessId ) + { + TBool processFound( EFalse ); + TFindProcess processFinder; + TFullName processName; + + while ( processFinder.Next( processName ) == KErrNone && !processFound ) + { + RProcess process; + TInt err = process.Open( processFinder ); + if( err == KErrNone ) + { + if( process.SecureId().iId == aMode && process.ExitType() == EExitPending ) + { + MPX_DEBUG4("FindProcessIdForTsp(): pid changed from %d to %d (mode 0x%x)", + TUint(aProcessId), TUint(process.Id()), aMode); + aProcessId = process.Id(); + processFound = ETrue; + } + process.Close(); + } + } + } + // ============================ MEMBER FUNCTIONS ============================== // ---------------------------------------------------------------------------- @@ -109,6 +144,7 @@ iClientProcesses.AppendL(pid); if (iObserver) { + FindProcessIdForTsp(aMode, pid); iObserver->HandleClientChange(pid, MMPXClientlistObserver::EAdd); } } @@ -140,6 +176,7 @@ iClientProcesses.AppendL(pid); if (iObserver) { + FindProcessIdForTsp(aMode, pid); iObserver->HandleClientChange(pid, MMPXClientlistObserver::EAdd); } } @@ -176,7 +213,9 @@ { if (iObserver) { - iObserver->HandleClientChange(id->iPid, MMPXClientlistObserver::ERemove); + TProcessId pid(id->iPid); + FindProcessIdForTsp(id->iMode, pid); + iObserver->HandleClientChange(pid, MMPXClientlistObserver::ERemove); } iClientProcesses.Remove(i); } @@ -493,8 +532,8 @@ : iTid(aTid), iPid(aPid), iMode(aMode), - iMsgQueue(aMsgQueue), - iCategory(aCategory) + iCategory(aCategory), + iMsgQueue(aMsgQueue) {} // ----------------------------------------------------------------------------- diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h --- a/mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/inc/mpxautoresumehandler.h Fri Apr 02 16:24:05 2010 +0100 @@ -136,6 +136,11 @@ * in that case */ TBool IsPlaybackRemote(); + + /** + * Handle change in voice command state. + */ + void DoHandleVoiceCmdChange(); private: // data CMPXPlaybackEngine& iEngine; @@ -148,6 +153,10 @@ // Timer for resume operation. Owned. CPeriodic* iResumeTimer; + + CMPXPSKeyWatcher* iVoiceCmdObserver; // owned + TBool iPausedForVoiceCmd; + TBool iVoiceCmdResumeOngoing; }; #endif // CMPXAUTORESUMEHANDLER_H diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/inc/mpxplaybackengine.h --- a/mpx/playbackframework/playbackengine/inc/mpxplaybackengine.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/inc/mpxplaybackengine.h Fri Apr 02 16:24:05 2010 +0100 @@ -857,11 +857,16 @@ void SavePlaybackCompleteInfoL(); /** - * Restore playback position and state if it was saved previously + * Restore playback position if it was saved previously */ - void RestorePlaybackPositionAndStateL( const CMPXMedia& aMedia ); + void RestorePlaybackPositionL( const CMPXMedia& aMedia ); /** + * Restore playback state if it was saved previously + */ + void RestorePlaybackStateL(); + + /** * Sets the volume increment depending on accessory state */ void SetVolumeIncrement( TMPXPlaybackAccessoryMode aMode ); @@ -1031,6 +1036,9 @@ #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API RFile64 iFile64; #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + + TInt iPositionFromMedia; + }; #include "mpxplaybackengine.inl" diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/inc/mpxplaybackinitializer.h --- a/mpx/playbackframework/playbackengine/inc/mpxplaybackinitializer.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/inc/mpxplaybackinitializer.h Fri Apr 02 16:24:05 2010 +0100 @@ -193,7 +193,7 @@ /** * Initialize streaming */ - void InitL(const TDesC& aUri, const TDesC8& aType, TInt aAccessPoint); + void InitL(const TDesC& aUri, const TDesC8& aType ); private: /** diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp --- a/mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/src/mpxautoresumehandler.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -25,10 +25,23 @@ // CONSTANTS const TInt KMPXErrDiedTimeout = 2000000; - // Time to wait before resume after call has ended. const TInt KMPXResumeWaitTime = 3000000; // 3.0s +// TODO: the following constants and definitions are copied from nssvascoreconstant.h, which is not +// included directly because it is an App layer API. Way to fix this is to ask Speechsrv to move the header file to MW layer. +const TUid KSINDUID = {KUidSystemCategoryValue}; +const TInt ERecognitionState=0; + +// Recognition state values for the P&S key ERecognitionState +enum TRecognitionStateValues + { + ERecognitionStarted = 0, + ERecognitionSpeechEnd, + ERecognitionSuccess, + ERecognitionFail + }; +// End TODO // ================= MEMBER FUNCTIONS ======================= @@ -60,6 +73,9 @@ // Listen to call type changes iTypeObserver = CMPXPSKeyWatcher::NewL(KPSUidCtsyCallInformation, KCTsyCallType,this); + + iVoiceCmdObserver = CMPXPSKeyWatcher::NewL( KSINDUID, ERecognitionState, this ); + iResumeTimer = CPeriodic::NewL(CActive::EPriorityStandard); } @@ -88,6 +104,7 @@ // CMPXAutoResumeHandler::~CMPXAutoResumeHandler() { + delete iVoiceCmdObserver; delete iStateObserver; delete iTypeObserver; if ( iResumeTimer ) @@ -135,13 +152,15 @@ MPX_DEBUG2("CMPXAutoResumeHandler::HandlePlaybackComplete(%d) entering", aError); iPausedForCall = EFalse; if ( KErrDied == aError || - KErrAccessDenied == aError ) + KErrAccessDenied == aError || + KErrInUse == aError ) { iKErrDiedTime.HomeTime(); TInt callType = EPSCTsyCallTypeNone; TInt callState = EPSCTsyCallStateNone; - + TInt voiceCmdState(0); + if (!iTypeObserver->GetValue(callType) && !iStateObserver->GetValue(callState)) { @@ -155,8 +174,16 @@ iPausedForCall = ETrue; } } + + if ( !iPausedForCall && !iVoiceCmdObserver->GetValue( voiceCmdState ) ) // key exist if voice commanding is in progress + { + // Paused due voice command activity + iPausedForVoiceCmd = ETrue; + } } - MPX_DEBUG1("CMPXAutoResumeHandler::HandlePlaybackComplete() exiting"); + + MPX_DEBUG3("CMPXAutoResumeHandler::HandlePlaybackComplete() exiting: iPausedForCall=%d, iPausedForVoiceCmd=%d", + iPausedForCall, iPausedForVoiceCmd); } // ----------------------------------------------------------------------------- @@ -175,10 +202,18 @@ // CMPXAutoResumeHandler::HandlePSEvent // ----------------------------------------------------------------------------- // -void CMPXAutoResumeHandler::HandlePSEvent(TUid /*aUid*/, TInt /*aKey*/) +void CMPXAutoResumeHandler::HandlePSEvent(TUid aUid, TInt /*aKey*/) { MPX_FUNC("CMPXAutoResumeHandler::HandlePSEvent()"); - TRAP_IGNORE(DoHandleStateChangeL()); + + if ( aUid == KSINDUID ) + { + DoHandleVoiceCmdChange(); + } + else + { + TRAP_IGNORE(DoHandleStateChangeL()); + } } // ----------------------------------------------------------------------------- @@ -246,6 +281,19 @@ iPausedForCall = ETrue; } } + + if ( shouldPause && iVoiceCmdResumeOngoing ) + { + // Resume timer has been started after a voice command, cancel it now + // so that playback is not resumed while calling + if ( iResumeTimer->IsActive() ) + { + iResumeTimer->Cancel(); + } + iVoiceCmdResumeOngoing = EFalse; + iPausedForCall = ETrue; // resume playback once call has been ended + } + MPX_DEBUG2("CMPXAutoResumeHandler::DoHandleStateChangeL(): iPausedForCall = %d", iPausedForCall); } @@ -317,6 +365,8 @@ { MPX_FUNC("CMPXAutoResumeHandler::HandleResumeTimerCallback() entering"); + iVoiceCmdResumeOngoing = EFalse; + CancelResumeTimer(); TRAP_IGNORE( iEngine.HandleCommandL( EPbCmdPlayWithFadeIn )); } @@ -374,4 +424,39 @@ iAutoResume = aAutoResume; } +// ----------------------------------------------------------------------------- +// CMPXAutoResumeHandler::DoHandleVoiceCmdChange +// ----------------------------------------------------------------------------- +// +void CMPXAutoResumeHandler::DoHandleVoiceCmdChange() + { + MPX_FUNC("CMPXAutoResumeHandler::DoHandleVoiceCmdChange()"); + + TInt voiceCmdState( 0 ); + TInt err( iVoiceCmdObserver->GetValue( voiceCmdState ) ); + + MPX_DEBUG4("CMPXAutoResumeHandler::DoHandleVoiceCmdChange(): iPausedForVoiceCmd = %d, err=%d, state=%d", + iPausedForVoiceCmd, err, voiceCmdState); + + if ( iPausedForVoiceCmd && !iPausedForCall ) + { + if ( err == KErrNotFound ) // voice command has been finished once the P&S key is deleted + { + if ( iResumeTimer->IsActive() ) + iResumeTimer->Cancel(); + + iResumeTimer->Start( KMPXResumeWaitTime, KMPXResumeWaitTime, TCallBack(ResumeTimerCallback, this) ); + + iPausedForVoiceCmd = EFalse; + + iVoiceCmdResumeOngoing = ETrue; // flag for cancelling resume timer due to a call + } + } + + if ( iPausedForCall ) // ensure that not interfering with call handling in any circumstances + { + iPausedForVoiceCmd = EFalse; + } + } + // End of File diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp --- a/mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/src/mpxplaybackengine.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -109,6 +109,7 @@ iState(EPbStateNotInitialised), iNextState(EPbStateNotInitialised), iPluginState(EPbStateNotInitialised), + iCategory(EMPXCategoryUndefined), iModeId(aModeId), iObserver(aObserver), iPreservedState( EPbStateNotInitialised ), @@ -116,7 +117,8 @@ iSkipping(EFalse), iPluginUid(KNullUid), iLastActiveProcess(KNullProcessId), - iLastInactiveProcess(KNullProcessId) + iLastInactiveProcess(KNullProcessId), + iPositionFromMedia( KErrNotFound ) { iProperties[EPbPropertyVolumeRamp]=KPbFadeInDurationMicroSeconds; } @@ -140,6 +142,7 @@ iNextState(EPbStateNotInitialised), iPluginState(EPbStateNotInitialised), iModeId(aModeId), + iCategory(aCategory), iObserver(aObserver), iPreservedState( EPbStateNotInitialised ), iPreservedPosition( KErrNotFound ), @@ -147,7 +150,7 @@ iPluginUid(KNullUid), iLastActiveProcess(KNullProcessId), iLastInactiveProcess(KNullProcessId), - iCategory(aCategory) + iPositionFromMedia( KErrNotFound ) { iProperties[EPbPropertyVolumeRamp]=KPbFadeInDurationMicroSeconds; } @@ -180,16 +183,24 @@ iMediaHelper = CMPXPlaybackMediaHelper::NewL( *this ); iDummyMediaObserver = new(ELeave) CMPXPlaybackDummyMediaObserver(); - // Select local plugin by default if none selected - iPluginHandler->SelectPlayersL( EPbLocal ); - iInitVolume = ETrue; + iInitVolume = EFalse; + + if (iCategory != EMPXCategoryVideo) + { + // Select local plugin by default if none selected + iPluginHandler->SelectPlayersL( EPbLocal ); + iInitVolume = ETrue; + iPluginHandler->Plugin()->PropertyL( EPbPropertyVolume ); + } + #if defined(__HIGH_RESOLUTION_VOLUME) iVolRoundedUp = EFalse; #endif - iPluginHandler->Plugin()->PropertyL( EPbPropertyVolume ); + iSyncMsgTimer = CPeriodic::NewL( CActive::EPriorityIdle ); iSyncMsgWait = new (ELeave) CActiveSchedulerWait; - } + iProperties[EPbPropertyPosition] = 0; + } // ---------------------------------------------------------------------------- // Destructor @@ -304,8 +315,11 @@ TMPXPlaybackMessage::EInitializeComplete, 0, EFalse)); - - iPluginUid = iPluginHandler->Plugin()->Uid(); + + if ( iPluginHandler->PlayerFound() ) + { + iPluginUid = iPluginHandler->Plugin()->Uid(); + } RArray dummy; CleanupClosePushL( dummy ); @@ -970,7 +984,8 @@ TMPXPlaybackMessage( TMPXPlaybackMessage::EStateChanged, iState, aError )); if ( KErrDied == aError || - KErrAccessDenied == aError ) + KErrAccessDenied == aError || + KErrInUse == aError ) { iPluginState = EPbStateNotInitialised; // fixed @@ -1464,10 +1479,6 @@ iProperties[EPbPropertyPosition] = 0; } - // Set position to restore saved position. - TRAP_IGNORE( // uPnP leaves if set position in stop state - PluginL()->SetL( EPbPropertyPosition, iProperties[EPbPropertyPosition] )); - iAutoResumeHandler->HandleOpenFileComplete(); // Check if playback should not be started automatically. @@ -1995,6 +2006,18 @@ SetStateL( msg ); iProperties[EPbPropertyPosition]=0; + if ( KErrNotFound != iPreservedPosition ) + { + iProperties[EPbPropertyPosition] = iPreservedPosition; + iPreservedPosition = KErrNotFound; + } + else if ( KErrNotFound != iPositionFromMedia ) + { + iProperties[EPbPropertyPosition] = iPositionFromMedia; + iPositionFromMedia = KErrNotFound; + } + MPX_DEBUG2("CMPXPlaybackEngine::InitL iPropertyPosition %d", iProperties[EPbPropertyPosition] ); + // make sure our interface is supported CDesCArray* interfaces = iPluginHandler->SupportedInterfacesL( p->Uid() ); TBool version2InterfaceSupported = EFalse; @@ -2018,22 +2041,22 @@ { if (aSong && aType) { - plugin->InitStreamingL( *aSong, *aType, aAccessPoint ); + plugin->InitStreamingL( *aSong, *aType, aAccessPoint, iProperties[EPbPropertyPosition] ); } else if (aFile) { - plugin->InitStreamingL( *aFile, aAccessPoint ); + plugin->InitStreamingL( *aFile, aAccessPoint, iProperties[EPbPropertyPosition] ); } } else { if (aSong && aType) { - plugin->InitialiseL( *aSong ); + plugin->InitialiseWithPositionL( *aSong, iProperties[EPbPropertyPosition] ); } else if (aFile) { - plugin->InitialiseL( *aFile ); + plugin->InitialiseWithPositionL( *aFile, iProperties[EPbPropertyPosition] ); } } } @@ -2256,6 +2279,7 @@ } else { + RestorePlaybackPositionL( aMedia ); TRAP( aError, InitL( iUri, mimeType, NULL, iAccessPoint) ); /* // 20 steps fix @@ -2284,7 +2308,7 @@ */ if ( KErrNone == aError ) { - RestorePlaybackPositionAndStateL( aMedia ); + RestorePlaybackStateL(); } else { @@ -3468,36 +3492,37 @@ // Restore playback position if it was saved previously // ---------------------------------------------------------------------------- // -void CMPXPlaybackEngine::RestorePlaybackPositionAndStateL( +void CMPXPlaybackEngine::RestorePlaybackPositionL( const CMPXMedia& aMedia ) { - MPX_DEBUG1("CMPXPlaybackEngine::RestorePlaybackPositionAndStateL() entering"); + MPX_FUNC("CMPXPlaybackEngine::RestorePlaybackPositionL() "); // Restore Position iProperties[EPbPropertyPosition] = 0; - if ( KErrNotFound != iPreservedPosition ) - { - iProperties[EPbPropertyPosition] = iPreservedPosition; - iPreservedPosition = KErrNotFound; - } - else - { + // Check media if (aMedia.IsSupported(KMPXMediaGeneralLastPlaybackPosition)) { - iProperties[EPbPropertyPosition] = - aMedia.ValueTObjectL( KMPXMediaGeneralLastPlaybackPosition ); + iPositionFromMedia = + aMedia.ValueTObjectL( KMPXMediaGeneralLastPlaybackPosition ); } - } + MPX_DEBUG2("CMPXPlaybackEngine::RestorePlaybackPositionL iPositionFromMedia %d", iPositionFromMedia ); + } + +// ---------------------------------------------------------------------------- +// Restore playback state if it was saved previously +// ---------------------------------------------------------------------------- +// +void CMPXPlaybackEngine::RestorePlaybackStateL() + { + MPX_FUNC("CMPXPlaybackEngine::RestorePlaybackStateL() "); // Restore State if ( EPbStateNotInitialised != iPreservedState ) { iNextState = iPreservedState; iPreservedState = EPbStateNotInitialised; - } - - MPX_DEBUG1("CMPXPlaybackEngine::RestorePlaybackPositionAndStateL() exiting"); + } } // ---------------------------------------------------------------------------- @@ -3832,6 +3857,18 @@ SetStateL( msg ); iProperties[EPbPropertyPosition]=0; + if ( KErrNotFound != iPreservedPosition ) + { + iProperties[EPbPropertyPosition] = iPreservedPosition; + iPreservedPosition = KErrNotFound; + } + else if ( KErrNotFound != iPositionFromMedia ) + { + iProperties[EPbPropertyPosition] = iPositionFromMedia; + iPositionFromMedia = KErrNotFound; + } + MPX_DEBUG2("CMPXPlaybackEngine::InitL iPropertyPosition %d", iProperties[EPbPropertyPosition] ); + // Check if version2 interface is supported. CDesCArray* interfaces = iPluginHandler->SupportedInterfacesL( p->Uid() ); TBool version2InterfaceSupported = EFalse; @@ -3853,11 +3890,11 @@ { if ( iAccessPointSet ) { - plugin->InitStreaming64L( *aFile, aAccessPoint ); + plugin->InitStreaming64L( *aFile, aAccessPoint, iProperties[EPbPropertyPosition] ); } else { - plugin->Initialise64L( *aFile ); + plugin->Initialise64L( *aFile, iProperties[EPbPropertyPosition] ); } } else diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackengine/src/mpxplaybackinitializer.cpp --- a/mpx/playbackframework/playbackengine/src/mpxplaybackinitializer.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackengine/src/mpxplaybackinitializer.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -424,7 +424,8 @@ { if ( iMedia ) { - iEngine.RestorePlaybackPositionAndStateL( *iMedia ); + iEngine.RestorePlaybackPositionL( *iMedia ); + iEngine.RestorePlaybackStateL(); } // // Set plug-in handler @@ -620,13 +621,8 @@ { iHandler->SelectPlayersL(t); } - } - TInt accessPoint = 0; - if ( aMedia.IsSupported(KMPXMediaGeneralExtAccessPoint) ) - { - accessPoint = aMedia.ValueTObjectL( KMPXMediaGeneralExtAccessPoint ); - MPX_DEBUG2("CMPXPlaybackInitializer::InitL accessPoint %d", accessPoint ); - } + } + HBufC8* mimeType = MPXUser::Alloc8L(aMedia.ValueText(KMPXMediaGeneralMimeType)); CleanupStack::PushL(mimeType); @@ -635,7 +631,7 @@ // Plugin handler guarantee to choose a plugin // In case there is file open in the audio controller iHandler->Plugin()->CommandL(EPbCmdClose); - InitL(uri, *mimeType, accessPoint); + InitL(uri, *mimeType); CleanupStack::PopAndDestroy(mimeType); } else // No URI @@ -840,7 +836,7 @@ // Initialize. // ---------------------------------------------------------------------------- // -void CMPXPlaybackInitializer::InitL(const TDesC& aUri, const TDesC8& aType, TInt aAccessPoint) +void CMPXPlaybackInitializer::InitL(const TDesC& aUri, const TDesC8& aType ) { MPX_FUNC("CMPXPlaybackInitializer::InitL"); CMPXPlaybackPlugin* p = iHandler->Plugin(); @@ -868,14 +864,29 @@ // if cast was successful, then init streaming with access point if (plugin) - { - if ( aAccessPoint ) + { + TInt accessPoint = 0; + if ( iMedia->IsSupported(KMPXMediaGeneralExtAccessPoint) ) { - plugin->InitStreamingL( aUri, aType, aAccessPoint ); + accessPoint = iMedia->ValueTObjectL( KMPXMediaGeneralExtAccessPoint ); + MPX_DEBUG2("CMPXPlaybackInitializer::InitL accessPoint %d", accessPoint ); + } + + TInt position = 0; + if (iMedia->IsSupported(KMPXMediaGeneralLastPlaybackPosition)) + { + position = iMedia->ValueTObjectL( KMPXMediaGeneralLastPlaybackPosition ); + MPX_DEBUG2("CMPXPlaybackInitializer::InitL position %d", position ); + } + + + if ( accessPoint ) + { + plugin->InitStreamingL( aUri, aType, accessPoint, position ); } else { - plugin->InitialiseL(aUri); + plugin->InitialiseWithPositionL(aUri, position); } } else diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackserver/inc/mpxplaybackserver.h --- a/mpx/playbackframework/playbackserver/inc/mpxplaybackserver.h Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackserver/inc/mpxplaybackserver.h Fri Apr 02 16:24:05 2010 +0100 @@ -151,6 +151,15 @@ */ void ConstructL(); + /** + * Process id finder. + * + * @param aEngine pointer to active engine + * @param aProcessId process id of owning process + */ + void FindProcessIdForTsp(const CMPXPlaybackEngine* aEngine, + TProcessId& aProcessId ); + private: // from base class /** * From MMPXPlaybackActiveEngineObserver diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp --- a/mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackserver/src/mpxplaybackserver.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -129,6 +129,42 @@ } // ---------------------------------------------------------------------------- +// Searches process id for target selector plugin. +// When the player has been opened in a mode, which is bound to the same engine +// than certain application's engine, then need to fetch its process id. +// (As a reference for parameter aMode see MMPXPlaybackUtility modes.) +// Otherwise target selector plugin is notified wrongly about client statuses +// and key events are not propagated to correct application. +// ---------------------------------------------------------------------------- +// +void CMPXPlaybackServer::FindProcessIdForTsp( + const CMPXPlaybackEngine* aEngine, + TProcessId& aProcessId ) + { + TBool processFound( EFalse ); + TFindProcess processFinder; + TFullName processName; + + while ( processFinder.Next( processName ) == KErrNone && !processFound ) + { + RProcess process; + TInt err = process.Open( processFinder ); + if( err == KErrNone ) + { + if( process.SecureId().iId == aEngine->ModeId().iUid && + process.ExitType() == EExitPending ) + { + MPX_DEBUG4("CMPXPlaybackServer::FindProcessIdForTsp(): pid changed from %d to %d (mode 0x%x)", + TUint(aProcessId), TUint(process.Id()), aEngine->ModeId().iUid); + aProcessId = process.Id(); + processFound = ETrue; + } + process.Close(); + } + } + } + +// ---------------------------------------------------------------------------- // Increments number of sessions this server holds // ---------------------------------------------------------------------------- // @@ -386,12 +422,13 @@ if (!aActive) { #ifdef RD_TSP_CLIENT_MAPPER + TProcessId lastPid( aEngine->LastActiveProcessId() ); + FindProcessIdForTsp( aEngine, lastPid ); iClientMapper->SetTspTargetClientToOtherType( CTspClientMapper::EStoppedClients, - aEngine->LastActiveProcessId()); - MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to stopped client %d", - TUint( aEngine->LastActiveProcessId())); - + lastPid); + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Added as stopped client %d", + TUint( lastPid)); #endif if (EPbStatePaused != aEngine->State()) { @@ -406,11 +443,20 @@ else {// else aEngine is active player #ifdef RD_TSP_CLIENT_MAPPER - iClientMapper->SetTspTargetClientToOtherType( - CTspClientMapper::EPlayingClients, - aEngine->LastActiveProcessId()); - MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to playing client %d", - TUint( aEngine->LastActiveProcessId())); + TProcessId lastPid( aEngine->LastActiveProcessId() ); + FindProcessIdForTsp( aEngine, lastPid ); + TInt err = iClientMapper->SetTspTargetClientToOtherType( + CTspClientMapper::EPlayingClients, lastPid ); + if ( err != KErrNone && (TUint)lastPid != KNullProcessId ) + { + // Setting target type failed probably because client PID could not be found. + // As a fallback set client as new playing client. + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Adding to playing client %d", + (TUint)lastPid ); + iClientMapper->SetTspTargetClient( CTspClientMapper::EPlayingClients, lastPid ); + } + MPX_DEBUG2("CMPXPlaybackServer::HandleActiveEngineL(): Added as playing client %d", + (TUint)lastPid ); #endif } @@ -466,9 +512,9 @@ if (MMPXClientlistObserver::EAdd == aChangeType) { iClientMapper->SetTspTargetClient( - CTspClientMapper::EPlayingClients, + CTspClientMapper::ERegisteredClients, aPid); - MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Adding to registered client %d", + MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Added as registered client %d", TUint( aPid )); } else @@ -476,7 +522,7 @@ iClientMapper->RemoveTspTargetClient( CTspClientMapper::EPlayingClients, aPid); - MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Adding to EPlayingClients client %d", + MPX_DEBUG2("CMPXPlaybackServer::HandleClientChange(): Removed from EPlayingClients client %d", TUint( aPid )); } #else diff -r 835a21e50645 -r 37df1c05d427 mpx/playbackframework/playbackserver/src/mpxplaybackserversession.cpp --- a/mpx/playbackframework/playbackserver/src/mpxplaybackserversession.cpp Fri Feb 26 18:11:38 2010 +0000 +++ b/mpx/playbackframework/playbackserver/src/mpxplaybackserversession.cpp Fri Apr 02 16:24:05 2010 +0100 @@ -517,9 +517,7 @@ #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API case EPbsSetPrimaryClient: { - TInt error = iPlayer->ClientList()->SetPrimaryClient(*iMessageQueue); - TPckgC handle(error); - aMessage.Write(0, handle); + aMsgHandleResult = iPlayer->ClientList()->SetPrimaryClient(*iMessageQueue); break; } default: diff -r 835a21e50645 -r 37df1c05d427 package_definition.xml --- a/package_definition.xml Fri Feb 26 18:11:38 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -