diff -r ffb2d5dd62e9 -r ad31f4183ddc imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue May 11 16:30:11 2010 +0300 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue May 25 13:01:47 2010 +0300 @@ -156,6 +156,8 @@ // void CThumbnailServerSession::CreateL() { + TN_DEBUG2( "CThumbnailServerSession::AddSession() = 0x%08x", this ); + Server()->AddSession(); } @@ -471,8 +473,8 @@ if( err == KErrCompletion ) { // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" ); + TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" ); + aMessage.Complete( err ); iMessage = RMessage2(); } @@ -494,8 +496,7 @@ } else if (!err && iBuffer) { - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - jpeg " ); + TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - jpeg " ); CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server() ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode ); @@ -515,8 +516,8 @@ } else { - TN_DEBUG2( - "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err ); + TN_DEBUG2( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err ); + aMessage.Complete( ConvertSqlErrToE32Err( err )); iMessage = RMessage2(); } @@ -591,8 +592,8 @@ else if( err == KErrCompletion ) { // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" ); + TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" ); + aMessage.Complete( err ); iMessage = RMessage2(); } @@ -643,26 +644,31 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); - if(params.iThumbnailSize != EUnknownThumbnailSize) + // delete existing + if(params.iOverwrite) { Server()->DeleteThumbnailsL( params.iTargetUri); } - if(params.iThumbnailSize == EFullScreenThumbnailSize || - params.iThumbnailSize == EGridThumbnailSize || - params.iThumbnailSize == EListThumbnailSize ) - { - TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; - TDataType mimetype; - TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype ); - - if( ret == KErrNone ) + // if only one size + if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0) + { + if(params.iThumbnailSize == EFullScreenThumbnailSize || + params.iThumbnailSize == EGridThumbnailSize || + params.iThumbnailSize == EListThumbnailSize ) { - sourceType = Server()->SourceTypeFromMimeType( mimetype ); - ModifyThumbnailSize(sourceType); + TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; + TDataType mimetype; + TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype ); + + if( ret == KErrNone ) + { + sourceType = Server()->SourceTypeFromMimeType( mimetype ); + ModifyThumbnailSize(sourceType); + } + User::LeaveIfError( ret ); } - User::LeaveIfError( ret ); - } + } TInt bufferSize = aMessage.Int2(); HBufC8* buffer = HBufC8::NewMaxLC( bufferSize ); @@ -686,17 +692,44 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); + const TThumbnailServerRequestId reqId( this, params.iRequestId ); + + // delete existing + if(params.iOverwrite) + { + Server()->DeleteThumbnailsL( params.iTargetUri); + } + + // if only one size + if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0) + { + if(params.iThumbnailSize == EFullScreenThumbnailSize || + params.iThumbnailSize == EGridThumbnailSize || + params.iThumbnailSize == EListThumbnailSize ) + { + TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; + TDataType mimetype; + TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype ); + + if( ret == KErrNone ) + { + sourceType = Server()->SourceTypeFromMimeType( mimetype ); + ModifyThumbnailSize(sourceType); + } + User::LeaveIfError( ret ); + } + } + TInt bitmapHandle = aMessage.Int1(); - TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId; // get bitmap CFbsBitmap* bitmap = new( ELeave )CFbsBitmap(); CleanupStack::PushL( bitmap ); User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) ); - + // use pool to prevent bitmap leak // this bitmap is shared to several scale tasks, one of which can Leave - Server()->AddBitmapToPoolL( reqId.iSession, bitmap, reqId ); + Server()->AddBitmapToPoolL( this, bitmap, reqId ); CleanupStack::Pop( bitmap ); iBitmapHandle = bitmap->Handle(); @@ -765,7 +798,7 @@ // completion to first task, because task processor works like stack if( i == 0 ) - { + { // scaleTask is now responsible for completing the RMessage scaleTask->SetMessageData( reqId, iMessage, iClientThread ); iMessage = RMessage2(); @@ -799,7 +832,7 @@ // void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile) { - const TThumbnailRequestParams& params = iRequestParams(); + TThumbnailRequestParams& params = iRequestParams(); TN_DEBUG2( "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", ¶ms.iFileName ); @@ -821,7 +854,6 @@ missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; CleanupClosePushL( *missingSizes ); - TBool gridSizeOnly(EFalse); if ( params.iQualityPreference == CThumbnailManager @@ -844,6 +876,25 @@ return; } } + // creating single TN on demand + else if( params.iThumbnailSize > ECustomThumbnailSize && params.iThumbnailSize < EThumbnailSizeCount) + { + TThumbnailPersistentSize persistentSize = Server()->PersistentSizeL(params.iThumbnailSize); + + if(persistentSize.iCrop) + { + params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags | CThumbnailManager::ECropToAspectRatio); + } + else + { + params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags & CThumbnailManager::ECropToAspectRatio); + } + + if( ClientThreadAlive() ) + { + iMessage.Write( 0, iRequestParams ); + } + } // priority TInt priority = params.iPriority; @@ -1079,8 +1130,7 @@ TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool"); - TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId; - Server()->AddBitmapToPoolL( this, iBitmap, reqId ); + Server()->AddBitmapToPoolL( this, iBitmap, TThumbnailServerRequestId( this, params.iRequestId ) ); iMessage.Complete( KErrNone ); iMessage = RMessage2(); @@ -1182,7 +1232,6 @@ aMessage.ReadL( 0, iRequestParams ); const TThumbnailRequestParams& params = iRequestParams(); - #ifdef RD_MDS_2_5 // try to query path from MDS CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask( @@ -1190,9 +1239,11 @@ CleanupStack::PushL( task ); task->QueryPathByIdL(params.iThumbnailId, ETrue); + task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ) ); Server()->QueueTaskL( task ); CleanupStack::Pop( task ); // owned by processor now #endif // RD_MDS_2_5 + aMessage.Complete( KErrNone ); iMessage = RMessage2(); } @@ -1202,8 +1253,7 @@ // list of supported MIME types // ----------------------------------------------------------------------------- // -void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage - ) +void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage ) { TPckgBuf < TInt > buf; buf() = Server()->GetMimeTypeBufferSize();