diff -r 235a7fc86938 -r 2edacbf5d3f9 imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue Feb 02 00:23:15 2010 +0200 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Fri Mar 19 09:35:30 2010 +0200 @@ -102,11 +102,6 @@ err = ChangePriority( aMessage ); break; } - case ECreateThumbnails: - { - CreateThumbnailsL( aMessage ); - break; - } case EDeleteThumbnails: { DeleteThumbnailsL( aMessage ); @@ -243,17 +238,65 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); - TBool finished = Server()->UpdateThumbnailsL( params.iThumbnailId, params.iFileName, params.iOrientation, params.iModified ); + TBool finished = Server()->UpdateThumbnailsL( params.iFileName, params.iOrientation, params.iModified ); + + RArray < TThumbnailPersistentSize >* missingSizes = NULL; + + TBool gridSizeOnly(EFalse); + + if ( params.iQualityPreference == CThumbnailManager + ::EOptimizeForQualityWithPreview ) + { + gridSizeOnly = ETrue; + } if (finished) { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished" ); + // source type + TDataType mimeType; + TInt sourceType = 0; + TInt err = Server()->MimeTypeFromFileExt( params.iFileName, mimeType ); + + // get missing sizes + if ( err == KErrNone && ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) + { + sourceType = Server()->SourceTypeFromMimeType( mimeType ); + + missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; + CleanupClosePushL( *missingSizes ); - aMessage.Complete( KErrNone ); + Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly ); + + if ( missingSizes->Count() == 0) + { + // all thumbs already exist + CleanupStack::PopAndDestroy( missingSizes ); + delete missingSizes; + missingSizes = NULL; + } + } + + if(!missingSizes) + { + TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished part 1" ); + aMessage.Complete( KErrNone ); + } + else + { + TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - some sizes missing..." ); + } } - else + + if (missingSizes || !finished) { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - need to recreate thumbs" ); + TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - need to create (some) thumbs" ); + + if(missingSizes) + { + CleanupStack::PopAndDestroy( missingSizes ); + delete missingSizes; + missingSizes = NULL; + } if(Server()->StoreForPathL(params.iFileName)->IsDiskFull()) { @@ -263,6 +306,10 @@ // need to create new thumbs aMessage.Complete( KThumbnailErrThumbnailNotFound ); } + else + { + TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished part 2" ); + } iMessage = RMessage2(); } @@ -289,54 +336,14 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); - TRAPD( err, Server()->FetchThumbnailL( params.iThumbnailId, iBitmap, iBuffer, - params.iThumbnailSize, iOriginalSize )); - if ( !err && iBitmap ) - { - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByIdAsyncL() - found existing thumbnail- bitmap" ); - - ProcessBitmapL(); - } - else if ( !err && iBuffer) - { - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByIdAsyncL() - found existing thumbnail- jpeg" ); - - CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() - ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); - - CleanupStack::PushL( task ); - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - - // Decode task is now responsible for completing the message - iMessage = RMessage2(); - - //CThumbnailDecodeTask is responsible freeing - iBuffer = NULL; - } - else if( err == KErrCompletion ) - { - // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByIdAsyncL() - thumbnail blacklisted" ); - aMessage.Complete( err ); - iMessage = RMessage2(); - } - else - { - TN_DEBUG2( - "CThumbnailServerSession::RequestThumbByIdAsyncL() - thumbnail not found ( query path from MDS ), err=%d ", err ); - + #ifdef RD_MDS_2_5 // try to query path from MDS CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); CleanupStack::PushL( task ); - task->QueryPathByIdL(params.iThumbnailId); + task->QueryPathByIdL(params.iThumbnailId, EFalse); task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); Server()->QueueTaskL( task ); CleanupStack::Pop( task ); // owned by processor now @@ -344,14 +351,13 @@ // query task is now responsible for completing the message iMessage = RMessage2(); #else - User::Leave(KThumbnailErrThumbnailNotFound); + User::Leave(KErrNotSupported); #endif // RD_MDS_2_5 - } #ifdef _DEBUG aStop.UniversalTime(); - TN_DEBUG2( "CThumbnailStore::RequestThumbByIdAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 ); + TN_DEBUG2( "CThumbnailServerSession::RequestThumbByIdAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 ); #endif TN_DEBUG1("CThumbnailServerSession::RequestThumbByIdAsyncL() - end" ); @@ -392,6 +398,7 @@ // CreateThumbnails if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly) { + TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" ); CleanupClosePushL( file ); CreateGenerateTaskFromFileHandleL( &file ); CleanupStack::Pop( &file ); @@ -401,7 +408,15 @@ { TRAPD( err, FetchThumbnailL()); - if ( !err && iBitmap ) + if( err == KErrCompletion ) + { + // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion + TN_DEBUG1( + "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" ); + aMessage.Complete( err ); + iMessage = RMessage2(); + } + else if ( !err && iBitmap ) { TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - bitmap " ); @@ -414,6 +429,7 @@ else if ( (err == KErrNotFound || err == KErrAccessDenied) && !(params.iFlags& CThumbnailManager::EDoNotCreate) ) { + TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" ); CreateGenerateTaskFromFileHandleL( &file); } else if (!err && iBuffer) @@ -516,7 +532,7 @@ { // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByIdAsyncL() - thumbnail blacklisted" ); + "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" ); aMessage.Complete( err ); iMessage = RMessage2(); } @@ -542,24 +558,7 @@ User::Leave( KErrDiskFull ); } -#ifdef RD_MDS_2_5 - // try to query ID from MDS - CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( - Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); - - CleanupStack::PushL( task ); - task->SetUpdateToDb( EFalse ); - task->QueryIdByPathL( params.iFileName ); - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - - // query task is now responsible for completing the message - iMessage = RMessage2(); -#else User::Leave(err); -#endif // RD_MDS_2_5 - } } @@ -627,7 +626,7 @@ CFbsBitmap* bitmap = new( ELeave )CFbsBitmap(); CleanupStack::PushL( bitmap ); User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) ); - Server()->AddBitmapToPoolL( reqId.iSession, bitmap ); + Server()->AddBitmapToPoolL( reqId.iSession, bitmap, reqId ); CleanupStack::Pop( bitmap ); iBitmapHandle = bitmap->Handle(); @@ -637,7 +636,6 @@ TDataType mimeType; TInt sourceType = 0; TInt err = Server()->MimeTypeFromFileExt( params.iTargetUri, mimeType ); - TBool missingIDs(EFalse); // get missing sizes if ( err == KErrNone && ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) @@ -647,7 +645,7 @@ missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; CleanupClosePushL( *missingSizes ); - Server()->GetMissingSizesAndIDsL( params.iTargetUri, sourceType, *missingSizes, missingIDs); + Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse); if ( missingSizes->Count() == 0) { @@ -678,11 +676,9 @@ 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.iThumbnailId, EFalse, EFalse ); + KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse ); CleanupStack::PushL( scaleTask ); scaleTask->SetDoStore( ETrue ); - //increase priority, scale needs to run before ID update below - scaleTask->SetPriority( params.iPriority + 1 ); Server()->Processor().AddTaskL( scaleTask ); CleanupStack::Pop( scaleTask ); @@ -693,8 +689,6 @@ iMessage = RMessage2(); } } - - TN_DEBUG3("CThumbnailServerSession::RequestSetThumbnailByBitmapL() ID = %d, missingIDs = %d", params.iThumbnailId, missingIDs); } else { @@ -714,23 +708,6 @@ iBitmapHandle = 0; bitmap = NULL; } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::CreateThumbnailsL() -// Create thumbnails for given object file -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::CreateThumbnailsL( const RMessage2& aMessage ) - { - RFile64 file; - CleanupClosePushL( file ); - User::LeaveIfError( file.AdoptFromClient( aMessage, 1, 2 )); - - CreateGenerateTaskFromFileHandleL( &file); - - CleanupStack::Pop( &file ); - } - // ----------------------------------------------------------------------------- // CThumbnailServerSession::CreateGenerateTaskL() @@ -748,8 +725,6 @@ { User::Leave( KErrDiskFull ); } - - TBool missingIDs = EFalse; RArray < TThumbnailPersistentSize >* missingSizes = NULL; @@ -760,35 +735,17 @@ sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; CleanupClosePushL( *missingSizes ); - - Server()->GetMissingSizesAndIDsL( params.iFileName, sourceType, *missingSizes, missingIDs ); -#ifdef RD_MDS_2_5 - if( missingIDs ) - { - TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() some IDs missing"); + + + TBool gridSizeOnly(EFalse); - if( params.iThumbnailId == KNoId) - { - TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() query fro MDS"); - // try to query ID from MDS - CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( - Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); - - CleanupStack::PushL( task ); - task->QueryIdByPathL( params.iFileName ); - - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ) ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() query from MDS queued" ); - } - else - { - TN_DEBUG2("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() got ID %d from params", params.iThumbnailId); - TRAP_IGNORE( Server()->UpdateIDL(params.iFileName, params.iThumbnailId ) ); - } - } -#endif // RD_MDS_2_5 + if ( params.iQualityPreference == CThumbnailManager + ::EOptimizeForQualityWithPreview ) + { + gridSizeOnly = ETrue; + } + + Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly); if ( missingSizes->Count() == 0) { @@ -820,7 +777,7 @@ CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() ->Processor(), * Server(), aFile, NULL, ¶ms.iMimeType, params.iFlags, params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, - params.iThumbnailSize, params.iThumbnailId, params.iQualityPreference ); + params.iThumbnailSize, params.iModified, params.iQualityPreference ); // do not store bitmaps to server pool when generating only if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) @@ -897,8 +854,7 @@ missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; CleanupClosePushL( *missingSizes ); - TBool missingIDs; - Server()->GetMissingSizesAndIDsL( params.iTargetUri, sourceType, *missingSizes, missingIDs ); + Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse ); if ( missingSizes->Count() == 0) { @@ -931,7 +887,7 @@ CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server() ->Processor(), * Server(), NULL, aBuffer, ¶ms.iMimeType, params.iFlags, params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri, - params.iThumbnailSize, params.iThumbnailId, params.iQualityPreference ); + params.iThumbnailSize, params.iModified, params.iQualityPreference ); // do not store bitmaps to server pool when generating only if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) @@ -977,15 +933,13 @@ if( params.iFileName != KNullDesC ) { - TN_DEBUG4( "CThumbnailServerSession::FetchThumbnailL( TNId==%d ThumbnailSize=%d ( Path=%S ))", - params.iThumbnailId, params.iThumbnailSize, ¶ms.iFileName ); + TN_DEBUG3( "CThumbnailServerSession::FetchThumbnailL( ThumbnailSize=%d ( Path=%S ))", + params.iThumbnailSize, ¶ms.iFileName ); Server()->FetchThumbnailL( params.iFileName, iBitmap, iBuffer, params.iThumbnailSize, iOriginalSize); } else { - TN_DEBUG3( "CThumbnailServerSession::FetchThumbnailL(Path=%S ThumbnailSize=%d)", - ¶ms.iFileName, params.iThumbnailSize ); - Server()->FetchThumbnailL( params.iThumbnailId, iBitmap, iBuffer, params.iThumbnailSize, iOriginalSize ); + User::Leave( KErrNotSupported ); } #ifdef _DEBUG if( iBitmap) @@ -1006,36 +960,52 @@ TThumbnailRequestParams& params = iRequestParams(); // in import case store bitmap - if (params.iTargetUri != KNullDesC) + if ( params.iTargetUri != KNullDesC && params.iFileName != KNullDesC && + params.iFileName.CompareF(params.iTargetUri) != 0 ) { Server()->StoreThumbnailL( params.iTargetUri, iBitmap, iOriginalSize, - params.iFlags& CThumbnailManager::ECropToAspectRatio, params.iThumbnailSize, params.iThumbnailId ); + params.iFlags& CThumbnailManager::ECropToAspectRatio, + params.iThumbnailSize, params.iModified, + EFalse, EFalse); } - // No need to scale, return iBitmap directly - Server()->AddBitmapToPoolL( this, iBitmap ); - CFbsBitmap* bitmap = iBitmap; - iBitmap = NULL; // owned by server now - - params.iBitmapHandle = bitmap->Handle(); - const TSize bitmapSize = bitmap->SizeInPixels(); + if ( ClientThreadAlive(iMessage) ) + { + // No need to scale, return iBitmap directly + + TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId; + // No need to scale, return iBitmap directly + Server()->AddBitmapToPoolL( this, iBitmap, reqId ); + + CFbsBitmap* bitmap = iBitmap; + + TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", bitmap->Handle()); + + iBitmap = NULL; // owned by server now + + params.iBitmapHandle = bitmap->Handle(); + const TSize bitmapSize = bitmap->SizeInPixels(); + + if ( params.iQualityPreference == CThumbnailManager + ::EOptimizeForQualityWithPreview && bitmapSize.iWidth < + params.iSize.iWidth && bitmapSize.iHeight < params.iSize.iHeight && + bitmapSize.iWidth < iOriginalSize.iWidth && bitmapSize.iHeight < + iOriginalSize.iHeight ) + { + // This is a non-scaled preview bitmap + params.iControlFlags = EThumbnailPreviewThumbnail; + } - if ( params.iQualityPreference == CThumbnailManager - ::EOptimizeForQualityWithPreview && bitmapSize.iWidth < - params.iSize.iWidth && bitmapSize.iHeight < params.iSize.iHeight && - bitmapSize.iWidth < iOriginalSize.iWidth && bitmapSize.iHeight < - iOriginalSize.iHeight ) - { - // This is a non-scaled preview bitmap - params.iControlFlags = EThumbnailPreviewThumbnail; - } - - if ( iMessage.Handle() ) - { iMessage.WriteL( 0, iRequestParams ); + iMessage.Complete( KErrNone ); iMessage = RMessage2(); } + else + { + delete iBitmap; + iBitmap = NULL; + } } // ----------------------------------------------------------------------------- @@ -1122,9 +1092,17 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); - TThumbnailId id = params.iThumbnailId; - Server()->DeleteThumbnailsByIdL( id ); + +#ifdef RD_MDS_2_5 + // try to query path from MDS + CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( + Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server()); + CleanupStack::PushL( task ); + task->QueryPathByIdL(params.iThumbnailId, ETrue); + Server()->QueueTaskL( task ); + CleanupStack::Pop( task ); // owned by processor now +#endif // RD_MDS_2_5 aMessage.Complete( KErrNone ); iMessage = RMessage2(); } @@ -1259,6 +1237,7 @@ // TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason ) { + TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason); TInt e32Err; if ( aReason >= - 144 ) // magic: [-1..-144] is E32 error range @@ -1346,4 +1325,51 @@ return e32Err; } +// --------------------------------------------------------------------------- +// CThumbnailServerSession::ClientThreadAlive() +// Checks if client thread is still alive and RMessage2 handle valid. +// --------------------------------------------------------------------------- +// +TBool CThumbnailServerSession::ClientThreadAlive(RMessage2& aMessage) + { + if ( aMessage.Handle()) + { + RThread clientThread; + + // get client thread + TInt err = aMessage.Client( clientThread ); + if (err != KErrNone) + { + TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread not found"); + + aMessage = RMessage2(); + + return EFalse; + } + + // check if client thread alive + TExitType exitType = clientThread.ExitType(); + + clientThread.Close(); + + if( exitType != EExitPending ) + { + TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread died"); + + aMessage = RMessage2(); + + return EFalse; + } + else + { + // all OK + return ETrue; + } + } + else + { + return EFalse; + } + } + // End of file