diff -r 2e2a89493e2b -r 48dd0f169f0d imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp --- a/imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp Fri Sep 03 10:29:37 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1663 +0,0 @@ -/* -* 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: Server side session for Thumbnail Manager Server - * -*/ - -#include - -#include "thumbnailserversession.h" -#include "thumbnailserver.h" -#include "thumbnailtaskprocessor.h" -#include "thumbnailmanagerconstants.h" -#include "thumbnailgeneratetask.h" -#include "thumbnailscaletask.h" -#include "thumbnaildecodetask.h" -#ifdef RD_MDS_2_5 -#include "thumbnailmdsquerytask.h" -#endif // RD_MDS_2_5 -#include "thumbnaillog.h" -#include "thumbnailpanic.h" - -#include "thumbnailcenrep.h" -#include "OstTraceDefinitions.h" -#ifdef OST_TRACE_COMPILER_IN_USE -#include "thumbnailserversessionTraces.h" -#endif - - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CThumbnailServerSession::CThumbnailServerSession() -// C++ default constructor can NOT contain any code, that might leave. -// --------------------------------------------------------------------------- -// -CThumbnailServerSession::CThumbnailServerSession(): CSession2() - { - iBitmapHandle = 0; - iBitmap = NULL; - iBuffer = NULL; - } - - -// --------------------------------------------------------------------------- -// CThumbnailServerSession::~CThumbnailServerSession() -// Destructor. -// --------------------------------------------------------------------------- -// -CThumbnailServerSession::~CThumbnailServerSession() - { - Server()->DropSession(this); - delete iBitmap; - iBitmap = NULL; - delete iBuffer; - iBuffer = NULL; - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::DispatchMessageL() -// Message dispatcher. -// ----------------------------------------------------------------------------- -// -TInt CThumbnailServerSession::DispatchMessageL( const RMessage2& aMessage ) - { - TInt err( KErrNone ); - - switch ( aMessage.Function()) - { - case ERequestThumbByFileHandleAsync: - { - RequestThumbByFileHandleAsyncL( aMessage ); - break; - } - case ERequestThumbByPathAsync: - { - RequestThumbByPathAsyncL( aMessage ); - break; - } - case ERequestSetThumbnailByBuffer: - { - RequestSetThumbnailByBufferL( aMessage ); - break; - } - case ERequestSetThumbnailByBitmap: - { - RequestSetThumbnailByBitmapL( aMessage ); - break; - } - case EReleaseBitmap: - { - ReleaseBitmap( aMessage ); - break; - } - case ECancelRequest: - { - err = CancelRequest( aMessage ); - break; - } - case EChangePriority: - { - err = ChangePriority( aMessage ); - break; - } - case EDeleteThumbnails: - { - DeleteThumbnailsL( aMessage ); - break; - } - case EDeleteThumbnailsById: - { - DeleteThumbnailsByIdL( aMessage ); - break; - } - case EGetMimeTypeBufferSize: - { - GetMimeTypeBufferSizeL( aMessage ); - break; - } - case EGetMimeTypeList: - { - GetMimeTypeListL( aMessage ); - break; - } - case ERequestThumbByIdAsync: - { - RequestThumbByIdAsyncL( aMessage ); - break; - } - case EUpdateThumbnails: - { - UpdateThumbnailsL( aMessage ); - break; - } - case ERenameThumbnails: - { - RenameThumbnailsL( aMessage ); - break; - } - default: - { - err = KErrUnknown; - break; - } - } - - return err; - } - - -// --------------------------------------------------------------------------- -// CThumbnailServerSession::CreateL() -// --------------------------------------------------------------------------- -// -void CThumbnailServerSession::CreateL() - { - TN_DEBUG2( "CThumbnailServerSession::AddSession() = 0x%08x", this ); - OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEL, "CThumbnailServerSession::CreateL;this=%o", this ); - - Server()->AddSession(); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::ServiceL() -// Handles service request messages from clients. -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::ServiceL( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::ServiceL() - begin" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - begin" ); - - __ASSERT_DEBUG( !iMessage.Handle(), ThumbnailPanic(EThumbnailMessageNotCompleted)); - if ( iMessage.Handle()) - { - iMessage.Complete( KErrUnknown ); - iMessage = RMessage2(); - } - - iMessage = aMessage; - - if ( iMessage.Handle()) - { - // get client thread - TInt err = iMessage.Client( iClientThread ); - if (err != KErrNone) - { - TN_DEBUG1( "CThumbnailServerSession::ServiceL() - client thread not found"); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - client thread not found" ); - - iMessage = RMessage2(); - } - } - else - { - TN_DEBUG1( "CThumbnailServerSession::ServiceL() - message null"); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - message null" ); - } - - // clean up possible trash - if (iBitmapHandle) - { - Server()->DeleteBitmapFromPool( iBitmapHandle ); - iBitmapHandle = 0; - } - delete iBitmap; - iBitmap = NULL; - delete iBuffer; - iBuffer = NULL; - iOriginalSize = TSize(); - - TInt ret = KErrNone; - - TRAPD( err, ret = DispatchMessageL( aMessage ) ); - - // if message was not completed, or Leave occurred - if ( iMessage.Handle()) - { - if ( ClientThreadAlive() ) - { - iMessage.Complete( ConvertSqlErrToE32Err( err != KErrNone ? err : ret )); - } - - iMessage = RMessage2(); - } - - // close thread handle - iClientThread.Close(); - - TN_DEBUG1( "CThumbnailServerSession::ServiceL() - end" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - end" ); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::Server() -// Returns the server pointer. -// ----------------------------------------------------------------------------- -// -CThumbnailServer* CThumbnailServerSession::Server() - { - return ( CThumbnailServer* )( CSession2::Server()); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::Cancel() -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::Cancel() - { - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::UpdateThumbnailsL() -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::UpdateThumbnailsL( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL" ); - - if(aMessage.Int1() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - // read message params - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - - 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) - { - // source type - TDataType mimeType; - TInt sourceType = 0; - TInt err = Server()->MimeTypeFromFileExt( params.iFileName, mimeType ); - - // need to use recognizer - if (err == KErrNotFound) - { - Server()->Fs().ShareProtected(); - RFile64 file; - CleanupClosePushL( file ); - - User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); - TN_DEBUG2( "CThumbnailServerSession::UpdateThumbnailsL - file handle opened for %S", ¶ms.iFileName ); - - mimeType = Server()->ResolveMimeTypeL(file); - - file.Close(); - TN_DEBUG1("CThumbnailServerSession::UpdateThumbnailsL - file handle closed"); - - CleanupStack::Pop( &file ); - } - - // get missing sizes - if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) - { - sourceType = Server()->SourceTypeFromMimeType( mimeType ); - - missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; - CleanupClosePushL( *missingSizes ); - - 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" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - finished part 1" ); - aMessage.Complete( KErrNone ); - } - else - { - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - some sizes missing..." ); - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - some sizes missing..." ); - } - } - - if (missingSizes || !finished) - { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - need to create (some) thumbs" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - need to create (some) thumbs" ); - - if(missingSizes) - { - CleanupStack::PopAndDestroy( missingSizes ); - delete missingSizes; - missingSizes = NULL; - } - - if(Server()->StoreForPathL(params.iFileName)->IsDiskFull()) - { - User::Leave( KErrDiskFull ); - } - - // need to create new thumbs - aMessage.Complete( KThumbnailErrThumbnailNotFound ); - } - else - { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished part 2" ); - OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - finished part 2" ); - } - - iMessage = RMessage2(); - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::RenameThumbnailsL() -// Rename thumbnails. -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::RenameThumbnailsL( const RMessage2& aMessage ) - { - if(aMessage.Int1() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RenameThumbnailsL() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RENAMETHUMBNAILSL, "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() -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::RequestThumbByIdAsyncL( const RMessage2& - aMessage ) - { -#ifdef _DEBUG - TTime aStart, aStop; - aStart.UniversalTime(); -#endif - - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByIdAsyncL() - begin" ); - - if(aMessage.Int1() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByIdAsync() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL - leaving" ); - User::Leave(KErrArgument); - } - - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - -#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, EFalse); - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - - // query task is now responsible for completing the message - iMessage = RMessage2(); -#else - User::Leave(KErrNotSupported); -#endif // RD_MDS_2_5 - - -#ifdef _DEBUG - aStop.UniversalTime(); - TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000; - TN_DEBUG2( "CThumbnailServerSession::RequestThumbByIdAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 ); - OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL;tookTime=%d", tookTime ); -#endif - - TN_DEBUG1("CThumbnailServerSession::RequestThumbByIdAsyncL() - end" ); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL - end" ); - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::RequestThumbByFileHandleAsync() -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::RequestThumbByFileHandleAsyncL( const RMessage2& - aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL" ); - - if(aMessage.Int1() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsync() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - - RFile64 file; - CleanupClosePushL(file); - User::LeaveIfError( file.AdoptFromClient( aMessage, 2, 3 )); - - ResolveMimeTypeL(&file); - - if(params.iThumbnailSize == EFullScreenThumbnailSize || - params.iThumbnailSize == EGridThumbnailSize || - params.iThumbnailSize == EListThumbnailSize ) - { - TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; - sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); - ModifyThumbnailSize(sourceType); - } - - // delete existing - if(params.iImport && params.iOverwrite) - { - Server()->DeleteThumbnailsL( params.iTargetUri); - } - - // CreateThumbnails - if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" ); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - EThumbnailGeneratePersistentSizesOnly" ); - CreateGenerateTaskFromFileHandleL( &file ); - - // ownership of the file transferred - CleanupStack::Pop(&file); - } - // single thumbnail request - else - { - TRAPD( err, FetchThumbnailL()); - - if( err == KErrCompletion ) - { - // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" ); - OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "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 " ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - found existing thumbnail - bitmap " ); - - // Thumbnail already stored - CleanupStack::PopAndDestroy(&file); - TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed"); - OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed" ); - - ProcessBitmapL(); - } - else if ( (err == KErrNotFound || err == KErrAccessDenied) && - !(params.iFlags& CThumbnailManager::EDoNotCreate) ) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" ); - OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "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 " ); - OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - 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, iClientThread ); - 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; - - // close file - CleanupStack::PopAndDestroy(&file); - TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed"); - OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed" ); - } - else - { - TN_DEBUG2( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err ); - OstTrace1( TRACE_NORMAL, DUP9_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - thumbnail not found;err=%d", err ); - - aMessage.Complete( ConvertSqlErrToE32Err( err )); - iMessage = RMessage2(); - - // close file - CleanupStack::PopAndDestroy(&file); - } - } - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::RequestThumbByPathAsync() -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::RequestThumbByPathAsyncL( const RMessage2& - aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsyncL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL" ); - -#ifdef _DEBUG - TTime aStart, aStop; - aStart.UniversalTime(); -#endif - - if(aMessage.Int1() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsync() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - - ResolveMimeTypeL(NULL); - - if(params.iThumbnailSize == EFullScreenThumbnailSize || - params.iThumbnailSize == EGridThumbnailSize || - params.iThumbnailSize == EListThumbnailSize ) - { - TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; - sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); - ModifyThumbnailSize(sourceType); - } - - // should always be true - if (params.iControlFlags != EThumbnailGeneratePersistentSizesOnly) - { - TRAPD( err, FetchThumbnailL()); - - if ( !err && iBitmap ) - { - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByPathAsyncL() - found existing thumbnail- bitmap" ); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - found existing thumbnail- bitmap" ); - - ProcessBitmapL(); - } - else if ( !err && iBuffer) - { - TN_DEBUG1( - "CThumbnailServerSession::RequestThumbByPathAsyncL() - found existing thumbnail- jpeg" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - 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, iClientThread ); - 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::RequestThumbByPathAsyncL() - thumbnail blacklisted" ); - OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - thumbnail blacklisted" ); - - aMessage.Complete( err ); - iMessage = RMessage2(); - } - else - { - TN_DEBUG2( - "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err ); - OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "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) ) - { - // Special error code so that the client side can open the file - // and retry the request using file handle - err = KThumbnailErrThumbnailNotFound; - } - - User::Leave(err); - } - } - -#ifdef _DEBUG - aStop.UniversalTime(); - TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000; - TN_DEBUG2( "CThumbnailStore::RequestThumbByPathAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 ); - OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL;tookTime=%d", tookTime ); -#endif - } - -void CThumbnailServerSession::RequestSetThumbnailByBufferL( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBufferL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBUFFERL, "CThumbnailServerSession::RequestSetThumbnailByBufferL" ); - - if(aMessage.Int3() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBufferL() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBUFFERL, "CThumbnailServerSession::RequestSetThumbnailByBufferL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - - // 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 bufferSize = aMessage.Int2(); - HBufC8* buffer = HBufC8::NewMaxLC( bufferSize ); - TPtr8 ptr = buffer->Des(); - aMessage.ReadL( 1 /* buffer pointer */, ptr ); - - CreateGenerateTaskFromBufferL( buffer ); - CleanupStack::Pop( buffer ); - } - -void CThumbnailServerSession::RequestSetThumbnailByBitmapL( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "CThumbnailServerSession::RequestSetThumbnailByBitmapL" ); - - if(aMessage.Int2() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "CThumbnailServerSession::RequestSetThumbnailByBitmapL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - 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(); - - // 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( this, bitmap, reqId ); - - CleanupStack::Pop( bitmap ); - iBitmapHandle = bitmap->Handle(); - - RArray < TThumbnailPersistentSize >* missingSizes = NULL; - - // source type - TDataType mimeType; - TInt sourceType = 0; - TInt err = Server()->MimeTypeFromFileExt( params.iTargetUri, mimeType ); - - // get missing sizes - if ( err == KErrNone && ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) - { - sourceType = Server()->SourceTypeFromMimeType( mimeType ); - - missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; - CleanupClosePushL( *missingSizes ); - - Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse); - - if ( missingSizes->Count() == 0) - { - // all thumbs already exist - CleanupStack::PopAndDestroy( missingSizes ); - delete missingSizes; - missingSizes = NULL; - } - } - - // if missing sizes, create scale tasks - if ( missingSizes ) - { - const TInt count = missingSizes->Count(); - - TSize bitmapSize = bitmap->SizeInPixels(); - - // scale small thumbs first, because fullscreen encoding takes longer - for ( TInt i( count-1 ); i >= 0; i-- ) - { - if( bitmapSize.iWidth < bitmapSize.iHeight ) - { - TThumbnailSize size = (*missingSizes)[ i ].iType; - - if ( size == EFullScreenThumbnailSize || - size == EVideoFullScreenThumbnailSize || - size == EAudioFullScreenThumbnailSize || - size == EImageFullScreenThumbnailSize || - size == EContactFullScreenThumbnailSize ) - { - TInt height = (*missingSizes)[i].iSize.iHeight; - (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth; - (*missingSizes)[i].iSize.iWidth = height; - - TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - portrait"); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "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, params.iVirtualUri); - - 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 ) - { - // scaleTask is now responsible for completing the RMessage - scaleTask->SetMessageData( reqId, iMessage, iClientThread ); - iMessage = RMessage2(); - } - } - } - else - { - // complete message - aMessage.Complete( KErrNone ); - iMessage = RMessage2(); - } - - if ( missingSizes ) - { - CleanupStack::PopAndDestroy( missingSizes ); - delete missingSizes; - missingSizes = NULL; - } - - // Scale tasks now reference the bitmap in the pool - Server()->DeleteBitmapFromPool( iBitmapHandle ); - iBitmapHandle = 0; - bitmap = NULL; - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::CreateGenerateTaskL() -// Create a task to generate a new thumbnail -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile) - { - TThumbnailRequestParams& params = iRequestParams(); - - TN_DEBUG2( - "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", ¶ms.iFileName ); - OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMFILEHANDLEL, "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL -- create thumbnail generation task for;params.iFileName=%S", params.iFileName ); - - // 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 ); - } - - RArray < TThumbnailPersistentSize >* missingSizes = NULL; - - // get missing sizes - if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) - { - TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; - sourceType = Server()->SourceTypeFromMimeType( params.iMimeType ); - missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; - CleanupClosePushL( *missingSizes ); - - TBool gridSizeOnly(EFalse); - - if ( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview ) - { - gridSizeOnly = ETrue; - } - - // 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) - { - // all thumbs already exist - CleanupStack::PopAndDestroy( missingSizes ); - delete missingSizes; - missingSizes = NULL; - - if( aFile ) - { - aFile->Close(); - } - 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; - if ( priority > KMaxGeneratePriority ) - { - priority = KMaxGeneratePriority; - } - - // create new task - if( !aFile) - { - TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() - KErrArgument"); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMFILEHANDLEL, "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL - KErrArgument" ); - User::Leave( KErrArgument ); - } - CleanupClosePushL( *aFile ); - 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.iVirtualUri); - - // do not store bitmaps to server pool when generating only - if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) - { - task->ScaledBitmapToPool( EFalse ); - } - - CleanupStack::Pop( aFile ); - - CleanupStack::PushL( task ); - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - - if ( missingSizes ) - { - CleanupStack::Pop( missingSizes ); - } - - // Generate task is now responsible for completing the message - iMessage = RMessage2(); - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::CreateGenerateTaskL() -// Create a task to generate a new thumbnail -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::CreateGenerateTaskFromBufferL( TDesC8* aBuffer ) - { - const TThumbnailRequestParams& params = iRequestParams(); - - TN_DEBUG2( - "CThumbnailServerSession::CreateGenerateTaskFromBufferL() -- create thumbnail generation task for %S", ¶ms.iTargetUri ); - OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL - -- create thumbnail generation task for;params.iTargetUri=%S", params.iTargetUri ); - - // disk space check only for stored sizes - if ( params.iThumbnailSize != ECustomThumbnailSize && - Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() ) - { - User::Leave( KErrDiskFull ); - } - - if(aBuffer && params.iMimeType.Des().Match( KVideoMime ) == 0 ) - { - User::Leave( KErrNotSupported ); - } - - TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType; - - TDataType mimetype; - TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype ); - if(ret == KErrNotFound) - { - Server()->Fs().ShareProtected(); - RFile64 file; - CleanupClosePushL( file ); - - User::LeaveIfError( file.Open( Server()->Fs(), params.iTargetUri, EFileShareReadersOrWriters )); - TN_DEBUG2( "CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle opened for %S", ¶ms.iFileName ); - OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL;params.iFileName=%S", params.iFileName ); - - mimetype = Server()->ResolveMimeTypeL(file); - - file.Close(); - TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle closed"); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle closed" ); - - CleanupStack::Pop( &file ); - } - - sourceType = Server()->SourceTypeFromMimeType( mimetype ); - - RArray < TThumbnailPersistentSize >* missingSizes = NULL; - - // get missing sizes - if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 ) - { - missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >; - CleanupClosePushL( *missingSizes ); - - Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse ); - - if ( missingSizes->Count() == 0) - { - // all thumbs already exist - CleanupStack::PopAndDestroy( missingSizes ); - delete missingSizes; - missingSizes = NULL; - - if ( aBuffer) - { - delete aBuffer; - aBuffer = NULL; - } - return; - } - } - - // priority - TInt priority = params.iPriority; - if ( priority > KMaxGeneratePriority ) - { - priority = KMaxGeneratePriority; - } - - // create new task - if( !aBuffer) - { - TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - KErrArgument" ); - OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL - KErrArgument" ); - User::Leave( KErrArgument ); - } - - 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.iVirtualUri); - - // do not store bitmaps to server pool when generating only - if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) - { - task->ScaledBitmapToPool( EFalse ); - } - - CleanupStack::PushL( task ); - task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread ); - Server()->QueueTaskL( task ); - CleanupStack::Pop( task ); // owned by processor now - - if ( missingSizes ) - { - CleanupStack::Pop( missingSizes ); - } - - // Generate task is now responsible for completing the message - iMessage = RMessage2(); - } -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::FetchThumbnailL() -// Fetch thumbnail data from database -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::FetchThumbnailL() - { - TN_DEBUG1("CThumbnailServerSession::FetchThumbnailL()"); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_FETCHTHUMBNAILL, "CThumbnailServerSession::FetchThumbnailL" ); - __ASSERT_DEBUG( !iBitmap, ThumbnailPanic( EThumbnailBitmapNotReleased )); - __ASSERT_DEBUG( !iBuffer, ThumbnailPanic( EThumbnailBitmapNotReleased )); - - delete iBitmap; - iBitmap = NULL; - delete iBuffer; - iBuffer = NULL; - - TThumbnailRequestParams& params = iRequestParams(); - - if ( params.iThumbnailSize != EUnknownThumbnailSize && - params.iThumbnailSize != ECustomThumbnailSize ) - { - TThumbnailPersistentSize & persistentSize = Server()->PersistentSizeL( params.iThumbnailSize ); - params.iSize = persistentSize.iSize; - } - - if( params.iFileName != KNullDesC ) - { - TN_DEBUG3( "CThumbnailServerSession::FetchThumbnailL( ThumbnailSize=%d ( Path=%S ))", - params.iThumbnailSize, ¶ms.iFileName ); - OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_FETCHTHUMBNAILL, "CThumbnailServerSession::FetchThumbnailL;params.iFileName=%S", params.iFileName ); - Server()->FetchThumbnailL( params.iFileName, iBitmap, iBuffer, params.iThumbnailSize, iOriginalSize); - } - else - { - User::Leave( KErrNotSupported ); - } -#ifdef _DEBUG - if( iBitmap) - { - TN_DEBUG4( "CThumbnailServerSession::FetchThumbnailL() size %d x %d displaymode %d", iBitmap->SizeInPixels().iWidth, iBitmap->SizeInPixels().iHeight, iBitmap->DisplayMode()); - OstTraceExt3( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_FETCHTHUMBNAILL, "CThumbnailServerSession::FetchThumbnailL;iBitmap->SizeInPixels().iWidth=%d;iBitmap->SizeInPixels().iHeight=%d;iBitmap->DisplayMode()=%u", iBitmap->SizeInPixels().iWidth, iBitmap->SizeInPixels().iHeight, iBitmap->DisplayMode() ); - } -#endif - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::ProcessBitmapL() -// Process a fetched bitmap by creating scale tasks or by returning the -// bitmap as such. -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::ProcessBitmapL() - { - TThumbnailRequestParams& params = iRequestParams(); - - if ( ClientThreadAlive() ) - { - TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle()); - OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_PROCESSBITMAPL, "CThumbnailServerSession::ProcessBitmapL;iBitmap->Handle()=%o", iBitmap->Handle() ); - - params.iBitmapHandle = iBitmap->Handle(); - const TSize bitmapSize = iBitmap->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; - } - - iMessage.WriteL( 0, iRequestParams ); - - TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool"); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_PROCESSBITMAPL, "CThumbnailServerSession::ProcessBitmapL - bitmap to pool" ); - - Server()->AddBitmapToPoolL( this, iBitmap, TThumbnailServerRequestId( this, params.iRequestId ) ); - - iMessage.Complete( KErrNone ); - iMessage = RMessage2(); - - iBitmap = NULL; // owned by server now - } - else - { - delete iBitmap; - iBitmap = NULL; - } - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::ReleaseBitmap() -// Release bitmap from bitmap pool -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::ReleaseBitmap( const RMessage2& aMessage ) - { - TN_DEBUG2( "CThumbnailServerSession::ReleaseBitmap(%d)", aMessage.Int0()); - OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RELEASEBITMAP, "CThumbnailServerSession::ReleaseBitmap;aMessage.Int0()=%d", aMessage.Int0() ); - Server()->DeleteBitmapFromPool( aMessage.Int0()); - } - - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::CancelRequest() -// Cancel pending request. -// ----------------------------------------------------------------------------- -// -TInt CThumbnailServerSession::CancelRequest( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::CancelRequest()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest" ); - - const TThumbnailServerRequestId requestId( this, aMessage.Int0()); - const TInt err = Server()->DequeTask( requestId ); - TN_DEBUG4( - "CThumbnailServerSession::CancelRequest(0x%08x/%d) - returning %d", - requestId.iSession, requestId.iRequestId, err ); - OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest;requestId.iSession=%o", requestId.iSession ); - OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest;err=%d", err ); - - return err; - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::ChangePriority() -// Change priority of pending request. -// ----------------------------------------------------------------------------- -// -TInt CThumbnailServerSession::ChangePriority( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::ChangePriority()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority" ); - - const TThumbnailServerRequestId requestId( this, aMessage.Int0()); - const TInt newPriority = aMessage.Int1(); - - const TInt err = Server()->ChangeTaskPriority( requestId, newPriority ); - TN_DEBUG5( - "CThumbnailServerSession::ChangePriority(0x%08x/%d, %d) - returning %d", - requestId.iSession, requestId.iRequestId, newPriority, err ); - OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority;requestId.iSession=%o", requestId.iSession ); - OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority;requestId.iRequestId=%u;err=%d", requestId.iRequestId, err ); - - return err; - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::DeleteThumbnailsL() -// Delete thumbnails for given object file -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::DeleteThumbnailsL( const RMessage2& aMessage ) - { - if(aMessage.Int2() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::DeleteThumbnailsL() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_DELETETHUMBNAILSL, "CThumbnailServerSession::DeleteThumbnailsL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - HBufC* fileName = HBufC::NewLC( KMaxFileName ); - TPtr ptr = fileName->Des(); - aMessage.ReadL( 1, ptr ); - Server()->DeleteThumbnailsL( ptr ); - CleanupStack::PopAndDestroy( fileName ); - - aMessage.Complete( KErrNone ); - iMessage = RMessage2(); - } - -// ----------------------------------------------------------------------------- -// CThumbnailServerSession::DeleteThumbnailsByIdL() -// Delete thumbnails by TThumbnailId. -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::DeleteThumbnailsByIdL( const RMessage2& aMessage ) - { - if(aMessage.Int2() != KCheckValue) - { - TN_DEBUG1( "CThumbnailServerSession::DeleteThumbnailsByIdL() - error in aMessage - leaving" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_DELETETHUMBNAILSBYIDL, "CThumbnailServerSession::DeleteThumbnailsByIdL - error in aMessage - leaving" ); - User::Leave(KErrArgument); - } - - // read message params - aMessage.ReadL( 0, iRequestParams ); - const TThumbnailRequestParams& params = iRequestParams(); - -#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); - 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(); - } - -// ----------------------------------------------------------------------------- -// Get the required size (in characters) for a buffer that contains the -// list of supported MIME types -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage ) - { - TPckgBuf < TInt > buf; - buf() = Server()->GetMimeTypeBufferSize(); - aMessage.WriteL( 0, buf ); - } - -// ----------------------------------------------------------------------------- -// Get the list of supported MIME types and store them in the buffer -// allocated by the client. -// ----------------------------------------------------------------------------- -// -void CThumbnailServerSession::GetMimeTypeListL( const RMessage2& aMessage ) - { - TN_DEBUG1( "CThumbnailServerSession::GetMimeTypeListL()" ); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_GETMIMETYPELISTL, "CThumbnailServerSession::GetMimeTypeListL" ); - - TInt len = aMessage.GetDesMaxLengthL( 0 ); - HBufC* buf = HBufC::NewLC( len ); - TPtr ptr = buf->Des(); - Server()->GetMimeTypeList( ptr ); - aMessage.WriteL( 0, * buf ); - CleanupStack::PopAndDestroy( buf ); - } - -// --------------------------------------------------------------------------- -// CThumbnailServerSession::ModifyThumbnailSize -// --------------------------------------------------------------------------- -// -void CThumbnailServerSession::ModifyThumbnailSize( TInt aSourceType ) - { - TThumbnailRequestParams& params = iRequestParams(); - if(aSourceType == TThumbnailPersistentSize::EImage) - { - if(params.iThumbnailSize == EFullScreenThumbnailSize) - { - params.iThumbnailSize = EImageFullScreenThumbnailSize; - } - else if(params.iThumbnailSize == EGridThumbnailSize) - { - params.iThumbnailSize = EImageGridThumbnailSize; - } - else if(params.iThumbnailSize == EListThumbnailSize) - { - params.iThumbnailSize = EImageListThumbnailSize; - } - } - else if(aSourceType == TThumbnailPersistentSize::EVideo) - { - if(params.iThumbnailSize == EFullScreenThumbnailSize) - { - params.iThumbnailSize = EVideoFullScreenThumbnailSize; - } - else if(params.iThumbnailSize == EGridThumbnailSize) - { - params.iThumbnailSize = EVideoGridThumbnailSize; - } - else if(params.iThumbnailSize == EListThumbnailSize) - { - params.iThumbnailSize = EVideoListThumbnailSize; - } - } - else if(aSourceType == TThumbnailPersistentSize::EAudio) - { - if(params.iThumbnailSize == EFullScreenThumbnailSize) - { - params.iThumbnailSize = EAudioFullScreenThumbnailSize; - } - else if(params.iThumbnailSize == EGridThumbnailSize) - { - params.iThumbnailSize = EAudioGridThumbnailSize; - } - else if(params.iThumbnailSize == EListThumbnailSize) - { - 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; - } - } - } - -//------------------------------------------------------------------------ -// CThumbnailServerSession::ModifyThumbnailSize -// --------------------------------------------------------------------------- -// -void CThumbnailServerSession::ResolveMimeTypeL( RFile64* aFile ) - { - TThumbnailRequestParams& params = iRequestParams(); - TInt res = 0; - - // mime type - if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) ) - { - // 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 ); - OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RESOLVEMIMETYPEL, "CThumbnailServerSession::ResolveMimeTypeL - file handle opened;params.iFileName=%S", params.iFileName ); - - params.iMimeType = Server()->ResolveMimeTypeL(file); - - file.Close(); - TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed"); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_RESOLVEMIMETYPEL, "CThumbnailServerSession::ResolveMimeTypeL - file handle closed" ); - - CleanupStack::Pop( &file ); - } - } - } - } - - -// --------------------------------------------------------------------------- -// RThumbnailMessage::FilterSqlErr -// --------------------------------------------------------------------------- -// -TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason ) - { - TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason); - OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CONVERTSQLERRTOE32ERR, "CThumbnailServerSession::ConvertSqlErrToE32Err;aReason=%d", aReason ); - TInt e32Err(aReason); - - if ( aReason >= - 144 ) - // magic: [-1..-144] is E32 error range - { - // E32 error value or non-negative value - switch ( aReason ) - { - case KErrServerTerminated: - e32Err = KErrCorrupt; - break; - default: - e32Err = aReason; - } - } - else - { - switch ( aReason ) - { - case KSqlErrGeneral: - e32Err = KErrGeneral; - break; - case KSqlErrInternal: - e32Err = KErrGeneral; - break; - case KSqlErrPermission: - e32Err = KErrPermissionDenied; - break; - case KSqlErrAbort: - e32Err = KErrAbort; - break; - case KSqlErrBusy: - e32Err = KErrServerBusy; - break; - case KSqlErrLocked: - e32Err = KErrLocked; - break; - case KSqlErrReadOnly: - e32Err = KErrAccessDenied; - break; - case KSqlErrInterrupt: - e32Err = KErrAbort; - break; - case KSqlErrIO: - e32Err = KErrGeneral; - break; - case KSqlErrCorrupt: - e32Err = KErrCorrupt; - break; - case KSqlErrNotFound: - e32Err = KErrNotFound; - break; - case KSqlErrFull: - e32Err = KErrOverflow; - break; - case KSqlErrCantOpen: - e32Err = KErrCouldNotConnect; - break; - case KSqlErrProtocol: - e32Err = KErrLocked; - break; - case KSqlErrEmpty: - e32Err = KErrNotFound; - break; - case KSqlErrSchema: - e32Err = KErrAbort; - break; - case KSqlErrTooBig: - e32Err = KErrTooBig; - break; - case KSqlErrConstraint: - e32Err = KErrGeneral; - break; - case KSqlErrMismatch: - e32Err = KErrGeneral; - break; - case KSqlErrMisuse: - e32Err = KErrGeneral; - break; - case KSqlErrRange: - e32Err = KErrOverflow; - break; - case KSqlErrNotDb: - e32Err = KErrCorrupt; - break; - case KSqlErrStmtExpired: - e32Err = KErrAbort; - break; - default: - e32Err = aReason; - } - } - return e32Err; - } - -// --------------------------------------------------------------------------- -// CThumbnailServerSession::ClientThreadAlive() -// Checks if client thread is still alive and RMessage2 handle valid. -// --------------------------------------------------------------------------- -// -TBool CThumbnailServerSession::ClientThreadAlive() - { - TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive()"); - OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive" ); - - if ( iMessage.Handle()) - { - // check if client thread alive - TExitType exitType = iClientThread.ExitType(); - - if( exitType != EExitPending ) - { - TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread died"); - OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive - client thread died" ); - - iMessage = RMessage2(); - - return EFalse; - } - else - { - // all OK - return ETrue; - } - } - else - { - TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null"); - OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive - message null" ); - return EFalse; - } - } - - -// End of file