diff -r ea43e3e86079 -r a0ee3f735f8b imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Tue Jun 15 14:30:57 2010 +0100 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Thu Jul 22 16:37:07 2010 +0100 @@ -55,6 +55,10 @@ CThumbnailServerSession::~CThumbnailServerSession() { Server()->DropSession(this); + delete iBitmap; + iBitmap = NULL; + delete iBuffer; + iBuffer = NULL; } @@ -156,6 +160,8 @@ // void CThumbnailServerSession::CreateL() { + TN_DEBUG2( "CThumbnailServerSession::AddSession() = 0x%08x", this ); + Server()->AddSession(); } @@ -442,6 +448,7 @@ const TThumbnailRequestParams& params = iRequestParams(); RFile64 file; + CleanupClosePushL(file); User::LeaveIfError( file.AdoptFromClient( aMessage, 2, 3 )); ResolveMimeTypeL(&file); @@ -455,13 +462,20 @@ ModifyThumbnailSize(sourceType); } + // delete existing + if(params.iImport && params.iOverwrite) + { + Server()->DeleteThumbnailsL( params.iTargetUri); + } + // CreateThumbnails if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly) { TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" ); - CleanupClosePushL( file ); CreateGenerateTaskFromFileHandleL( &file ); - CleanupStack::Pop( &file ); + + // ownership of the file transferred + CleanupStack::Pop(&file); } // single thumbnail request else @@ -471,17 +485,20 @@ 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(); + + // close file + CleanupStack::PopAndDestroy(&file); } else if ( !err && iBitmap ) { TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - bitmap " ); // Thumbnail already stored - file.Close(); + CleanupStack::PopAndDestroy(&file); TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed"); ProcessBitmapL(); @@ -491,11 +508,13 @@ { TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" ); CreateGenerateTaskFromFileHandleL( &file); + + // ownership of the file transferred + CleanupStack::Pop(&file); } 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 ); @@ -510,15 +529,20 @@ //CThumbnailDecodeTask is responsible freeing iBuffer = NULL; - file.Close(); + + // close file + CleanupStack::PopAndDestroy(&file); TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed"); } 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(); + + // close file + CleanupStack::PopAndDestroy(&file); } } } @@ -591,8 +615,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(); } @@ -601,6 +625,19 @@ TN_DEBUG2( "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err ); + // don't try to create from virtual URI + if ( params.iVirtualUri ) + { + User::Leave(err); + } + + // disk space check only for stored sizes + if ( params.iThumbnailSize != ECustomThumbnailSize && + Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) + { + User::Leave( KErrDiskFull ); + } + if ( (err == KErrNotFound || err == KErrAccessDenied) && !(params.iFlags& CThumbnailManager::EDoNotCreate) ) { @@ -608,15 +645,6 @@ // and retry the request using file handle err = KThumbnailErrThumbnailNotFound; } - else - { - User::Leave(err); - } - - if(Server()->StoreForPathL(params.iFileName)->IsDiskFull()) - { - User::Leave( KErrDiskFull ); - } User::Leave(err); } @@ -641,26 +669,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 ); @@ -684,17 +717,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(); @@ -755,7 +815,8 @@ *Server(), params.iTargetUri, bitmap, bitmapSize, (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode, KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse, - reqId); + reqId, params.iVirtualUri); + CleanupStack::PushL( scaleTask ); scaleTask->SetDoStore( ETrue ); Server()->Processor().AddTaskL( scaleTask ); @@ -763,7 +824,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(); @@ -797,12 +858,19 @@ // void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile) { - const TThumbnailRequestParams& params = iRequestParams(); + TThumbnailRequestParams& params = iRequestParams(); 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.iImport && + Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() ) + { + User::Leave( KErrDiskFull ); + } + else if ( params.iThumbnailSize != ECustomThumbnailSize && + Server()->StoreForPathL(params.iFileName)->IsDiskFull() ) { User::Leave( KErrDiskFull ); } @@ -817,16 +885,22 @@ missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; CleanupClosePushL( *missingSizes ); - TBool gridSizeOnly(EFalse); - if ( params.iQualityPreference == CThumbnailManager - ::EOptimizeForQualityWithPreview ) + if ( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview ) { gridSizeOnly = ETrue; } - Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly); + // import vs. normal + if(params.iImport) + { + Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, gridSizeOnly); + } + else + { + Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly); + } if ( missingSizes->Count() == 0) { @@ -840,6 +914,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; @@ -858,7 +951,8 @@ 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.iModified, params.iQualityPreference ); + params.iThumbnailSize, params.iModified, params.iQualityPreference, + params.iVirtualUri); // do not store bitmaps to server pool when generating only if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) @@ -881,6 +975,7 @@ // Generate task is now responsible for completing the message iMessage = RMessage2(); } + // ----------------------------------------------------------------------------- // CThumbnailServerSession::CreateGenerateTaskL() // Create a task to generate a new thumbnail @@ -893,7 +988,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 ); } @@ -967,7 +1064,8 @@ 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.iModified, params.iQualityPreference ); + params.iThumbnailSize, params.iModified, params.iQualityPreference, + params.iVirtualUri); // do not store bitmaps to server pool when generating only if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) @@ -1041,16 +1139,6 @@ { TThumbnailRequestParams& params = iRequestParams(); - // in import case store bitmap - 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.iModified, - EFalse, EFalse); - } - if ( ClientThreadAlive() ) { TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle()); @@ -1072,8 +1160,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(); @@ -1175,7 +1262,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( @@ -1183,9 +1269,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(); } @@ -1195,8 +1283,7 @@ // list of supported MIME types // ----------------------------------------------------------------------------- // -void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage - ) +void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage ) { TPckgBuf < TInt > buf; buf() = Server()->GetMimeTypeBufferSize(); @@ -1272,6 +1359,21 @@ params.iThumbnailSize = EAudioListThumbnailSize; } } + else if(aSourceType == TThumbnailPersistentSize::EContact) + { + if(params.iThumbnailSize == EFullScreenThumbnailSize) + { + params.iThumbnailSize = EContactFullScreenThumbnailSize; + } + else if(params.iThumbnailSize == EGridThumbnailSize) + { + params.iThumbnailSize = EContactGridThumbnailSize; + } + else if(params.iThumbnailSize == EListThumbnailSize) + { + params.iThumbnailSize = EContactListThumbnailSize; + } + } } //------------------------------------------------------------------------ @@ -1285,34 +1387,42 @@ // mime type if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) ) - { - // try parsing from file extension - res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType ); - if ( res == KErrNotFound ) - { - if( aFile ) - { - // parsed type not in the list, resolve from file - params.iMimeType = Server()->ResolveMimeTypeL(*aFile); - } - else - { - Server()->Fs().ShareProtected(); - RFile64 file; - CleanupClosePushL( file ); - - User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); - TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", ¶ms.iFileName ); - - params.iMimeType = Server()->ResolveMimeTypeL(file); - - file.Close(); - TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed"); - - CleanupStack::Pop( &file ); - } - } - } + { + // try parsing from file extension + if (params.iImport) + { + res = Server()->MimeTypeFromFileExt( params.iTargetUri, params.iMimeType ); + } + else + { + res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType ); + } + + if ( res == KErrNotFound ) + { + if( aFile ) + { + // parsed type not in the list, resolve from file + params.iMimeType = Server()->ResolveMimeTypeL(*aFile); + } + else + { + Server()->Fs().ShareProtected(); + RFile64 file; + CleanupClosePushL( file ); + + User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); + TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", ¶ms.iFileName ); + + params.iMimeType = Server()->ResolveMimeTypeL(file); + + file.Close(); + TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed"); + + CleanupStack::Pop( &file ); + } + } + } } @@ -1323,12 +1433,20 @@ TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason ) { TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason); - TInt e32Err; + TInt e32Err(aReason); + if ( aReason >= - 144 ) // magic: [-1..-144] is E32 error range { // E32 error value or non-negative value - e32Err = aReason; + switch ( aReason ) + { + case KErrServerTerminated: + e32Err = KErrCorrupt; + break; + default: + e32Err = aReason; + } } else { @@ -1445,4 +1563,5 @@ } } + // End of file