# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1273584611 -10800 # Node ID ffb2d5dd62e9452c2a8c46de908f1a3a6f847fc5 # Parent 85a88bc05e459ecf7f3cc47709a005b44ad7310e Revision: 201017 Kit: 201019 diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/exif.jpg Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/exif.jpg has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/exif.png Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/exif.png has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/mp3_png.mp3 Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/mp3_png.mp3 has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/no_exif.jpg Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/no_exif.jpg has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma.wma Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma.wma has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma_empty.wma Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma_empty.wma has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma_png.wma Binary file imagehandling_plat/thumbnailmanager_api/tsrc/data/mmc/ThumbnailManagerTest/wma_png.wma has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h --- a/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/inc/thumbnailmanagerconstants.h Tue May 11 16:30:11 2010 +0300 @@ -55,11 +55,11 @@ //minimum batch size const TUint KMInBatchItems = 3; //maximum batch size -const TUint KMaxBatchItems = 18; +const TUint KMaxBatchItems = 60; //Max allowed flush time -const TUint KMaxFlushDelay = 3000; //ms -// fixed batch size for MTP -const TUint KMaxBatchItemsMTP = 60; +const TUint KMaxFlushDelay = 3000; // 3 sec +//Max allowed flush time on MTP/music collection refresh +const TUint KMaxMTPFlushDelay = 15000; // 15 seconds //how many items daemon will query at once from MDS const TUint KMaxQueryItems = 100; diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/plugins/audio/src/thumbnailimagedecoderv3.cpp --- a/imagehandlingutilities/thumbnailmanager/plugins/audio/src/thumbnailimagedecoderv3.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/plugins/audio/src/thumbnailimagedecoderv3.cpp Tue May 11 16:30:11 2010 +0300 @@ -93,6 +93,8 @@ // void CThumbnailImageDecoderv3::DecodeL( const TDisplayMode aDisplayMode ) { + TN_DEBUG1( "CThumbnailImageDecoderv3::DecodeL() start" ); + // Create the bitmap if ( !iBitmap ) { @@ -141,11 +143,10 @@ } iDecoder->Convert( &iStatus, * iBitmap ); - while ( iStatus == KErrUnderflow ) - { - iDecoder->ContinueConvert( &iStatus ); - } + SetActive(); + + TN_DEBUG1( "CThumbnailImageDecoderv3::DecodeL() end" ); } diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp --- a/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/plugins/image/src/thumbnailimagedecoder.cpp Tue May 11 16:30:11 2010 +0300 @@ -233,10 +233,6 @@ } iDecoder->Convert( &iStatus, * iBitmap ); - while ( iStatus == KErrUnderflow ) - { - iDecoder->ContinueConvert( &iStatus ); - } SetActive(); diff -r 85a88bc05e45 -r ffb2d5dd62e9 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 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.6_SA_S60.50_Euro1.sis Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/ThumbnailManager_0x102830AB_v9.20.6_SA_S60.50_Euro1.sis has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/package.pkg Tue May 11 16:30:11 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"Thumbnail Manager"},(0x102830AB), 9, 20, 5, TYPE=SA, RU +#{"Thumbnail Manager"},(0x102830AB), 9, 20, 6, TYPE=SA, RU ; Localised Vendor name %{"Nokia"} diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/stub.pkg Tue May 11 16:30:11 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"ThumbnailManager"},(0x102830AB), 9, 20, 5, TYPE=SA +#{"ThumbnailManager"},(0x102830AB), 9, 20, 6, TYPE=SA ; Localised Vendor name %{"Nokia"} diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis Binary file imagehandlingutilities/thumbnailmanager/sis/thumbnailmanager/thumbnailmanager_stub.sis has changed diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg --- a/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/sis/thumbnailmanagercenrep/package.pkg Tue May 11 16:30:11 2010 +0300 @@ -17,7 +17,7 @@ &EN ; Header -#{"Thumbnail Manager Cenrep"},(0x10202BE9), 9, 20, 5, TYPE=SP +#{"Thumbnail Manager Cenrep"},(0x10202BE9), 9, 20, 6, TYPE=SP ; Localised Vendor name %{"Symbian Software Ltd."} diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h --- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/inc/thumbagprocessor.h Tue May 11 16:30:11 2010 +0300 @@ -169,8 +169,9 @@ * DeleteAndCancelQuery * * @since Symbian^3 + * @param aRemoveItems restore IDs back to original queue, default = ETrue */ - void DeleteAndCancelQuery(); + void DeleteAndCancelQuery(TBool aRestoreItems); protected: diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbagdaemon/src/thumbagprocessor.cpp Tue May 11 16:30:11 2010 +0300 @@ -295,7 +295,7 @@ delete iQueryAllItems; iQueryAllItems = NULL; } - else if(&aQuery == iQuery ) + else if(&aQuery == iQuery ) { TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted - Query completed"); @@ -318,7 +318,7 @@ TInt itemIndex(KErrNotFound); - //search delta items + //search delta items which were queried, but not found for(TInt queryItem =0; queryItem < iQueryQueue.Count();queryItem++) { TBool found(EFalse); @@ -369,7 +369,8 @@ } else { - DeleteAndCancelQuery(); + //Delete and cancel query, do not return items back to original queue + DeleteAndCancelQuery( EFalse ); TN_DEBUG1( "CThumbAGProcessor::HandleQueryCompleted() Query FAILED!"); } } @@ -664,6 +665,7 @@ } } + // 9.2 specific if( !(imageObjectDef.Id() == aObject->Def().Id() || videoObjectDef.Id() == aObject->Def().Id()) ) { TN_DEBUG1( "CThumbAGProcessor::CreateThumbnailsL() 1st round and not image or video, skip"); @@ -1030,7 +1032,8 @@ //force is coming, but executing non-forced query complete-> cancel old else { - DeleteAndCancelQuery(); + //cancel query and move items back to original processing queue + DeleteAndCancelQuery( ETrue ); ActivateAO(); return; } @@ -1048,9 +1051,11 @@ //waiting for MDS query to complete else if( iQueryActive ) { + //state mismatch if(iForceRun && !iModify) { - DeleteAndCancelQuery(); + //cancel query and move items back to original processing queue + DeleteAndCancelQuery(ETrue); ActivateAO(); } else @@ -1126,7 +1131,7 @@ // CThumbAGProcessor::DeleteAndCancelQuery() // --------------------------------------------------------------------------- // -void CThumbAGProcessor::DeleteAndCancelQuery() +void CThumbAGProcessor::DeleteAndCancelQuery(TBool aRestoreItems) { TN_DEBUG1( "CThumbAGProcessor::DeleteAndCancelQuery() in" ); @@ -1145,7 +1150,7 @@ //move remainig IDs in query queue back to original queue while(iQueryQueue.Count()) { - if(iLastQueue) + if(aRestoreItems && iLastQueue) { if(iLastQueue->FindInOrder(iQueryQueue[0], Compare) == KErrNotFound) { @@ -1794,7 +1799,7 @@ //cancel 2nd round generarion when there is items in 1st round queues if(itemsLeft && i2ndRound) { - DeleteAndCancelQuery(); + DeleteAndCancelQuery(ETrue); i2ndRound = EFalse; } diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/inc/thumbnailrequestactive.h Tue May 11 16:30:11 2010 +0300 @@ -279,6 +279,13 @@ */ void StartError( const TInt aErr ); + /** + * Async cancel + * + * @since S60 v5.0 + */ + void AsyncCancel(); + private: /** diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp Tue May 11 16:30:11 2010 +0300 @@ -141,8 +141,27 @@ } case EReqGetThumbnailPath: { - iSession.RequestThumbnailL( iPath, iTargetUri, iParams.iThumbnailId, - iParamsPckg, iStatus ); + // for custom size requests file handle can be opened here already, because + // custom thumbnails are never stored in db + if (iParams.iThumbnailSize == ECustomThumbnailSize && + iParams.iOriginalControlFlags != EThumbnailGeneratePersistentSizesOnly) + { + TN_DEBUG1( "CThumbnaiRequestActive::StartL()- custom size request" ); + + iFile.Close(); + User::LeaveIfError( iFile.Open( iFs, iPath, EFileShareReadersOrWriters ) ); + + TN_DEBUG2( "CThumbnailRequestActive::StartL() - file handle opened for %S", &iTargetUri ); + + CleanupClosePushL( iFile ); + iSession.RequestThumbnailL( iFile, iPath, iParamsPckg, iStatus ); + CleanupStack::PopAndDestroy( &iFile ); + } + else + { + iSession.RequestThumbnailL( iPath, iTargetUri, iParams.iThumbnailId, + iParamsPckg, iStatus ); + } break; } case EReqSetThumbnailBuffer: @@ -212,7 +231,7 @@ void CThumbnailRequestActive::RunL() { TN_DEBUG2( "CThumbnailRequestActive::RunL() - request ID: %d", iParams.iRequestId ); - + if ( iParams.iControlFlags == EThumbnailPreviewThumbnail ) { iRequestCompleted = EFalse; @@ -450,6 +469,24 @@ // --------------------------------------------------------------------------- +// CThumbnailRequestActive::AsyncCancel() +// --------------------------------------------------------------------------- +// +void CThumbnailRequestActive::AsyncCancel() + { + TN_DEBUG1( "CThumbnailRequestActive::AsyncCancel"); + + __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId )); + + iCanceled = ETrue; + iSession.CancelRequest( iRequestId ); + ReleaseServerBitmap(); + + // AO stays active until request is complete or timeout is reached + } + + +// --------------------------------------------------------------------------- // CThumbnailRequestActive::ReleaseServerBitmap() // Releases reserved bitmap. // --------------------------------------------------------------------------- @@ -619,6 +656,7 @@ iParams.iQualityPreference = aQualityPreference; iParams.iThumbnailSize = aThumbnailSize; iParams.iThumbnailId = aThumbnailId; + iParams.iFileName = aPath; iPath = aPath; iTargetUri = aTargetUri; @@ -845,13 +883,6 @@ self->iTimer->Cancel(); - if (self->IsActive()) - { - // hangs without this - TRequestStatus* statusPtr = &self->iStatus; - User::RequestComplete( statusPtr, KErrTimedOut ); - } - self->Cancel(); if (self->iStartError != KErrNone) diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp Tue May 11 16:30:11 2010 +0300 @@ -188,19 +188,10 @@ CThumbnailRequestActive* request = iRequests[i]; if ( request->RequestId() == aRequestId ) { - // Cancel and remove from queue if (iRequests[i]->IsActive()) { - iRequests[i]->Cancel(); - - iActiveRequests--; - if(iActiveRequests <= -1) - { - iActiveRequests = 0; - } - - delete request; - iRequests.Remove( i ); + // this doesn't yet actually cancel/complete the AO + iRequests[i]->AsyncCancel(); TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - canceled request ID: %d", aRequestId); } diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailsql.h Tue May 11 16:30:11 2010 +0300 @@ -88,7 +88,6 @@ // indexes _LIT8( KThumbnailCreateInfoTableIndex1, "CREATE INDEX idx1 ON ThumbnailInfo(Path, Size);"); -_LIT8( KThumbnailCreateDeletedTableIndex, "CREATE INDEX idx4 ON ThumbnailDeleted(Path);"); // parameters _LIT( KThumbnailSqlParamData, ":Data" ); diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/inc/thumbnailstore.h Tue May 11 16:30:11 2010 +0300 @@ -646,6 +646,10 @@ * Measure time spend in flush */ TTime iStartFlush, iStopFlush; + /** + * How long previous flush took ms + */ + TInt iPreviousFlushDelay; }; // End of File diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailgeneratetask.cpp Tue May 11 16:30:11 2010 +0300 @@ -28,6 +28,7 @@ #include "thumbnailmanagerconstants.h" #include "thumbnaillog.h" #include "thumbnailpanic.h" +#include "thumbnailfetchedchecker.h" // ======== MEMBER FUNCTIONS ======== @@ -488,11 +489,15 @@ { iServer.StoreForPathL( iFilename )->StoreThumbnailL( iFilename, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue ); + //remove result from fetched checker + iServer.FetchedChecker().SetFetchResult( iFilename, KErrNone ); } else if(iTargetUri != KNullDesC) { iServer.StoreForPathL( iTargetUri )->StoreThumbnailL( iTargetUri, tempBitmap, aOriginalSize, EFalse, iThumbnailSize, iModified, EFalse, ETrue ); + //remove result from fetched checker + iServer.FetchedChecker().SetFetchResult( iTargetUri, KErrNone ); } CleanupStack::PopAndDestroy( tempBitmap ); diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserver.cpp Tue May 11 16:30:11 2010 +0300 @@ -538,6 +538,7 @@ { TN_DEBUG1( "CThumbnailServer::StoreThumbnailL() - file doesn't exists anymore, skip store!"); } + if( iFetchedChecker ) { iFetchedChecker->SetFetchResult( aPath, KErrNone ); @@ -558,6 +559,12 @@ TInt err( iFetchedChecker->LastFetchResult( aPath ) ); if ( err == KErrNone ) // To avoid useless sql gets that fails for sure { + // custom sizes are not stored to db, skip fetching + if ( aThumbnailSize == ECustomThumbnailSize ) + { + User::Leave( KErrNotFound ); + } + TRAP( err, StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize) ); if ( err != KErrNone ) { @@ -568,6 +575,12 @@ } else { + // custom sizes are not stored to db, skip fetching + if ( aThumbnailSize == ECustomThumbnailSize ) + { + User::Leave( KErrNotFound ); + } + StoreForPathL( aPath )->FetchThumbnailL( aPath, aThumbnail, aData, aThumbnailSize, aOriginalSize); } } @@ -876,7 +889,6 @@ CThumbnailStore** resPtr = iStores.Find( aDrive ); CThumbnailStore* res = NULL; - if ( resPtr ) { res = * resPtr; diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue May 11 16:30:11 2010 +0300 @@ -613,7 +613,9 @@ User::Leave(err); } - if(Server()->StoreForPathL(params.iFileName)->IsDiskFull()) + // disk space check only for stored sizes + if ( params.iThumbnailSize != ECustomThumbnailSize && + Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) { User::Leave( KErrDiskFull ); } @@ -736,22 +738,31 @@ { if( bitmapSize.iWidth < bitmapSize.iHeight ) { - TInt height = (*missingSizes)[i].iSize.iHeight; - (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth; - (*missingSizes)[i].iSize.iWidth = height; - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - portrait"); + TThumbnailSize size = (*missingSizes)[ i ].iType; + + if ( size == EFullScreenThumbnailSize || + size == EVideoFullScreenThumbnailSize || + size == EAudioFullScreenThumbnailSize || + size == EImageFullScreenThumbnailSize ) + { + TInt height = (*missingSizes)[i].iSize.iHeight; + (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth; + (*missingSizes)[i].iSize.iWidth = height; + + TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - portrait"); + } } - + CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(), - *Server(), params.iTargetUri, bitmap, bitmapSize, - (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, - KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, - reqId); + *Server(), params.iTargetUri, bitmap, bitmapSize, + (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, + KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, + reqId); CleanupStack::PushL( scaleTask ); scaleTask->SetDoStore( ETrue ); Server()->Processor().AddTaskL( scaleTask ); CleanupStack::Pop( scaleTask ); - + // completion to first task, because task processor works like stack if( i == 0 ) { @@ -793,7 +804,9 @@ TN_DEBUG2( "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", ¶ms.iFileName ); - if(Server()->StoreForPathL(params.iFileName)->IsDiskFull()) + // disk space check only for stored sizes + if ( params.iThumbnailSize != ECustomThumbnailSize && + Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) { User::Leave( KErrDiskFull ); } @@ -872,6 +885,7 @@ // Generate task is now responsible for completing the message iMessage = RMessage2(); } + // ----------------------------------------------------------------------------- // CThumbnailServerSession::CreateGenerateTaskL() // Create a task to generate a new thumbnail @@ -884,7 +898,9 @@ TN_DEBUG2( "CThumbnailServerSession::CreateGenerateTaskFromBufferL() -- create thumbnail generation task for %S", ¶ms.iTargetUri ); - if(Server()->StoreForPathL(params.iTargetUri)->IsDiskFull()) + // disk space check only for stored sizes + if ( params.iThumbnailSize != ECustomThumbnailSize && + Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() ) { User::Leave( KErrDiskFull ); } diff -r 85a88bc05e45 -r ffb2d5dd62e9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp Tue Apr 27 16:57:55 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailstore.cpp Tue May 11 16:30:11 2010 +0300 @@ -35,7 +35,7 @@ #include "thumbnailserver.h" -_LIT8( KThumbnailSqlConfig, "page_size=16384; cache_size=32;" ); +_LIT8( KThumbnailSqlConfig, "page_size=32768; cache_size=32;" ); const TInt KStreamBufferSize = 1024 * 8; const TInt KMajor = 3; @@ -136,13 +136,21 @@ { if ( iState != EOldOpen ) { - const TInt err = iDatabase.Exec( KThumbnailRollbackTransaction ); - if ( err >= 0 ) + // in some cases there could have been automatic rollback + if (iDatabase.InTransaction()) { - iState = EClosed; + const TInt err = iDatabase.Exec( KThumbnailRollbackTransaction ); + if ( err >= 0 ) + { + iState = EClosed; + } + + return err; } - - return err; + else + { + TN_DEBUG1( "RThumbnailTransaction::Rollback() - automatic rollback already done!" ); + } } iState = EClosed; @@ -418,10 +426,6 @@ TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailCreateInfoTableIndex1 err=%d", err ); User::LeaveIfError( err ); - err = iDatabase.Exec( KThumbnailCreateDeletedTableIndex ); - TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailCreateDeletedTableIndex err=%d", err ); - User::LeaveIfError( err ); - err = iDatabase.Exec(KThumbnailVersionTable); TN_DEBUG2( "CThumbnailStore::CreateTablesL() KThumbnailVersionTable err=%d", err ); User::LeaveIfError( err ); @@ -1936,23 +1940,51 @@ return; } - // fixed batch size if MTP sync on + // longer flush allowed if MTP sync on TInt MPXHarvesting(0); TInt ret = RProperty::Get(KTAGDPSNotification, KMPXHarvesting, MPXHarvesting); if(ret != KErrNone) + { + TN_DEBUG2( "CThumbnailStore::FlushCacheTable() error checking MTP sync: %d", ret); + } + + //set init max flush delay + TInt aMaxFlushDelay(KMaxFlushDelay); + + if(MPXHarvesting) { - TN_DEBUG2( "CThumbnailStore::FlushCacheTable() error checking MTP sync: %d", ret); + //MTP or MPX harvesting active, allow longer flush -> bigger batch size + TN_DEBUG1("CThumbnailStore::FlushCacheTable() MTP sync, longer flush.."); + aMaxFlushDelay = KMaxMTPFlushDelay; } - if(MPXHarvesting && iBatchItemCount < KMaxBatchItemsMTP && !aForce) + //1st item in batch + if( iBatchItemCount == 1) { - TN_DEBUG1("CThumbnailStore::FlushCacheTable() MTP sync, fixed batch..."); + //adjust batch size dynamically between min and max based on previous flush speed + if(iPreviousFlushDelay > 0 ) + { + iBatchFlushItemCount = (aMaxFlushDelay/iPreviousFlushDelay)*iBatchFlushItemCount; + + if(iBatchFlushItemCount < KMInBatchItems) + { + iBatchFlushItemCount = KMInBatchItems; + } + else if(iBatchFlushItemCount > KMaxBatchItems) + { + iBatchFlushItemCount = KMaxBatchItems; + } + } + else + { + //cannot calculate, init values set to min + iBatchFlushItemCount = KMInBatchItems; + } + } - //some items in cache - StartAutoFlush(); - return; - } - else if(!MPXHarvesting && iBatchItemCount < iBatchFlushItemCount && !aForce) + TN_DEBUG3("CThumbnailStore::FlushCacheTable() iBatchFlushItemCount = %d, iBatchItemCount = %d", iBatchFlushItemCount, iBatchItemCount); + + if( iBatchItemCount < iBatchFlushItemCount && !aForce) { //some items in cache StartAutoFlush(); @@ -2014,29 +2046,14 @@ } iStopFlush.UniversalTime(); - TInt aFlushDelay = (TInt)iStopFlush.MicroSecondsFrom(iStartFlush).Int64()/1000; - - TN_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", aFlushDelay); + iPreviousFlushDelay = (TInt)iStopFlush.MicroSecondsFrom(iStartFlush).Int64()/1000; - //adjust batch size dynamically between min and max based on read flush speed - if (!MPXHarvesting) - { - //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_DEBUG2( "CThumbnailStore::FlushCacheTable() took %d ms", iPreviousFlushDelay); + //cache flushed iBatchItemCount = 0; - TN_DEBUG2("CThumbnailStore::FlushCacheTable() out iBatchFlushItemCount = %d", iBatchFlushItemCount); + TN_DEBUG1("CThumbnailStore::FlushCacheTable() out"); } // -----------------------------------------------------------------------------