# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271251011 -10800 # Node ID ee674526fac515f90d2afd718b96100870c6a1ea # Parent dea39715fc05ed9d6a304a3ef6e6c6ce72b79e1c Revision: 201013 Kit: 201015 diff -r dea39715fc05 -r ee674526fac5 imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h --- a/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandling_plat/thumbnailmanager_api/inc/thumbnailmanager.h Wed Apr 14 16:16:51 2010 +0300 @@ -548,6 +548,23 @@ */ virtual void UpdateThumbnailsL( const TThumbnailId aItemId, const TDesC& aPath, const TInt aOrientation, const TInt64 aModified, const TInt aPriority ) = 0; + + /** + * Rename Thumbnails. This is an asynchronous + * operation, which always returns immediately. + * + * @since S60 v5.0 + * @param aCurrentPath Current path of the Thumbnail + * @param aNewPath New path for the Thumbnail + * @param aPriority Priority for this operation + * @return Thumbnail request ID. This can be used to + * cancel the request or change priority. + * The ID is specific to this CThumbnailManager + * instance and may not be shared with other + * instances. + */ + virtual TThumbnailRequestId RenameThumbnailsL( const TDesC& aCurrentPath, + const TDesC& aNewPath, TInt aPriority = CActive::EPriorityIdle ) = 0; }; diff -r dea39715fc05 -r ee674526fac5 imagehandling_plat/thumbnailmanager_api/tsrc/conf/ThumbnailManagerTest.cfg --- a/imagehandling_plat/thumbnailmanager_api/tsrc/conf/ThumbnailManagerTest.cfg Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandling_plat/thumbnailmanager_api/tsrc/conf/ThumbnailManagerTest.cfg Wed Apr 14 16:16:51 2010 +0300 @@ -15,7 +15,6 @@ * */ - [StifSettings] TestThreadStackSize= 32768 TestThreadMinHeap= 4096 @@ -37,25 +36,26 @@ // --------------------------------------------------------------------------- [Define] -KErrNotFound -1 -KErrNotSupported -5 -KErrArgument -6 +KErrNotFound -1 +KErrGeneral -2 +KErrNotSupported -5 +KErrArgument -6 KMaxTInt 2147483647 // Delay between test cases (milliseconds) KTestDelay 1000 -KOneSecondDelay 1000 -KFiveSecondDelay 5000 -KTenSecondDelay 5000 +KOneSecondDelay 1000 +KFiveSecondDelay 5000 +KTenSecondDelay 10000 // A delay to make sure the client-server request to generate a thumbnail // reaches the server, but doesn't have enough time to complete yet // (milliseconds) -KClientServerDelay 150 -KClientServerDelay2 25 -KClientServerDelay3 10 +KClientServerDelay 150 +KClientServerDelay2 25 +KClientServerDelay3 10 // From TDisplayMode: value for 24-bit display mode EColor16M 8 @@ -83,7 +83,10 @@ EVideoFullScreenThumbnailSize 7 EAudioGridThumbnailSize 8 EAudioListThumbnailSize 9 -EAudioFullScreenThumbnailSize 10 +EAudioFullScreenThumbnailSize 10 +EGridThumbnailSize = 11 +EListThumbnailSize = 12 +EFullScreenThumbnailSize = 13 // Custom sizes KCustomSizeX 111 @@ -1594,24 +1597,17 @@ // --------------------------------------------------------------------------- -// Get thumbnail by id +// Create thumbnail with id // --------------------------------------------------------------------------- [Test] -title Get thumbnail by id +title Create thumbnail with id create ThumbnailManagerTest tn tn CreateInstanceL tn SetDisplayModeL EColor16M tn SetThumbnailEnumSizeL EImageGridThumbnailSize tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg 99999 -tn DeleteThumbnails -tn CreateThumbnails -waittestclass tn - -pause KTenSecondDelay - -tn SetFlagsL EDoNotCreate -tn GetThumbnailByIdL 99999 +tn GetThumbnailL waittestclass tn tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M tn DeleteThumbnails @@ -1794,7 +1790,19 @@ tn GetThumbnailL allownextresult KErrNotFound waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance +// delete thumbnail which is not in database yet +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn CreateThumbnails +tn DeleteThumbnails +tn DeleteSourceInstance + +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\Videoclip.mp4 +tn CreateThumbnails tn DeleteThumbnails tn DeleteSourceInstance @@ -1804,89 +1812,10 @@ [Endtest] // --------------------------------------------------------------------------- -// Delete thumbnails by id -// --------------------------------------------------------------------------- -[Test] -title Delete thumbnails by id -create ThumbnailManagerTest tn -tn CreateInstanceL -tn SetDisplayModeL EColor16M - -tn SetThumbnailEnumSizeL EImageGridThumbnailSize -tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg 99999 -tn DeleteThumbnails -tn CreateThumbnails -waittestclass tn - -pause KTenSecondDelay - -tn SetFlagsL EDoNotCreate -tn GetThumbnailByIdL 99999 -waittestclass tn -tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M - -tn DeleteThumbnailsByIdL 99999 -pause KOneSecondDelay - -tn GetThumbnailByIdL 99999 -allownextresult KErrNotFound -waittestclass tn - -tn DeleteSourceInstance -tn DeleteInstance -delete tn -pause KTestDelay -[Endtest] - - -// --------------------------------------------------------------------------- -// Update path +// Delete thumbnail when requests are pending // --------------------------------------------------------------------------- [Test] -title Update path -create ThumbnailManagerTest tn -tn CreateInstanceL -tn SetDisplayModeL EColor16M - -tn SetThumbnailEnumSizeL EImageGridThumbnailSize -tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg 99999 -tn DeleteThumbnails -tn CreateThumbnails -waittestclass tn -tn DeleteSourceInstance - -pause KTenSecondDelay - -tn UpdatePathL 99999 \data\ThumbnailManagerTest\updated_path.bmp -waittestclass tn - -pause KTenSecondDelay - -tn SetFlagsL EDoNotCreate -tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg -tn GetThumbnailL -allownextresult KErrNotFound -waittestclass tn -tn DeleteSourceInstance - -tn CreateSourceInstancePathL \data\ThumbnailManagerTest\updated_path.bmp 99999 -tn GetThumbnailByIdL 99999 -waittestclass tn -tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M -tn DeleteSourceInstance -tn DeleteThumbnailsByIdL 99999 - -tn DeleteInstance -delete tn -pause KTestDelay -[Endtest] - - -// --------------------------------------------------------------------------- -// Delete engine when requests are pending -// --------------------------------------------------------------------------- -[Test] -title Delete engine when requests are pending +title Delete thumbnail when requests are pending create ThumbnailManagerTest tn tn CreateInstanceL @@ -1981,13 +1910,13 @@ // Second request with negative priority tn SetThumbnailSizeL 1 1 tn CreateSourceInstanceHandleL \data\ThumbnailManagerTest\TALL_400x800.bmp -tn GetThumbnailL 0 -50 +tn GetThumbnailL 0 -100 tn DeleteSourceInstance // Third request with positive priority tn SetThumbnailSizeL 40 30 tn CreateSourceInstanceHandleL \data\ThumbnailManagerTest\SVG_640x480.svg -tn GetThumbnailL 0 50 +tn GetThumbnailL 0 0 tn DeleteSourceInstance // First request should complete first, since the server started processing @@ -2120,9 +2049,9 @@ tn DeleteSourceInstance +tn SetThumbnailEnumSizeL EImageGridThumbnailSize tn CreateSourceInstancePathL \data\ThumbnailManagerTest\camera.jpg tn SetFlagsL EDoNotCreate -tn SetThumbnailEnumSizeL EImageGridThumbnailSize tn GetThumbnailL waittestclass tn tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M @@ -2137,3 +2066,283 @@ delete tn pause KTestDelay [Endtest] + +// --------------------------------------------------------------------------- +// Load MP3 thumbnail with PNG album art +// --------------------------------------------------------------------------- +[Test] +title Create MP3 PNG album art thumbnail +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\mp3_png.mp3 +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EAudioFullScreenThumbnailSize +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EAudioFullScreenThumbnailSize EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] + + +// --------------------------------------------------------------------------- +// Test WMA png & empty album arts +// --------------------------------------------------------------------------- +[Test] +title Test WMA png & empty album arts +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +// try to create thumbnail from PNG +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\wma_png.wma +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EAudioFullScreenThumbnailSize +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +// try to create thumbnail without album art +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\wma_empty.wma +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EAudioFullScreenThumbnailSize +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] + +// --------------------------------------------------------------------------- +// Create thumbnail preview with EXIF +// --------------------------------------------------------------------------- +[Test] +title Create thumbnail preview with EXIF +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +// jpg with exif +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn SetQualityPreferenceL EOptimizeForQualityWithPreview +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +// png with exif +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\exif.png +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn SetQualityPreferenceL EOptimizeForQualityWithPreview +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +// no exif +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\no_exif.jpg +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn SetQualityPreferenceL EOptimizeForQualityWithPreview +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] + +// --------------------------------------------------------------------------- +// Create thumbnails by Url +// --------------------------------------------------------------------------- +[Test] +title Create thumbnails by Url +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +// try to create thumbnail from image +tn CreateThumbnailsByUrlL \data\ThumbnailManagerTest\RGB_VGA.jpg +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +// try to create thumbnail from music +tn CreateThumbnailsByUrlL \data\ThumbnailManagerTest\mp3_png.mp3 +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +// try to create thumbnail from video +tn CreateThumbnailsByUrlL \data\ThumbnailManagerTest\Videoclip.mp4 +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] + +// --------------------------------------------------------------------------- +// Get thumbnails +// --------------------------------------------------------------------------- +[Test] +title Get thumbnails +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +// Get thumbnail with url +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn DeleteThumbnails +tn CreateThumbnails +waittestclass tn + +pause KTenSecondDelay + +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +// Get thumbnail with EDoNotCreate flag on +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn SetFlagsL EDoNotCreate +tn DeleteThumbnails +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteThumbnails + +tn DeleteSourceInstance +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] + +// --------------------------------------------------------------------------- +// Run multiple tests +// --------------------------------------------------------------------------- +[Test] +title Run multiple tests +create ThumbnailManagerTest tn +tn CreateInstanceL +tn SetDisplayModeL EColor16M + +// using path +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EImageFullScreenThumbnailSize +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageFullScreenThumbnailSize EColor16M +tn DeleteThumbnails +tn SetThumbnailEnumSizeL ECustomThumbnailSize +tn SetThumbnailSizeL KCustomSizeX KCustomSizeY +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailL KCustomSizeX KCustomSizeY EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +// mp3 using handle +tn CreateSourceInstanceHandleL \data\ThumbnailManagerTest\mp3.mp3 +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EAudioGridThumbnailSize +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EAudioGridThumbnailSize EColor16M +tn DeleteThumbnails +tn SetThumbnailEnumSizeL EAudioFullScreenThumbnailSize +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EAudioFullScreenThumbnailSize EColor16M +tn DeleteThumbnails +tn SetThumbnailEnumSizeL ECustomThumbnailSize +tn SetThumbnailSizeL KCustomSizeX KCustomSizeY +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailL KCustomSizeX KCustomSizeY EColor16M +tn DeleteThumbnails +tn DeleteSourceInstance + +// corrupted file +tn SetThumbnailEnumSizeL ECustomThumbnailSize +tn SetThumbnailSizeL KCustomSizeX KCustomSizeY +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\not_jpg.jpg +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteSourceInstance +tn CreateSourceInstanceBufferL \data\ThumbnailManagerTest\not_jpg.jpg image/jpeg +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteSourceInstance +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\not_3gp.3gp +tn GetThumbnailL +allownextresult KErrNotSupported +waittestclass tn +tn DeleteSourceInstance + +// delete one thumbnail +tn SetThumbnailEnumSizeL EImageGridThumbnailSize +tn CreateSourceInstancePathL \data\ThumbnailManagerTest\RGB_VGA.jpg +tn DeleteThumbnails +tn GetThumbnailL +waittestclass tn +tn CheckThumbnailCenrepL EImageGridThumbnailSize EColor16M +tn DeleteThumbnails +pause KTenSecondDelay +tn SetFlagsL EDoNotCreate +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn + +// delete all persistent thumbnails created +tn SetFlagsL EDefaultFlags +tn CreateThumbnails +waittestclass tn +pause KTenSecondDelay +tn DeleteThumbnails +pause KTenSecondDelay +tn SetFlagsL EDoNotCreate +tn GetThumbnailL +allownextresult KErrNotFound +waittestclass tn +tn DeleteThumbnails +tn DeleteSourceInstance + +tn DeleteInstance +delete tn +pause KTestDelay +[Endtest] \ No newline at end of file diff -r dea39715fc05 -r ee674526fac5 imagehandling_plat/thumbnailmanager_api/tsrc/group/bld.inf --- a/imagehandling_plat/thumbnailmanager_api/tsrc/group/bld.inf Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandling_plat/thumbnailmanager_api/tsrc/group/bld.inf Wed Apr 14 16:16:51 2010 +0300 @@ -44,5 +44,10 @@ ../data/mmc/ThumbnailManagerTest/TestMBM.mbm /epoc32/winscw/c/data/ThumbnailManagerTest/TestMBM.mbm ../data/mmc/ThumbnailManagerTest/mp3.mp3 /epoc32/winscw/c/data/ThumbnailManagerTest/mp3.mp3 ../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/camera.jpg - +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/mp3_png.mp3 +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/no_exif.jpg +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/wma.wma +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/wma_empty.wma +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/wma_png.wma +../data/mmc/ThumbnailManagerTest/camera.jpg /epoc32/winscw/c/data/ThumbnailManagerTest/exif.jpg // End of File diff -r dea39715fc05 -r ee674526fac5 imagehandling_plat/thumbnailmanager_api/tsrc/inc/ThumbnailManagerTest.h --- a/imagehandling_plat/thumbnailmanager_api/tsrc/inc/ThumbnailManagerTest.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandling_plat/thumbnailmanager_api/tsrc/inc/ThumbnailManagerTest.h Wed Apr 14 16:16:51 2010 +0300 @@ -146,7 +146,7 @@ virtual TInt CheckDisplayModeL( CStifItemParser& aItem ); virtual TInt DeleteThumbnails( CStifItemParser& aItem ); - virtual TInt DeleteThumbnailsByIdL( CStifItemParser& aItem ); + virtual TInt CreateThumbnailsByUrlL( CStifItemParser& aItem ); virtual TInt CreateThumbnails( CStifItemParser& aItem ); virtual TInt UpdatePathL( CStifItemParser& aItem ); diff -r dea39715fc05 -r ee674526fac5 imagehandling_plat/thumbnailmanager_api/tsrc/src/ThumbnailManagerTestBlocks.cpp --- a/imagehandling_plat/thumbnailmanager_api/tsrc/src/ThumbnailManagerTestBlocks.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandling_plat/thumbnailmanager_api/tsrc/src/ThumbnailManagerTestBlocks.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -87,7 +87,7 @@ ENTRY( "SetDisplayModeL", CThumbnailManagerTest::SetDisplayModeL ), ENTRY( "CheckDisplayModeL", CThumbnailManagerTest::CheckDisplayModeL ), ENTRY( "DeleteThumbnails", CThumbnailManagerTest::DeleteThumbnails ), - ENTRY( "DeleteThumbnailsByIdL", CThumbnailManagerTest::DeleteThumbnailsByIdL ), + ENTRY( "CreateThumbnailsByUrlL", CThumbnailManagerTest::CreateThumbnailsByUrlL ), ENTRY( "CreateThumbnails", CThumbnailManagerTest::CreateThumbnails ), ENTRY( "UpdatePathL", CThumbnailManagerTest::UpdatePathL ), ENTRY( "GetSupportedMimeTypesL", CThumbnailManagerTest::GetSupportedMimeTypesL ) @@ -735,15 +735,86 @@ return KErrNone; } -TInt CThumbnailManagerTest::DeleteThumbnailsByIdL( CStifItemParser& aItem ) +TInt CThumbnailManagerTest::CreateThumbnailsByUrlL( CStifItemParser& aItem ) { + _LIT( KPanicTxt, "CreateSrcPath" ); + __ASSERT_ALWAYS( !iObjectSource, User::Panic( KPanicTxt, 0 )); + + TPtrC path; + User::LeaveIfError( aItem.GetNextString( path )); + TInt id = 0; - User::LeaveIfError( aItem.GetNextInt( id )); + aItem.GetNextInt( id ); + + TFileName filePath( iDataPath ); + filePath.Append( path ); + filePath.ZeroTerminate(); + + iLog->Log( _L( "CreateSourceInstancePathL - path = %S" ), &filePath ); + + delete iObjectSource; + iObjectSource = NULL; + + iObjectSource = CThumbnailObjectSource::NewL( filePath, id ); - iEngine->DeleteThumbnails( id ); + id = iEngine->CreateThumbnails( *iObjectSource ); + if (id < 0) + { + iLog->Log( _L( "CreateThumbnails - error %d" ), id ); + return id; + } + else + { + iPreviousRequestId = id; + iLog->Log( _L( "CreateThumbnails - request id %d" ), iPreviousRequestId ); + } + + iCreateThumbnails = ETrue; + return KErrNone; } + +/* +TInt CThumbnailManagerTest::GetThumbnailsByUrlL( CStifItemParser& aItem ) + { + _LIT( KPanicTxt, "CreateSrcPath" ); + __ASSERT_ALWAYS( !iObjectSource, User::Panic( KPanicTxt, 0 )); + + TPtrC path; + User::LeaveIfError( aItem.GetNextString( path )); + + TInt id = 0; + aItem.GetNextInt( id ); + TFileName filePath( iDataPath ); + filePath.Append( path ); + filePath.ZeroTerminate(); + + iLog->Log( _L( "CreateSourceInstancePathL - path = %S" ), &filePath ); + + delete iObjectSource; + iObjectSource = NULL; + + iObjectSource = CThumbnailObjectSource::NewL( filePath, id ); + + id = iEngine->GetThumbnailL( *iObjectSource ); + if (id < 0) + { + iLog->Log( _L( "GetThumbnails - error %d" ), id ); + return id; + } + else + { + iPreviousRequestId = id; + iLog->Log( _L( "GetThumbnails - request id %d" ), iPreviousRequestId ); + } + + iCreateThumbnails = ETrue; + + return KErrNone; + } + +*/ TInt CThumbnailManagerTest::CreateThumbnails( CStifItemParser& aItem ) { @@ -773,6 +844,7 @@ return KErrNone; } + TInt CThumbnailManagerTest::UpdatePathL( CStifItemParser& aItem ) { _LIT( KPanicTxt, "UpdatePath" ); diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h --- a/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h Wed Apr 14 16:16:51 2010 +0300 @@ -50,9 +50,18 @@ const TInt KDaemonProcessing = 0x00000040; //insert to temp table first wo indexing and move data to main table as batch -const TUint KMaxBatchItems = 36; +//actual batch size will vary and will be between min...max batch size values below +//minimum batch size +const TUint KMInBatchItems = 3; +//maximum batch size +const TUint KMaxBatchItems = 18; +//Max allowed flush time +const TUint KMaxFlushDelay = 3000; //ms + //how many items daemon will query at once from MDS const TUint KMaxQueryItems = 100; +// max items for PH & AllItems query +const TUint KMaxQueryItems2 = 100; // maximum number of active client side queue requests const TUint KMaxClientRequests = 2; @@ -432,7 +441,7 @@ */ EDeleteThumbnailsById, - EReserved1, + ERenameThumbnails, /** * Update thumbnails by given Id. diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.4_SA_S60.50_Euro1.sis Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.4_SA_S60.50_Euro1.sis has changed diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.5_SA_S60.50_Euro1.sis Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.5_SA_S60.50_Euro1.sis has changed diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg Wed Apr 14 16:16:51 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"Thumbnail Manager"},(0x102830AB), 9, 20, 4, TYPE=SA, RU +#{"Thumbnail Manager"},(0x102830AB), 9, 20, 5, TYPE=SA, RU ; Localised Vendor name %{"Nokia"} diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg Wed Apr 14 16:16:51 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"ThumbnailManager"},(0x102830AB), 9, 20, 4, TYPE=SA +#{"ThumbnailManager"},(0x102830AB), 9, 20, 5, TYPE=SA ; Localised Vendor name %{"Nokia"} diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis has changed diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg Wed Apr 14 16:16:51 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"Thumbnail Manager Cenrep"},(0x10202BE9), 9, 20, 4, TYPE=SP +#{"Thumbnail Manager Cenrep"},(0x10202BE9), 9, 20, 5, TYPE=SP ; Localised Vendor name %{"Symbian Software Ltd."} diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h --- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h Wed Apr 14 16:16:51 2010 +0300 @@ -243,6 +243,13 @@ */ void UpdatePSValues(const TBool aDefine = EFalse); + /** + * Comparison function for logaritmic use of queue arrays + * + * @since S60 v5.0 + */ + static TInt Compare(const TItemId& aLeft, const TItemId& aRight); + private: // not own diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -201,11 +201,62 @@ // CThumbAGProcessor::HandleQueryNewResults() // ----------------------------------------------------------------------------- // -void CThumbAGProcessor::HandleQueryNewResults( CMdEQuery& /*aQuery*/, - const TInt /*aFirstNewItemIndex*/, - const TInt /*aNewItemCount*/ ) +void CThumbAGProcessor::HandleQueryNewResults( CMdEQuery& aQuery, + const TInt aFirstNewItemIndex, + const TInt aNewItemCount ) { - // No implementation required + // PH & AllItems query results are handled here + if (aNewItemCount > 0) + { + if(&aQuery == iQueryPlaceholders) + { + TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults - iQueryPlaceholders, %d new", aNewItemCount); + + for(TInt i = aFirstNewItemIndex; i < iQueryPlaceholders->Count(); i++) + { + const CMdEObject* object = &iQueryPlaceholders->Result(i); + + if(!object) + { + continue; + } + + if(!object->Placeholder()) + { + TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults %d not placeholder", object->Id()); + continue; + } + + // ignore if fails + iPlaceholderQueue.InsertInOrder(object->Id(), Compare); + } + } + else if(&aQuery == iQueryAllItems) + { + TN_DEBUG2( "CThumbAGProcessor::HandleQueryNewResults - QueryAllItems, %d new", aNewItemCount); + + for(TInt i = aFirstNewItemIndex; i < iQueryAllItems->Count(); i++) + { + const CMdEObject* object = &iQueryAllItems->Result(i); + + if(!object) + { + continue; + } + + if (iAddQueue.FindInOrder(object->Id(), Compare) == KErrNotFound && + iModifyQueue.FindInOrder(object->Id(), Compare) == KErrNotFound ) + { + // ignore if fails + iAddQueue.InsertInOrder(object->Id(), Compare); + } + } + } + } + else + { + TN_DEBUG1( "CThumbAGProcessor::HandleQueryNewResults - error, no new items"); + } } // ----------------------------------------------------------------------------- @@ -221,67 +272,28 @@ TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - iQueryPlaceholders completed"); iPlaceholderQueue.Reset(); - // if no errors in query - if (aError == KErrNone ) + + //free query + delete iQueryPlaceholders; + iQueryPlaceholders = NULL; + + if(iDoQueryAllItems) { - for(TInt i = 0; i < iQueryPlaceholders->Count(); i++) - { - const CMdEObject* object = &iQueryPlaceholders->Result(i); - - if(!object) - { - continue; - } - - if(!object->Placeholder()) - { - TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted %d not placeholder", object->Id()); - continue; - } - - /*if (iPlaceholderQueue.Find( object->Id() ) == KErrNotFound) - { - TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted %d added to placeholder queue", object->Id());*/ - TRAP_IGNORE( iPlaceholderQueue.AppendL( object->Id() )); - //} - } - } - delete iQueryPlaceholders; - iQueryPlaceholders = NULL; - - if(iDoQueryAllItems) - { - iDoQueryAllItems = EFalse; - TRAP_IGNORE(QueryAllItemsL()); - } + iDoQueryAllItems = EFalse; + TRAP_IGNORE(QueryAllItemsL()); + } } else if(&aQuery == iQueryAllItems) { TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - QueryAllItems completed"); - // if no errors in query - if (aError == KErrNone ) - { - for(TInt i = 0; i < iQueryAllItems->Count(); i++) - { - const CMdEObject* object = &iQueryAllItems->Result(i); - - if(!object) - { - continue; - } - - if (iAddQueue.Find( object->Id() ) == KErrNotFound && iModifyQueue.Find( object->Id()) == KErrNotFound ) - { - TRAP_IGNORE( iAddQueue.AppendL( object->Id() )); - } - } + #ifdef _DEBUG TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted IN-COUNTERS---------- Amount: %d, Add",iQueryAllItems->Count()); #endif - } - //free query - delete iQueryAllItems; - iQueryAllItems = NULL; + + //free query + delete iQueryAllItems; + iQueryAllItems = NULL; } else if(&aQuery == iQuery ) { @@ -302,7 +314,7 @@ { TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() some result items missing"); - RArray iQueryQueueDelta; + RArray queryQueueDelta; TInt itemIndex(KErrNotFound); @@ -324,23 +336,26 @@ if(!found) { TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing from results item %d", iQueryQueue[queryItem] ); - iQueryQueueDelta.Append( iQueryQueue[queryItem] ); + + // ignore if fails + queryQueueDelta.InsertInOrder(iQueryQueue[queryItem], Compare); } } - TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing items total count %d", iQueryQueueDelta.Count()); + TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() missing items total count %d", queryQueueDelta.Count()); //cleanup from previous queue it item is not found from MDS - while(iQueryQueueDelta.Count()) + while(queryQueueDelta.Count()) { - itemIndex = iLastQueue->Find(iQueryQueueDelta[0]); + itemIndex = iLastQueue->FindInOrder(queryQueueDelta[0], Compare); + if(itemIndex >= 0) { TN_DEBUG2( "CThumbAGProcessor::HandleQueryCompleted() remove items %d", iQueryQueue[0]); iLastQueue->Remove( itemIndex ); } - iQueryQueueDelta.Remove(0); + queryQueueDelta.Remove(0); } - iQueryQueueDelta.Close(); + queryQueueDelta.Close(); } // no results, reset query @@ -359,7 +374,7 @@ //cleanup current queue while(iQueryQueue.Count()) { - itemIndex = iLastQueue->Find(iQueryQueue[0]); + itemIndex = iLastQueue->FindInOrder(iQueryQueue[0], Compare); if(itemIndex >= 0) { iLastQueue->Remove( itemIndex ); @@ -479,9 +494,10 @@ for (int i=0; i= 0) { @@ -503,10 +518,11 @@ iPlaceholderQueue.Remove( itemIndex ); } - if(iAddQueue.Find( aIDArray[i]) == KErrNotFound && i2ndRoundGenerateQueue.Find( aIDArray[i]) == KErrNotFound ) + if(iAddQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound && + i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare) == KErrNotFound) { TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to add queue"); - iAddQueue.Append( aIDArray[i]); + User::LeaveIfError(iAddQueue.InsertInOrder(aIDArray[i], Compare)); } } } @@ -518,7 +534,7 @@ for (int i=0; i= 0) { @@ -528,7 +544,7 @@ else { TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - real modify"); - itemIndex = iAddQueue.Find( aIDArray[i] ); + itemIndex = iAddQueue.FindInOrder(aIDArray[i], Compare); if (itemIndex >= 0) { @@ -536,9 +552,8 @@ iAddQueue.Remove( itemIndex ); } else - { - - itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] ); + { + itemIndex = i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare); if (itemIndex >= 0) { @@ -548,7 +563,7 @@ } TN_DEBUG1( "CThumbAGProcessor::AddToQueueL() - append to modify queue"); - iModifyQueue.AppendL(aIDArray[i]); + User::LeaveIfError(iModifyQueue.InsertInOrder(aIDArray[i], Compare)); SetForceRun( ETrue ); } @@ -562,14 +577,14 @@ for (int i=0; i= 0) { iAddQueue.Remove(itemIndex); } // ..and Modify Queue - itemIndex = iModifyQueue.Find( aIDArray[i] ); + itemIndex = iModifyQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iModifyQueue.Remove(itemIndex); @@ -657,9 +672,10 @@ if(iLastQueue == &iAddQueue || iLastQueue == &iModifyQueue) { TN_DEBUG2( "CThumbAGProcessor::CreateThumbnailsL() - 1st round add/modify, append to 2nd round queue", aObject->Id() ); - if(i2ndRoundGenerateQueue.Find(aObject->Id()) == KErrNotFound) + if(i2ndRoundGenerateQueue.FindInOrder(aObject->Id(), Compare) == KErrNotFound) { - i2ndRoundGenerateQueue.Append( aObject->Id() ); + // ignore if fails + i2ndRoundGenerateQueue.InsertInOrder(aObject->Id(), Compare); } } @@ -730,11 +746,11 @@ TInt maxCount = aIDArray.Count(); TN_DEBUG3( "CThumbAGProcessor::QueryL() - fill begin aIDArray == %d, iQueryQueue == %d", aIDArray.Count(), iQueryQueue.Count() ); - + for(TInt i=0;i < KMaxQueryItems && i < maxCount; i++) { TN_DEBUG2( "CThumbAGProcessor::QueryL() - fill %d", aIDArray[i] ); - iQueryQueue.Append( aIDArray[i] ); + iQueryQueue.InsertInOrder(aIDArray[i], Compare); } TN_DEBUG3( "CThumbAGProcessor::QueryL() - fill end aIDArray == %d, iQueryQueue == %d", aIDArray.Count(), iQueryQueue.Count() ); @@ -836,7 +852,7 @@ audioPHObjectCondition.SetPlaceholderOnly( ETrue ); audioPHObjectCondition.SetNotPresent( ETrue ); - iQueryPlaceholders->FindL(); + iQueryPlaceholders->FindL(KMaxTInt, KMaxQueryItems2); TN_DEBUG1( "CThumbAGProcessor::QueryPlaceholdersL - end" ); } @@ -1009,7 +1025,7 @@ const CMdEObject* object = &iQuery->Result( iProcessingCount-1 ); iProcessingCount--; - TInt itemIndex = iLastQueue->Find( object->Id()); + TInt itemIndex = iLastQueue->FindInOrder(object->Id(), Compare); if(itemIndex >= 0) { iLastQueue->Remove(itemIndex); @@ -1019,7 +1035,7 @@ if ( object ) { //remove item from queryQueue when request is issued - itemIndex = iQueryQueue.Find( object->Id()); + itemIndex = iQueryQueue.FindInOrder(object->Id(), Compare); if(itemIndex >= 0) { iQueryQueue.Remove(itemIndex); @@ -1044,9 +1060,10 @@ { if(iLastQueue) { - if(iLastQueue->Find( iQueryQueue[0]) == KErrNotFound) + if(iLastQueue->FindInOrder(iQueryQueue[0], Compare) == KErrNotFound) { - iLastQueue->Append(iQueryQueue[0]); + //ignore if fails + iLastQueue->InsertInOrder(iQueryQueue[0], Compare); } } iQueryQueue.Remove(0); @@ -1087,9 +1104,10 @@ { if(iLastQueue) { - if(iLastQueue->Find( iQueryQueue[0]) == KErrNotFound) + if(iLastQueue->FindInOrder(iQueryQueue[0], Compare) == KErrNotFound) { - iLastQueue->Append(iQueryQueue[0]); + //ignore if fails + iLastQueue->InsertInOrder(iQueryQueue[0], Compare); } } iQueryQueue.Remove(0); @@ -1349,13 +1367,6 @@ return; } - if( !IsActive() ) - { - SetActive(); - TRequestStatus* statusPtr = &iStatus; - User::RequestComplete( statusPtr, KErrNone ); - } - //check if forced run needs to continue if (iModifyQueue.Count()) { @@ -1366,6 +1377,14 @@ iModify = EFalse; SetForceRun( EFalse ); } + + if( !IsActive() && ((!iActive && !iQueryActive) || iForceRun )) + { + TN_DEBUG1( "CThumbAGProcessor::ActivateAO() - Activated"); + SetActive(); + TRequestStatus* statusPtr = &iStatus; + User::RequestComplete( statusPtr, KErrNone ); + } UpdatePSValues(); } @@ -1462,32 +1481,28 @@ { TN_DEBUG2( "CThumbAGProcessor::RemoveFromQueues() - %d", aIDArray[i]); - itemIndex = iPlaceholderQueue.Find( aIDArray[i] ); - + itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iPlaceholderQueue.Remove(itemIndex); TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPlaceholderQueue" ); } - itemIndex = iAddQueue.Find( aIDArray[i] ); - + itemIndex = iAddQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iAddQueue.Remove(itemIndex); TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iAddQueue" ); } - itemIndex = i2ndRoundGenerateQueue.Find( aIDArray[i] ); - + itemIndex = i2ndRoundGenerateQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { i2ndRoundGenerateQueue.Remove(itemIndex); TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - i2ndRoundGenerateQueue" ); } - itemIndex = iModifyQueue.Find( aIDArray[i] ); - + itemIndex = iModifyQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iModifyQueue.Remove(itemIndex); @@ -1499,34 +1514,19 @@ } } - itemIndex = iQueryQueue.Find( aIDArray[i] ); - + itemIndex = iQueryQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iQueryQueue.Remove(itemIndex); TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iQueryQueue" ); } - - itemIndex = iPlaceholderQueue.Find( aIDArray[i] ); - + + itemIndex = iPlaceholderQueue.FindInOrder(aIDArray[i], Compare); if(itemIndex >= 0) { iPlaceholderQueue.Remove(itemIndex); TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iPlaceholderQueue" ); } - - /* - if( aRemoveFromDelete ) - { - itemIndex = iRemoveQueue.Find( aIDArray[i] ); - - if(itemIndex >= 0) - { - iRemoveQueue.Remove(itemIndex); - TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - iRemoveQueue" ); - continue; - } - }*/ } TN_DEBUG1( "CThumbAGProcessor::RemoveFromQueues() - end" ); @@ -1593,7 +1593,7 @@ CMdEObjectCondition& audioPHObjectCondition = rootCondition.AddObjectConditionL(audioObjDef); - iQueryAllItems->FindL(); + iQueryAllItems->FindL(KMaxTInt, KMaxQueryItems2); TN_DEBUG1( "CThumbAGProcessor::QueryAllItemsL - end" ); } @@ -1811,4 +1811,15 @@ } } +// --------------------------------------------------------------------------- +// CThumbAGProcessor::Compare +// Comparison function for logaritmic use of queue arrays +// --------------------------------------------------------------------------- +// +TInt CThumbAGProcessor::Compare(const TItemId& aLeft, const TItemId& aRight) + { + return (aLeft - aRight); + } + + // End of file diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailmanagerimpl.h Wed Apr 14 16:16:51 2010 +0300 @@ -337,6 +337,23 @@ void UpdateThumbnailsL( const TThumbnailId aItemId, const TDesC& aPath, const TInt aOrientation, const TInt64 aModified, TInt aPriority ); + /** + * Rename Thumbnails. This is an asynchronous + * operation, which always returns immediately. + * + * @since S60 v5.0 + * @param aCurrentPath Current path of the Thumbnail + * @param aNewPath New path for the Thumbnail + * @param aPriority Priority for this operation + * @return Thumbnail request ID. This can be used to + * cancel the request or change priority. + * The ID is specific to this CThumbnailManager + * instance and may not be shared with other + * instances. + */ + TThumbnailRequestId RenameThumbnailsL( const TDesC& aCurrentPath, + const TDesC& aNewPath, TInt aPriority = CActive::EPriorityIdle ); + private: /** diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h Wed Apr 14 16:16:51 2010 +0300 @@ -40,7 +40,8 @@ EReqSetThumbnailBitmap = 3, EReqUpdateThumbnails = 4, EReqGetThumbnailHandleLater = 5, - EReqDeleteThumbnails = 6 + EReqDeleteThumbnails = 6, + EReqRenameThumbnails = 7 }; /** @@ -223,6 +224,17 @@ const TInt aPriority ); /** + * Rename thumbnails. + * + * @since S60 v5.0 + * @param aCurrentPath Current path of the Thumbnail + * @param aNewPath New path for the Thumbnail + * @param aPriority Priority for this operation + */ + void RenameThumbnails( const TDesC& aCurrentPath, const TDesC& aNewPath, + const TInt aPriority ); + + /** * Start active request. * * @since S60 v5.0 diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailsession.h Wed Apr 14 16:16:51 2010 +0300 @@ -192,6 +192,13 @@ void UpdateThumbnails( const TDesC& aPath, const TInt aOrientation, const TInt64 aModified, TThumbnailRequestParamsPckg& aParams, TRequestStatus& aStatus); + /** + * Rename thumbnails. + * + * @since S60 v5.0 + */ + void RenameThumbnails( TThumbnailRequestParamsPckg& aParams, TRequestStatus& aStatus ); + private: /** diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailmanagerimpl.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -147,7 +147,7 @@ TInt aPriority, TBool aGeneratePersistentSizesOnly) { iRequestId++; - TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() URI==%S, iThumbnailSize==%d %d", &aObjectSource.Uri(), iThumbnailSize, iRequestId ); + TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() URI==%S, iThumbnailSize==%d, req %d", &aObjectSource.Uri(), iThumbnailSize, iRequestId ); __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); @@ -208,7 +208,7 @@ aThumbnailId, TAny* aClientData /*= NULL*/, TInt aPriority) { iRequestId++; - TN_DEBUG5( "CThumbnailManagerImpl::GetThumbnailL() reqid==%d, aThumbnailId==%d, iThumbnailSize==%d %d", iRequestId, aThumbnailId, iThumbnailSize, iRequestId ); + TN_DEBUG4( "CThumbnailManagerImpl::GetThumbnailL() aThumbnailId==%d, iThumbnailSize==%d, req %d", aThumbnailId, iThumbnailSize, iRequestId ); __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); @@ -613,7 +613,7 @@ TInt aPriority ) { iRequestId++; - TN_DEBUG4( "CThumbnailManagerImpl::UpdateThumbnailsL() URI==%S, aItemId==%d %d", &aPath, aItemId, iRequestId); + TN_DEBUG4( "CThumbnailManagerImpl::UpdateThumbnailsL() URI==%S, aItemId==%d, req %d", &aPath, aItemId, iRequestId); __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); @@ -633,6 +633,35 @@ } // --------------------------------------------------------------------------- +// CThumbnailManagerImpl::RenameThumbnailsL() +// Renames thumbnails by given path +// --------------------------------------------------------------------------- +// +TThumbnailRequestId CThumbnailManagerImpl::RenameThumbnailsL( const TDesC& aCurrentPath, + const TDesC& aNewPath, TInt aPriority ) + { + iRequestId++; + TN_DEBUG3( "CThumbnailManagerImpl::RenameThumbnailsL() URI==%S, req %d", &aCurrentPath, iRequestId); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + TInt priority = ValidatePriority(aPriority); + + CThumbnailRequestActive* getThumbnailActive = CThumbnailRequestActive::NewL + ( iFs, iSession, iObserver, iRequestId, priority, iRequestQueue ); + CleanupStack::PushL( getThumbnailActive ); + + getThumbnailActive->RenameThumbnails( aCurrentPath, aNewPath, priority ); + + iRequestQueue->AddRequestL( getThumbnailActive ); + CleanupStack::Pop( getThumbnailActive ); + + iRequestQueue->Process(); + + return iRequestId; + } + +// --------------------------------------------------------------------------- // CThumbnailManagerImpl::ValidatePriority() // Check that given priority is in range of CActive::TPriority // --------------------------------------------------------------------------- diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -186,7 +186,12 @@ iSession.DeleteThumbnails( iParams.iThumbnailId, iParamsPckg, iStatus ); } break; - } + } + case EReqRenameThumbnails: + { + iSession.RenameThumbnails( iParamsPckg, iStatus ); + break; + } default: { break; @@ -220,12 +225,15 @@ iTimer->Cancel(); - if (iRequestType == EReqDeleteThumbnails || iCanceled) + if (iRequestType == EReqDeleteThumbnails || iCanceled || + iRequestType == EReqRenameThumbnails) { + TN_DEBUG1( "CThumbnailRequestActive::RunL() - rename/delete/canceled" ); + iFile.Close(); iMyFileHandle.Close(); - // no action for delete or canceled request + // no action for delete/rename or canceled request iRequestQueue->RequestComplete(this); #ifdef _DEBUG @@ -747,6 +755,22 @@ } // --------------------------------------------------------------------------- +// CThumbnailRequestActive::RenameThumbnails() +// Rename thumbnails. +// --------------------------------------------------------------------------- +// +void CThumbnailRequestActive::RenameThumbnails( const TDesC& aCurrentPath, + const TDesC& aNewPath, const TInt aPriority ) + { + iRequestType = EReqRenameThumbnails; + + iParams.iRequestId = iRequestId; + iParams.iPriority = aPriority; + iParams.iFileName = aCurrentPath; + iParams.iTargetUri = aNewPath; + } + +// --------------------------------------------------------------------------- // Request 2nd phase thumbnail // --------------------------------------------------------------------------- // diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailsession.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -338,6 +338,18 @@ SendReceive( EUpdateThumbnails, args, aStatus ); } + +// --------------------------------------------------------------------------- +// Rename thumbnails. +// --------------------------------------------------------------------------- +// +void RThumbnailSession::RenameThumbnails( TThumbnailRequestParamsPckg& aParams, + TRequestStatus& aStatus ) + { + TIpcArgs args( &aParams, KCheckValue); + + SendReceive( ERenameThumbnails, args, aStatus ); + } // End of file diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/group/thumbnailserver.mmp Wed Apr 14 16:16:51 2010 +0300 @@ -50,6 +50,7 @@ SOURCE thumbnailcenrep.cpp SOURCE thumbnailmemorycardobserver.cpp SOURCE thumbnaildecodetask.cpp +SOURCE thumbnailfetchedchecker.cpp #ifdef RD_MDS_2_5 SOURCE thumbnailmdsquerytask.cpp #endif // RD_MDS_2_5 diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailfetchedchecker.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailfetchedchecker.h Wed Apr 14 16:16:51 2010 +0300 @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2006-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: + * +*/ +#ifndef THUMBNAILFETCHEDCHECKER_H +#define THUMBNAILFETCHEDCHECKER_H + +#include + +NONSHARABLE_CLASS( CThumbnailFetchedChecker ): public CBase + { +public: + static CThumbnailFetchedChecker* NewL(); + virtual ~CThumbnailFetchedChecker(); +public: + TInt LastFetchResult( const TDesC& aUri ); + void SetFetchResult( const TDesC& aUri, TInt aError ); + void Reset(); +private: + CThumbnailFetchedChecker(); + + NONSHARABLE_CLASS( CEntry ) : public CBase + { + public: + static CEntry* New( const TDesC& aUri, TInt aError ); + static TInt FindCB( const TDesC* aUri, const CEntry& aEntry ); + static TInt InsertCB( const CEntry& aEntry1, const CEntry& aEntry2 ); + CEntry(); + virtual ~CEntry(); + public: + HBufC* iUri; + TInt iError; + }; + +private: + RPointerArray< CEntry > iNotFetched; +}; + +#endif // THUMBNAILFETCHEDCHECKER_H diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserver.h Wed Apr 14 16:16:51 2010 +0300 @@ -45,6 +45,7 @@ class CThumbnailServerSession; class CThumbnailDiskUnmountObserver; class CThumbnailMemoryCardObserver; +class CThumbnailFetchedChecker; /** * Helper function to destroy all objects which are referred to @@ -373,6 +374,15 @@ TBool UpdateThumbnailsL( const TDesC& aPath, const TInt aOrientation, const TInt64 aModified ); + /** + * Rename thumbnails. + * + * @since S60 v5.0 + * @param aCurrentPath Current path of the Thumbnail + * @param aNewPath New path for the Thumbnail + */ + void RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath ); + /** * Resolve mime type from file extension * @@ -451,6 +461,7 @@ TBool IsFormatting(); + inline CThumbnailFetchedChecker& FetchedChecker() const { return *iFetchedChecker; } protected: // Functions from base classes /** @@ -674,6 +685,11 @@ #ifdef _DEBUG TUint32 iPlaceholderCounter; #endif + /** + * Fetched checker. + * Own. + */ + CThumbnailFetchedChecker* iFetchedChecker; }; #endif // THUMBNAILSERVER_H diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailserversession.h Wed Apr 14 16:16:51 2010 +0300 @@ -254,6 +254,14 @@ void UpdateThumbnailsL( const RMessage2& aMessage ); /** + * Rename thumbnails. + * + * @since S60 v5.0 + * @param aMessage Message. + */ + void RenameThumbnailsL( const RMessage2& aMessage ); + + /** * Checks if client thread is still alive and RMessage2 handle valid. * * @since S60 v5.0 diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h Wed Apr 14 16:16:51 2010 +0300 @@ -94,6 +94,7 @@ _LIT( KThumbnailSqlParamData, ":Data" ); _LIT( KThumbnailSqlParamFlags, ":Flags" ); _LIT( KThumbnailSqlParamPath, ":Path" ); +_LIT( KThumbnailSqlParamNewPath, ":NewPath" ); _LIT( KThumbnailSqlParamWidth, ":Width" ); _LIT( KThumbnailSqlParamHeight, ":Height" ); _LIT( KThumbnailSqlParamOriginalWidth, ":OrigWidth" ); @@ -199,6 +200,10 @@ "WHERE NOT EXISTS (SELECT Path FROM ThumbnailInfo " "WHERE ThumbnailDeleted.Path = ThumbnailInfo.Path);" ); +// rename thumb +_LIT8( KThumbnailRename, "UPDATE ThumbnailInfo SET Path = :NewPath WHERE Path = :Path;" ); +_LIT8( KThumbnailTempRename, "UPDATE TempThumbnailInfo SET Path = :NewPath WHERE Path = :Path;" ); + // reset blacklisted _LIT8( KThumbnailTouchBlacklistedRows, "UPDATE ThumbnailInfo SET Modified = 0 WHERE Flags & :Flag" ); diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h Wed Apr 14 16:16:51 2010 +0300 @@ -273,6 +273,15 @@ TBool aTransaction = ETrue); /** + * Rename thumbnails. + * + * @since S60 v5.0 + * @param aCurrentPath Current path of the Thumbnail + * @param aNewPath New path for the Thumbnail + */ + void RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath ); + + /** * Persistent sizes. * * @since S60 v5.0 @@ -325,7 +334,7 @@ * * @since S60 v5.0 */ - TInt UpdateImeiL(); + void UpdateImeiL(); /** * Checks that database rowids match. @@ -625,6 +634,18 @@ RSqlStatement iStmt_KThumbnailSqlDeleteInfoByRowID; RSqlStatement iStmt_KThumbnailSqlDeleteInfoDataByRowID; RSqlStatement iStmt_KThumbnailSelectAllPaths; + RSqlStatement iStmt_KThumbnailRename; + RSqlStatement iStmt_KThumbnailTempRename; + + /** + * Dynamic batch size + */ + TInt iBatchFlushItemCount; + + /** + * Measure time spend in flush + */ + TTime iStartFlush, iStopFlush; }; // End of File diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailfetchedchecker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailfetchedchecker.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2006-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: + * +*/ + +#include "thumbnailfetchedchecker.h" + +const int KMaxStoredEntries = 50; + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CThumbnailFetchedChecker() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker* CThumbnailFetchedChecker::NewL() + { + return new (ELeave) CThumbnailFetchedChecker(); + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CThumbnailFetchedChecker() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker::CThumbnailFetchedChecker() + { + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::~CThumbnailFetchedChecker() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker::~CThumbnailFetchedChecker() + { + iNotFetched.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::LastFetchResult() +// ----------------------------------------------------------------------------- +// +TInt CThumbnailFetchedChecker::LastFetchResult( const TDesC& aUri ) + { + TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB ); + if ( i >= 0 && i < iNotFetched.Count() ) + { + return iNotFetched[ i ]->iError; + } + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::SetFetchResult() +// ----------------------------------------------------------------------------- +// +void CThumbnailFetchedChecker::SetFetchResult( const TDesC& aUri, TInt aError ) + { + if ( aError == KErrNone ) + { + // Do not store successful results + TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB ); + if ( i >= 0 && i < iNotFetched.Count() ) + { + delete iNotFetched[ i ]; + iNotFetched.Remove( i ); + } + } + else + { + // Add or update + CEntry* entry = CEntry::New( aUri, aError ); + if ( entry ) + { + TInt err = iNotFetched.Find( entry ); + if ( err != KErrNotFound ) + { + TInt i = iNotFetched.FindInOrder( aUri, CEntry::FindCB ); + if ( i >= 0 && i < iNotFetched.Count() ) + { + iNotFetched[ i ]->iError = aError; + } + } + else + { + if( iNotFetched.Count() < KMaxStoredEntries ) + { + TInt err = iNotFetched.InsertInOrder( entry, CEntry::InsertCB ); + if ( err != KErrNone ) + { + delete entry; + } + } + } + } + } + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::Reset() +// ----------------------------------------------------------------------------- +// +void CThumbnailFetchedChecker::Reset() + { + iNotFetched.ResetAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CEntry::New() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker::CEntry* CThumbnailFetchedChecker::CEntry::New( + const TDesC& aUri, TInt aError ) + { + CEntry* self = new (ELeave) CEntry(); + if ( self ) + { + self->iUri = aUri.Alloc(); + self->iError = aError; + if ( !self->iUri ) + { + delete self; + self = NULL; + } + } + return self; + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CEntry::FindCB() +// ----------------------------------------------------------------------------- +// +TInt CThumbnailFetchedChecker::CEntry::FindCB( + const TDesC* aUri, const CThumbnailFetchedChecker::CEntry& aEntry ) + { + return aUri->CompareF( *( aEntry.iUri ) ); + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CEntry::InsertCB() +// ----------------------------------------------------------------------------- +// +TInt CThumbnailFetchedChecker::CEntry::InsertCB( + const CThumbnailFetchedChecker::CEntry& aEntry1, + const CThumbnailFetchedChecker::CEntry& aEntry2 ) + { + return aEntry1.iUri->CompareF( *( aEntry2.iUri ) ); + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CEntry::CEntry() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker::CEntry::CEntry() + { + } + +// ----------------------------------------------------------------------------- +// CThumbnailFetchedChecker::CEntry::~CEntry() +// ----------------------------------------------------------------------------- +// +CThumbnailFetchedChecker::CEntry::~CEntry() + { + delete iUri; + } diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -36,6 +36,7 @@ #include "thumbnailcenrep.h" #include "thumbnailmemorycardobserver.h" #include "tmgetimei.h" +#include "thumbnailfetchedchecker.h" _LIT8( KThumbnailMimeWildCard, "*" ); @@ -73,7 +74,7 @@ ERequestThumbByBufferAsync, ERequestSetThumbnailByBuffer, EDeleteThumbnailsById, - EReserved1, + ERenameThumbnails, EUpdateThumbnails, ERequestSetThumbnailByBitmap, EThumbnailServerRequestCount, @@ -96,7 +97,7 @@ CPolicyServer::ECustomCheck, // ERequestThumbByBufferAsync CPolicyServer::ECustomCheck, // ERequestSetThumbnailByBuffer CPolicyServer::ECustomCheck, // EDeleteThumbnailsById - CPolicyServer::ECustomCheck, + CPolicyServer::ECustomCheck, // ERenameThumbnails CPolicyServer::ECustomCheck, // EUpdateThumbnails CPolicyServer::ECustomCheck, // ERequestSetThumbnailByBitmap CPolicyServer::ECustomCheck, // EThumbnailServerRequestCount @@ -142,7 +143,8 @@ case EGetMimeTypeList: case ERequestSetThumbnailByBuffer: case EDeleteThumbnailsById: - case EUpdateThumbnails: + case EUpdateThumbnails: + case ERenameThumbnails: case ERequestSetThumbnailByBitmap: { if( aMsg.HasCapability( ECapabilityReadDeviceData ) && @@ -152,8 +154,6 @@ } break; } - - case EReserved1: case EThumbnailServerRequestCount: default: { @@ -254,6 +254,7 @@ //OpenStoresL(); AddUnmountObserversL(); + iFetchedChecker = CThumbnailFetchedChecker::NewL(); } @@ -267,6 +268,7 @@ iShutdown = ETrue; + delete iFetchedChecker; delete iShutdownObserver; delete iProcessor; @@ -536,6 +538,10 @@ { TN_DEBUG1( "CThumbnailServer::StoreThumbnailL() - file doesn't exists anymore, skip store!"); } + if( iFetchedChecker ) + { + iFetchedChecker->SetFetchResult( aPath, KErrNone ); + } } @@ -547,8 +553,23 @@ aThumbnail, TDesC8* & aData, const TThumbnailSize aThumbnailSize, TSize &aOriginalSize ) { TN_DEBUG3( "CThumbnailServer::FetchThumbnailL(aPath=%S aThumbnailSize=%d)", &aPath, aThumbnailSize ); - - StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize); + if( iFetchedChecker ) + { + TInt err( iFetchedChecker->LastFetchResult( aPath ) ); + if ( err == KErrNone ) // To avoid useless sql gets that fails for sure + { + TRAP( err, StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize) ); + if ( err != KErrNone ) + { + iFetchedChecker->SetFetchResult( aPath, err ); + } + } + User::LeaveIfError( err ); + } + else + { + StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize); + } } @@ -600,6 +621,10 @@ TN_DEBUG2( "CThumbnailServer::DeleteThumbnailsL(%S)", &aPath); StoreForPathL( aPath )->DeleteThumbnailsL( aPath ); + if( iFetchedChecker ) + { + iFetchedChecker->SetFetchResult( aPath, KErrNone ); + } } // ----------------------------------------------------------------------------- @@ -1193,6 +1218,17 @@ } // ----------------------------------------------------------------------------- +// Renames thumbnails. +// ----------------------------------------------------------------------------- +// +void CThumbnailServer::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath ) + { + TN_DEBUG2( "CThumbnailServer::RenameThumbnailsL(%S)", &aCurrentPath); + + StoreForPathL( aCurrentPath )->RenameThumbnailsL( aCurrentPath, aNewPath ); + } + +// ----------------------------------------------------------------------------- // CThumbnailServer::MimeTypeFromFileExt() // ----------------------------------------------------------------------------- // diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -133,7 +133,12 @@ { UpdateThumbnailsL( aMessage ); break; - } + } + case ERenameThumbnails: + { + RenameThumbnailsL( aMessage ); + break; + } default: { err = KErrUnknown; @@ -338,6 +343,38 @@ } // ----------------------------------------------------------------------------- +// CThumbnailServerSession::RenameThumbnailsL() +// Rename thumbnails. +// ----------------------------------------------------------------------------- +// +void CThumbnailServerSession::RenameThumbnailsL( const RMessage2& aMessage ) + { + if(aMessage.Int1() != KCheckValue) + { + TN_DEBUG1( "CThumbnailServerSession::RenameThumbnailsL() - error in aMessage - leaving" ); + User::Leave(KErrArgument); + } + + // read message params + aMessage.ReadL( 0, iRequestParams ); + const TThumbnailRequestParams& params = iRequestParams(); + + // renaming only inside one store + if (params.iFileName.Left(1).CompareF( params.iTargetUri.Left(1) ) == 0) + { + Server()->RenameThumbnailsL( params.iFileName, params.iTargetUri ); + + aMessage.Complete( KErrNone ); + } + else + { + aMessage.Complete( KErrNotSupported ); + } + + iMessage = RMessage2(); + } + +// ----------------------------------------------------------------------------- // CThumbnailServerSession::RequestThumbByIdAsyncL() // ----------------------------------------------------------------------------- // diff -r dea39715fc05 -r ee674526fac5 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp Wed Mar 31 22:04:49 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp Wed Apr 14 16:16:51 2010 +0300 @@ -35,7 +35,7 @@ #include "thumbnailserver.h" -_LIT8( KThumbnailSqlConfig, "page_size=16384; cache_size=32;" ); +_LIT8( KThumbnailSqlConfig, "page_size=1024; cache_size=32;" ); const TInt KStreamBufferSize = 1024 * 8; const TInt KMajor = 3; @@ -44,7 +44,7 @@ const TInt KStoreUnrecoverableErr = KErrCorrupt; // Database path without drive letter -_LIT( KThumbnailDatabaseName, ":[102830AB]thumbnail_v3.db" ); +_LIT( KThumbnailDatabaseName, ":[102830AB]thumbnail_v4.db" ); _LIT( KDrv, ":"); @@ -167,10 +167,6 @@ iDiskFullNotifier = NULL; } - if(!iServer->IsFormatting()) - { - FlushCacheTable( ETrue ); - } if( iAutoFlushTimer ) { iAutoFlushTimer->Cancel(); @@ -178,6 +174,18 @@ iAutoFlushTimer = NULL; } + if( iMaintenanceTimer ) + { + iMaintenanceTimer->Cancel(); + delete iMaintenanceTimer; + iMaintenanceTimer = NULL; + } + + if(!iServer->IsFormatting()) + { + FlushCacheTable( ETrue ); + } + CloseStatements(); iDatabase.Close(); @@ -191,7 +199,7 @@ // CThumbnailStore::CThumbnailStore( RFs& aFs, TInt aDrive, TDesC& aImei, CThumbnailServer* aServer ): iFs( aFs ), iDrive( aDrive ), iDriveChar( 0 ), iBatchItemCount(0), iImei(aImei), - iServer(aServer), iDiskFull(EFalse), iUnrecoverable(ETrue) + iServer(aServer), iDiskFull(EFalse), iUnrecoverable(ETrue), iBatchFlushItemCount(KMInBatchItems) { // no implementation required } @@ -293,18 +301,16 @@ checkError = CheckRowIDs(); } } - else + + // if db file not found, wrong version, corrupted database or other error opening db + if ( err != KErrNone || checkError == KErrNotSupported ) { - // if db file not found, wrong version, corrupted database or other error opening db - if ( checkError == KErrNotSupported || err != KErrNone ) - { - CleanupClosePushL(iDatabase); - RecreateDatabaseL(ETrue); - CleanupStack::Pop(&iDatabase); - - aNewDatabase = ETrue; - } - } + CleanupClosePushL(iDatabase); + RecreateDatabaseL(ETrue); + CleanupStack::Pop(&iDatabase); + + aNewDatabase = ETrue; + } } // opened existing database file @@ -319,7 +325,7 @@ if(imeiError != KErrNone) { //take ownership - imeiError = UpdateImeiL(); + TRAP(imeiError, UpdateImeiL() ); //Touch blacklisted items TRAP(blistError, PrepareBlacklistedItemsForRetryL() ); @@ -332,9 +338,7 @@ TRAP(blistError2, PrepareBlacklistedItemsForRetryL() ); } - if(imeiError == KSqlErrCorrupt || imeiError == KErrCorrupt || - blistError == KSqlErrCorrupt || blistError == KErrCorrupt || - blistError2 == KSqlErrCorrupt || blistError2 == KErrCorrupt ) + if(imeiError != KErrNone || blistError != KErrNone || blistError2 != KErrNone ) { CleanupClosePushL(iDatabase); RecreateDatabaseL(ETrue); @@ -745,31 +749,30 @@ // UpdateImeiL() // ----------------------------------------------------------------------------- // -TInt CThumbnailStore::UpdateImeiL() +void CThumbnailStore::UpdateImeiL() { TN_DEBUG1( "CThumbnailStore::UpdateImeiL()" ); RSqlStatement stmt; CleanupClosePushL( stmt ); - TInt ret = stmt.Prepare( iDatabase, KThumbnailUpdateIMEI ); + User::LeaveIfError( stmt.Prepare( iDatabase, KThumbnailUpdateIMEI ) ); TInt paramIndex = stmt.ParameterIndex( KThumbnailSqlParamImei ); User::LeaveIfError( paramIndex ); User::LeaveIfError( stmt.BindText( paramIndex, iImei )); - TInt err = stmt.Exec(); + TInt err = stmt.Exec(); if(err < 0) { #ifdef _DEBUG - TPtrC errorMsg2 = iDatabase.LastErrorMessage(); - TN_DEBUG2( "RThumbnailTransaction::ResetThumbnailIDs() lastError %S, ret = %d" , &errorMsg2); + TPtrC errorMsg = iDatabase.LastErrorMessage(); + TN_DEBUG2( "RThumbnailTransaction::UpdateImeiL() lastError %S" , &errorMsg); #endif - return ret; + User::Leave(err); } CleanupStack::PopAndDestroy( &stmt ); - return KErrNone; } // --------------------------------------------------------------------------- @@ -961,6 +964,22 @@ #endif User::LeaveIfError( err ); + err = iStmt_KThumbnailRename.Prepare( iDatabase, KThumbnailRename ); +#ifdef _DEBUG + msg.Append( iDatabase.LastErrorMessage() ); + TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailRename %S" , &msg ); + msg.Zero(); +#endif + User::LeaveIfError( err ); + + err = iStmt_KThumbnailTempRename.Prepare( iDatabase, KThumbnailTempRename ); +#ifdef _DEBUG + msg.Append( iDatabase.LastErrorMessage() ); + TN_DEBUG2( "CThumbnailStore::PrepareStatementsL() KThumbnailTempRename %S" , &msg ); + msg.Zero(); +#endif + User::LeaveIfError( err ); + TN_DEBUG1("CThumbnailStore::PrepareStatementsL() end"); } @@ -1005,6 +1024,8 @@ iStmt_KThumbnailSqlDeleteInfoByRowID.Close(); iStmt_KThumbnailSqlDeleteInfoDataByRowID.Close(); iStmt_KThumbnailSelectAllPaths.Close(); + iStmt_KThumbnailRename.Close(); + iStmt_KThumbnailTempRename.Close(); TN_DEBUG1("CThumbnailStore::CloseStatements() end"); } @@ -1347,10 +1368,11 @@ found = ETrue; } + CleanupStack::PopAndDestroy( stmt ); + // check if duplicate in Deleted if (found) { - CleanupStack::PopAndDestroy( stmt ); stmt = &iStmt_KThumbnailSqlFindDeleted; CleanupStack::PushL(TCleanupItem(ResetStatement, stmt)); @@ -1360,6 +1382,8 @@ rowStatus = stmt->Next(); + CleanupStack::PopAndDestroy( stmt ); + if(rowStatus == KSqlAtRow) { TN_DEBUG1( "CThumbnailStore::FindDuplicateL() - duplicate marked deleted" ); @@ -1372,8 +1396,6 @@ } } - CleanupStack::PopAndDestroy( stmt ); - return found; } @@ -1695,10 +1717,10 @@ rowStatus = stmt->Next(); } - CleanupStack::PopAndDestroy( stmt ); + CleanupStack::PopAndDestroy( stmt_infodata ); CleanupStack::PopAndDestroy( stmt_info ); - CleanupStack::PopAndDestroy( stmt_infodata ); - + CleanupStack::PopAndDestroy( stmt ); + // if forcing instant delete if (aForce) { @@ -1744,6 +1766,9 @@ CleanupStack::PopAndDestroy( stmt_infodata ); CleanupStack::PopAndDestroy( stmt_info ); + + //remove delete mark + User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) ); } else { @@ -1783,6 +1808,84 @@ CleanupStack::PopAndDestroy( path ); } +// ----------------------------------------------------------------------------- +// Rename thumbnails +// ----------------------------------------------------------------------------- +// +void CThumbnailStore::RenameThumbnailsL( const TDesC& aCurrentPath, const TDesC& aNewPath ) + { + TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL(%S)", &aCurrentPath ); + +#ifdef _DEBUG + TTime aStart, aStop; + aStart.UniversalTime(); +#endif + + User::LeaveIfError( CheckDbState() ); + + TInt paramIndex = 0; + + HBufC* path = aCurrentPath.AllocLC(); + TPtr ptr(path->Des()); + StripDriveLetterL( ptr ); + + HBufC* newPath = aNewPath.AllocLC(); + TPtr ptr2(newPath->Des()); + StripDriveLetterL( ptr2 ); + + RThumbnailTransaction transaction( iDatabase ); + CleanupClosePushL( transaction ); + transaction.BeginL(); + + TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- TEMP TABLE" ); + + RSqlStatement* stmt = NULL; + stmt = &iStmt_KThumbnailTempRename; + CleanupStack::PushL(TCleanupItem(ResetStatement, stmt)); + + paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath ); + User::LeaveIfError( paramIndex ); + User::LeaveIfError( stmt->BindText( paramIndex, *path )); + + paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath ); + User::LeaveIfError( paramIndex ); + User::LeaveIfError( stmt->BindText( paramIndex, *newPath )); + + User::LeaveIfError( stmt->Exec() ); + + TN_DEBUG1( "CThumbnailStore::RenameThumbnailsL() -- MAIN TABLE" ); + + CleanupStack::PopAndDestroy( stmt ); + stmt = &iStmt_KThumbnailRename; + CleanupStack::PushL(TCleanupItem(ResetStatement, stmt)); + + paramIndex = stmt->ParameterIndex( KThumbnailSqlParamPath ); + User::LeaveIfError( paramIndex ); + User::LeaveIfError( stmt->BindText( paramIndex, *path )); + + paramIndex = stmt->ParameterIndex( KThumbnailSqlParamNewPath ); + User::LeaveIfError( paramIndex ); + User::LeaveIfError( stmt->BindText( paramIndex, *newPath )); + + User::LeaveIfError( stmt->Exec() ); + + CleanupStack::PopAndDestroy( stmt ); + + // if thumb was for some reason already marked deleted, clean from deleted + User::LeaveIfError( iDatabase.Exec( KThumbnailSqlDeleteFromDeleted ) ); + + transaction.CommitL(); + CleanupStack::PopAndDestroy( &transaction ); + + CleanupStack::PopAndDestroy( newPath ); + CleanupStack::PopAndDestroy( path ); + +#ifdef _DEBUG + aStop.UniversalTime(); + TN_DEBUG2( "CThumbnailStore::RenameThumbnailsL() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000); +#endif + } + // --------------------------------------------------------------------------- // CThumbnailStore::PersistentSizes() // --------------------------------------------------------------------------- @@ -1808,17 +1911,15 @@ return; } - if(iBatchItemCount < KMaxBatchItems && !aForce) + if(iBatchItemCount < iBatchFlushItemCount && !aForce) { //some items in cache StartAutoFlush(); return; } -#ifdef _DEBUG - TTime aStart, aStop; - aStart.UniversalTime(); -#endif + + iStartFlush.UniversalTime(); // Move data from temp table to main.... TInt err_begin = iDatabase.Exec( KThumbnailBeginTransaction ); @@ -1872,15 +1973,26 @@ TRAP_IGNORE(OpenDatabaseL(ETrue)); } + //adjust batch size dynamically between min and max based on read flush speed. + iStopFlush.UniversalTime(); + TInt aFlushDelay = (TInt)iStopFlush.MicroSecondsFrom(iStartFlush).Int64()/1000; + TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", aFlushDelay); + //cache flushed iBatchItemCount = 0; -#ifdef _DEBUG - aStop.UniversalTime(); - TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000); -#endif + //increase batch count if there room for one more item (based on average time per item) + if( aFlushDelay < KMaxFlushDelay && iBatchFlushItemCount < KMaxBatchItems ) + { + iBatchFlushItemCount++; + } + //decrease batch count if we exeeced max time allowed in flushing the TEMP table + else if(aFlushDelay > KMaxFlushDelay && iBatchFlushItemCount > KMInBatchItems ) + { + iBatchFlushItemCount--; + } - TN_DEBUG1("CThumbnailStore::FlushCacheTable() out"); + TN_DEBUG2("CThumbnailStore::FlushCacheTable() out iBatchFlushItemCount = %d", iBatchFlushItemCount); } // -----------------------------------------------------------------------------