imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
equal deleted inserted replaced
42:2e2a89493e2b 54:48dd0f169f0d
     1 /*
       
     2 * Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Server side session for Thumbnail Manager Server
       
    15  *
       
    16 */
       
    17 
       
    18 #include <imageconversion.h> 
       
    19 
       
    20 #include "thumbnailserversession.h"
       
    21 #include "thumbnailserver.h"
       
    22 #include "thumbnailtaskprocessor.h"
       
    23 #include "thumbnailmanagerconstants.h"
       
    24 #include "thumbnailgeneratetask.h"
       
    25 #include "thumbnailscaletask.h"
       
    26 #include "thumbnaildecodetask.h"
       
    27 #ifdef RD_MDS_2_5
       
    28 #include "thumbnailmdsquerytask.h"
       
    29 #endif // RD_MDS_2_5
       
    30 #include "thumbnaillog.h"
       
    31 #include "thumbnailpanic.h"
       
    32 
       
    33 #include "thumbnailcenrep.h"
       
    34 #include "OstTraceDefinitions.h"
       
    35 #ifdef OST_TRACE_COMPILER_IN_USE
       
    36 #include "thumbnailserversessionTraces.h"
       
    37 #endif
       
    38 
       
    39 
       
    40 // ======== MEMBER FUNCTIONS ========
       
    41 
       
    42 // ---------------------------------------------------------------------------
       
    43 // CThumbnailServerSession::CThumbnailServerSession()
       
    44 // C++ default constructor can NOT contain any code, that might leave.
       
    45 // ---------------------------------------------------------------------------
       
    46 //
       
    47 CThumbnailServerSession::CThumbnailServerSession(): CSession2()
       
    48     {
       
    49     iBitmapHandle = 0;
       
    50     iBitmap = NULL;
       
    51     iBuffer = NULL;
       
    52     }
       
    53 
       
    54 
       
    55 // ---------------------------------------------------------------------------
       
    56 // CThumbnailServerSession::~CThumbnailServerSession()
       
    57 // Destructor.
       
    58 // ---------------------------------------------------------------------------
       
    59 //
       
    60 CThumbnailServerSession::~CThumbnailServerSession()
       
    61     {
       
    62     Server()->DropSession(this);
       
    63     delete iBitmap;
       
    64     iBitmap = NULL;
       
    65     delete iBuffer;
       
    66     iBuffer = NULL;
       
    67     }
       
    68 
       
    69 
       
    70 // -----------------------------------------------------------------------------
       
    71 // CThumbnailServerSession::DispatchMessageL()
       
    72 // Message dispatcher.
       
    73 // -----------------------------------------------------------------------------
       
    74 //
       
    75 TInt CThumbnailServerSession::DispatchMessageL( const RMessage2& aMessage )
       
    76     {
       
    77     TInt err( KErrNone );
       
    78 
       
    79     switch ( aMessage.Function())
       
    80         {
       
    81         case ERequestThumbByFileHandleAsync:
       
    82                 {
       
    83                 RequestThumbByFileHandleAsyncL( aMessage );
       
    84                 break;
       
    85                 }
       
    86         case ERequestThumbByPathAsync:
       
    87                 {
       
    88                 RequestThumbByPathAsyncL( aMessage );
       
    89                 break;
       
    90                 }
       
    91         case ERequestSetThumbnailByBuffer:
       
    92                 {
       
    93                 RequestSetThumbnailByBufferL( aMessage );
       
    94                 break;
       
    95                 }
       
    96         case ERequestSetThumbnailByBitmap:
       
    97                 {
       
    98                 RequestSetThumbnailByBitmapL( aMessage );
       
    99                 break;
       
   100                 }                
       
   101         case EReleaseBitmap:
       
   102                 {
       
   103                 ReleaseBitmap( aMessage );
       
   104                 break;
       
   105                 }
       
   106         case ECancelRequest:
       
   107                 {
       
   108                 err = CancelRequest( aMessage );
       
   109                 break;
       
   110                 }
       
   111         case EChangePriority:
       
   112                 {
       
   113                 err = ChangePriority( aMessage );
       
   114                 break;
       
   115                 }
       
   116         case EDeleteThumbnails:
       
   117                 {
       
   118                 DeleteThumbnailsL( aMessage );
       
   119                 break;
       
   120                 }
       
   121         case EDeleteThumbnailsById:
       
   122                 {
       
   123                 DeleteThumbnailsByIdL( aMessage );
       
   124                 break;
       
   125                 }                
       
   126         case EGetMimeTypeBufferSize:
       
   127                 {
       
   128                 GetMimeTypeBufferSizeL( aMessage );
       
   129                 break;
       
   130                 }
       
   131         case EGetMimeTypeList:
       
   132                 {
       
   133                 GetMimeTypeListL( aMessage );
       
   134                 break;
       
   135                 }
       
   136         case ERequestThumbByIdAsync:
       
   137                 {
       
   138                 RequestThumbByIdAsyncL( aMessage );
       
   139                 break;
       
   140                 }
       
   141         case EUpdateThumbnails:
       
   142                 {
       
   143                 UpdateThumbnailsL( aMessage );
       
   144                 break;
       
   145                 }       
       
   146         case ERenameThumbnails:
       
   147                 {
       
   148                 RenameThumbnailsL( aMessage );
       
   149                 break;
       
   150                 } 
       
   151         default:
       
   152                 {
       
   153                 err = KErrUnknown;
       
   154                 break;
       
   155                 }
       
   156         }
       
   157 
       
   158     return err;
       
   159     }
       
   160 
       
   161 
       
   162 // ---------------------------------------------------------------------------
       
   163 // CThumbnailServerSession::CreateL()
       
   164 // ---------------------------------------------------------------------------
       
   165 //
       
   166 void CThumbnailServerSession::CreateL()
       
   167     {
       
   168     TN_DEBUG2( "CThumbnailServerSession::AddSession() = 0x%08x", this );
       
   169     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEL, "CThumbnailServerSession::CreateL;this=%o", this );
       
   170     
       
   171     Server()->AddSession();
       
   172     }
       
   173 
       
   174 
       
   175 // -----------------------------------------------------------------------------
       
   176 // CThumbnailServerSession::ServiceL()
       
   177 // Handles service request messages from clients.
       
   178 // -----------------------------------------------------------------------------
       
   179 //
       
   180 void CThumbnailServerSession::ServiceL( const RMessage2& aMessage )
       
   181     {
       
   182     TN_DEBUG1( "CThumbnailServerSession::ServiceL() - begin" );
       
   183     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - begin" );
       
   184     
       
   185     __ASSERT_DEBUG( !iMessage.Handle(), ThumbnailPanic(EThumbnailMessageNotCompleted));
       
   186     if ( iMessage.Handle())
       
   187         {
       
   188         iMessage.Complete( KErrUnknown );
       
   189         iMessage = RMessage2();
       
   190         }
       
   191     
       
   192     iMessage = aMessage;
       
   193 
       
   194     if ( iMessage.Handle())
       
   195         {
       
   196         // get client thread
       
   197         TInt err = iMessage.Client( iClientThread );
       
   198         if (err != KErrNone)
       
   199             {
       
   200             TN_DEBUG1( "CThumbnailServerSession::ServiceL() - client thread not found");
       
   201             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - client thread not found" );
       
   202     
       
   203             iMessage = RMessage2();
       
   204             }       
       
   205         }
       
   206     else
       
   207         {
       
   208         TN_DEBUG1( "CThumbnailServerSession::ServiceL() - message null");
       
   209         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - message null" );
       
   210         }
       
   211     
       
   212     // clean up possible trash
       
   213     if (iBitmapHandle)
       
   214         {
       
   215         Server()->DeleteBitmapFromPool( iBitmapHandle );
       
   216         iBitmapHandle = 0;
       
   217         }
       
   218     delete iBitmap;
       
   219     iBitmap = NULL;
       
   220     delete iBuffer;
       
   221     iBuffer = NULL;
       
   222     iOriginalSize = TSize();
       
   223     
       
   224     TInt ret = KErrNone;
       
   225 
       
   226     TRAPD( err, ret = DispatchMessageL( aMessage ) );
       
   227     
       
   228     // if message was not completed, or Leave occurred
       
   229     if ( iMessage.Handle())
       
   230         {
       
   231         if ( ClientThreadAlive() )
       
   232             {
       
   233             iMessage.Complete( ConvertSqlErrToE32Err( err != KErrNone ? err : ret ));        
       
   234             }
       
   235         
       
   236         iMessage = RMessage2();
       
   237         }
       
   238     
       
   239     // close thread handle
       
   240     iClientThread.Close();
       
   241     
       
   242     TN_DEBUG1( "CThumbnailServerSession::ServiceL() - end" );
       
   243     OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_SERVICEL, "CThumbnailServerSession::ServiceL - end" );
       
   244     }
       
   245 
       
   246 
       
   247 // -----------------------------------------------------------------------------
       
   248 // CThumbnailServerSession::Server()
       
   249 // Returns the server pointer.
       
   250 // -----------------------------------------------------------------------------
       
   251 //
       
   252 CThumbnailServer* CThumbnailServerSession::Server()
       
   253     {
       
   254     return ( CThumbnailServer* )( CSession2::Server());
       
   255     }
       
   256 
       
   257 
       
   258 // -----------------------------------------------------------------------------
       
   259 // CThumbnailServerSession::Cancel()
       
   260 // -----------------------------------------------------------------------------
       
   261 //
       
   262 void CThumbnailServerSession::Cancel()
       
   263     {
       
   264     }
       
   265 
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // CThumbnailServerSession::UpdateThumbnailsL()
       
   269 // -----------------------------------------------------------------------------
       
   270 //
       
   271 void CThumbnailServerSession::UpdateThumbnailsL( const RMessage2& aMessage )
       
   272     {
       
   273     TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL()" );
       
   274     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL" );
       
   275     
       
   276     if(aMessage.Int1() != KCheckValue)
       
   277        {
       
   278        TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - error in aMessage - leaving" );
       
   279        User::Leave(KErrArgument);
       
   280        }
       
   281     
       
   282     // read message params
       
   283     aMessage.ReadL( 0, iRequestParams );
       
   284     const TThumbnailRequestParams& params = iRequestParams();
       
   285     
       
   286     TBool finished = Server()->UpdateThumbnailsL( params.iFileName, params.iOrientation, params.iModified );
       
   287     
       
   288     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
       
   289     
       
   290     TBool gridSizeOnly(EFalse);
       
   291             
       
   292     if ( params.iQualityPreference == CThumbnailManager
       
   293                     ::EOptimizeForQualityWithPreview )
       
   294         {
       
   295         gridSizeOnly = ETrue;
       
   296         }
       
   297     
       
   298     if (finished)
       
   299         {
       
   300         // source type
       
   301         TDataType mimeType;
       
   302         TInt sourceType = 0;
       
   303         TInt err = Server()->MimeTypeFromFileExt( params.iFileName, mimeType );
       
   304         
       
   305         // need to use recognizer
       
   306         if (err == KErrNotFound)
       
   307             {
       
   308             Server()->Fs().ShareProtected();
       
   309             RFile64 file;
       
   310             CleanupClosePushL( file );
       
   311           
       
   312             User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); 
       
   313             TN_DEBUG2( "CThumbnailServerSession::UpdateThumbnailsL - file handle opened for %S", &params.iFileName );
       
   314           
       
   315             mimeType = Server()->ResolveMimeTypeL(file);
       
   316           
       
   317             file.Close();
       
   318             TN_DEBUG1("CThumbnailServerSession::UpdateThumbnailsL - file handle closed");
       
   319           
       
   320             CleanupStack::Pop( &file );    
       
   321             }
       
   322         
       
   323         // get missing sizes
       
   324         if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 )
       
   325             {
       
   326             sourceType = Server()->SourceTypeFromMimeType( mimeType );
       
   327             
       
   328             missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
       
   329             CleanupClosePushL( *missingSizes );
       
   330         
       
   331             Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly );
       
   332                 
       
   333             if ( missingSizes->Count() == 0)
       
   334                 {
       
   335                 // all thumbs already exist
       
   336                 CleanupStack::PopAndDestroy( missingSizes );
       
   337                 delete missingSizes;
       
   338                 missingSizes = NULL;
       
   339                 }            
       
   340             }
       
   341         
       
   342         if(!missingSizes)
       
   343             {
       
   344             TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished part 1" );
       
   345             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - finished part 1" );
       
   346             aMessage.Complete( KErrNone );
       
   347             }
       
   348         else
       
   349             {
       
   350             OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL  - some sizes missing..." );
       
   351             TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - some sizes missing..." ); 
       
   352             }
       
   353         }
       
   354 
       
   355     if (missingSizes || !finished)
       
   356         {
       
   357         TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - need to create (some) thumbs" );
       
   358         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - need to create (some) thumbs" );
       
   359         
       
   360         if(missingSizes)
       
   361             {
       
   362             CleanupStack::PopAndDestroy( missingSizes );
       
   363             delete missingSizes;
       
   364             missingSizes = NULL;
       
   365             }
       
   366         
       
   367         if(Server()->StoreForPathL(params.iFileName)->IsDiskFull())
       
   368             {
       
   369             User::Leave( KErrDiskFull );
       
   370             }
       
   371         
       
   372         // need to create new thumbs
       
   373         aMessage.Complete( KThumbnailErrThumbnailNotFound );
       
   374         }
       
   375     else
       
   376         {
       
   377         TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - finished part 2" );
       
   378         OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_UPDATETHUMBNAILSL, "CThumbnailServerSession::UpdateThumbnailsL - finished part 2" );
       
   379         }
       
   380     
       
   381     iMessage = RMessage2();
       
   382     }
       
   383 
       
   384 // -----------------------------------------------------------------------------
       
   385 // CThumbnailServerSession::RenameThumbnailsL()
       
   386 // Rename thumbnails.
       
   387 // -----------------------------------------------------------------------------
       
   388 //
       
   389 void CThumbnailServerSession::RenameThumbnailsL( const RMessage2& aMessage )
       
   390     {
       
   391     if(aMessage.Int1() != KCheckValue)
       
   392        {
       
   393        TN_DEBUG1( "CThumbnailServerSession::RenameThumbnailsL() - error in aMessage - leaving" );
       
   394        OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RENAMETHUMBNAILSL, "CThumbnailServerSession::RenameThumbnailsL - error in aMessage - leaving" );
       
   395        User::Leave(KErrArgument);
       
   396        }
       
   397     
       
   398     // read message params
       
   399     aMessage.ReadL( 0, iRequestParams );
       
   400     const TThumbnailRequestParams& params = iRequestParams();
       
   401     
       
   402     // renaming only inside one store
       
   403     if (params.iFileName.Left(1).CompareF( params.iTargetUri.Left(1) ) == 0)
       
   404         {
       
   405         Server()->RenameThumbnailsL( params.iFileName, params.iTargetUri );
       
   406         
       
   407         aMessage.Complete( KErrNone );
       
   408         }
       
   409     else
       
   410         {
       
   411         aMessage.Complete( KErrNotSupported );
       
   412         }
       
   413     
       
   414     iMessage = RMessage2();
       
   415     }
       
   416 
       
   417 // -----------------------------------------------------------------------------
       
   418 // CThumbnailServerSession::RequestThumbByIdAsyncL()
       
   419 // -----------------------------------------------------------------------------
       
   420 //
       
   421 void CThumbnailServerSession::RequestThumbByIdAsyncL( const RMessage2&
       
   422     aMessage )
       
   423     {
       
   424 #ifdef _DEBUG
       
   425     TTime aStart, aStop;
       
   426     aStart.UniversalTime();
       
   427 #endif
       
   428     
       
   429     TN_DEBUG1( "CThumbnailServerSession::RequestThumbByIdAsyncL() - begin" );
       
   430     
       
   431     if(aMessage.Int1() != KCheckValue)
       
   432        {
       
   433        TN_DEBUG1( "CThumbnailServerSession::RequestThumbByIdAsync() - error in aMessage - leaving" );
       
   434        OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL - leaving" );
       
   435        User::Leave(KErrArgument);
       
   436        }
       
   437 
       
   438     aMessage.ReadL( 0, iRequestParams );
       
   439     const TThumbnailRequestParams& params = iRequestParams();
       
   440     
       
   441 #ifdef RD_MDS_2_5        
       
   442         // try to query path from MDS
       
   443         CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask(
       
   444                 Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server());
       
   445         
       
   446         CleanupStack::PushL( task );
       
   447         task->QueryPathByIdL(params.iThumbnailId, EFalse);
       
   448         task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread );
       
   449         Server()->QueueTaskL( task );
       
   450         CleanupStack::Pop( task ); // owned by processor now
       
   451         
       
   452         // query task is now responsible for completing the message
       
   453         iMessage = RMessage2();
       
   454 #else
       
   455         User::Leave(KErrNotSupported);
       
   456 #endif // RD_MDS_2_5
       
   457         
       
   458     
       
   459 #ifdef _DEBUG
       
   460     aStop.UniversalTime();
       
   461     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
   462     TN_DEBUG2( "CThumbnailServerSession::RequestThumbByIdAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 );
       
   463     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL;tookTime=%d", tookTime );
       
   464 #endif 
       
   465     
       
   466     TN_DEBUG1("CThumbnailServerSession::RequestThumbByIdAsyncL() - end" );
       
   467     OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYIDASYNCL, "CThumbnailServerSession::RequestThumbByIdAsyncL - end" );
       
   468     }
       
   469 
       
   470 // -----------------------------------------------------------------------------
       
   471 // CThumbnailServerSession::RequestThumbByFileHandleAsync()
       
   472 // -----------------------------------------------------------------------------
       
   473 //
       
   474 void CThumbnailServerSession::RequestThumbByFileHandleAsyncL( const RMessage2&
       
   475     aMessage )
       
   476     {
       
   477     TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL()" );
       
   478     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL" );
       
   479     
       
   480     if(aMessage.Int1() != KCheckValue)
       
   481        {
       
   482        TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsync() - error in aMessage - leaving" );
       
   483        OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - error in aMessage - leaving" );
       
   484        User::Leave(KErrArgument);
       
   485        }
       
   486     
       
   487     aMessage.ReadL( 0, iRequestParams );
       
   488     const TThumbnailRequestParams& params = iRequestParams();
       
   489 
       
   490     RFile64 file;
       
   491     CleanupClosePushL(file);
       
   492     User::LeaveIfError( file.AdoptFromClient( aMessage, 2, 3 ));
       
   493     
       
   494     ResolveMimeTypeL(&file);
       
   495     
       
   496     if(params.iThumbnailSize == EFullScreenThumbnailSize ||
       
   497        params.iThumbnailSize == EGridThumbnailSize ||
       
   498        params.iThumbnailSize == EListThumbnailSize )
       
   499         {
       
   500         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   501         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
       
   502         ModifyThumbnailSize(sourceType);
       
   503         }
       
   504     
       
   505     // delete existing
       
   506     if(params.iImport && params.iOverwrite)
       
   507         {
       
   508         Server()->DeleteThumbnailsL( params.iTargetUri);
       
   509         }
       
   510     
       
   511     // CreateThumbnails
       
   512     if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly)
       
   513         {
       
   514         TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" );
       
   515         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - EThumbnailGeneratePersistentSizesOnly" );
       
   516         CreateGenerateTaskFromFileHandleL( &file );
       
   517         
       
   518         // ownership of the file transferred
       
   519         CleanupStack::Pop(&file);
       
   520         }
       
   521     // single thumbnail request
       
   522     else
       
   523         {
       
   524         TRAPD( err, FetchThumbnailL());
       
   525         
       
   526         if( err == KErrCompletion )
       
   527             {
       
   528             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
       
   529             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" );
       
   530             OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - thumbnail blacklisted" );
       
   531             
       
   532             aMessage.Complete( err );
       
   533             iMessage = RMessage2();
       
   534             
       
   535             // close file
       
   536             CleanupStack::PopAndDestroy(&file);
       
   537             }
       
   538         else if ( !err && iBitmap )
       
   539             {
       
   540             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - bitmap " );
       
   541             OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - found existing thumbnail - bitmap " );
       
   542 
       
   543             // Thumbnail already stored
       
   544             CleanupStack::PopAndDestroy(&file);
       
   545             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
       
   546             OstTrace0( TRACE_NORMAL, DUP5_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed" );
       
   547 
       
   548             ProcessBitmapL();
       
   549             }
       
   550         else if ( (err == KErrNotFound || err == KErrAccessDenied) && 
       
   551                  !(params.iFlags& CThumbnailManager::EDoNotCreate) )
       
   552             {
       
   553             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" );
       
   554             OstTrace0( TRACE_NORMAL, DUP6_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - KErrNotFound & !EDoNotCreate" );
       
   555             CreateGenerateTaskFromFileHandleL( &file);
       
   556             
       
   557             // ownership of the file transferred
       
   558         	CleanupStack::Pop(&file);
       
   559             }
       
   560         else if (!err && iBuffer)
       
   561             {
       
   562             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - jpeg " );
       
   563             OstTrace0( TRACE_NORMAL, DUP7_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - found existing thumbnail - jpeg" );
       
   564             
       
   565             CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server()
       
   566                         ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode );
       
   567             
       
   568             CleanupStack::PushL( task );
       
   569             task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread );
       
   570             Server()->QueueTaskL( task );
       
   571             CleanupStack::Pop( task ); // owned by processor now
       
   572             
       
   573             // Decode task is now responsible for completing the message
       
   574             iMessage = RMessage2();
       
   575             
       
   576             //CThumbnailDecodeTask is responsible freeing
       
   577             iBuffer = NULL;
       
   578             
       
   579             // close file
       
   580             CleanupStack::PopAndDestroy(&file);
       
   581             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
       
   582             OstTrace0( TRACE_NORMAL, DUP8_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed" );
       
   583             }
       
   584         else
       
   585             {
       
   586             TN_DEBUG2( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err );
       
   587             OstTrace1( TRACE_NORMAL, DUP9_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYFILEHANDLEASYNCL, "CThumbnailServerSession::RequestThumbByFileHandleAsyncL - thumbnail not found;err=%d", err );
       
   588             
       
   589             aMessage.Complete( ConvertSqlErrToE32Err( err ));
       
   590             iMessage = RMessage2();
       
   591             
       
   592             // close file
       
   593             CleanupStack::PopAndDestroy(&file);
       
   594             }     
       
   595         }
       
   596     }
       
   597 
       
   598 // -----------------------------------------------------------------------------
       
   599 // CThumbnailServerSession::RequestThumbByPathAsync()
       
   600 // -----------------------------------------------------------------------------
       
   601 //
       
   602 void CThumbnailServerSession::RequestThumbByPathAsyncL( const RMessage2&
       
   603     aMessage )
       
   604     {
       
   605     TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsyncL()" );
       
   606     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL" );
       
   607     
       
   608 #ifdef _DEBUG
       
   609     TTime aStart, aStop;
       
   610     aStart.UniversalTime();
       
   611 #endif
       
   612     
       
   613     if(aMessage.Int1() != KCheckValue)
       
   614        {
       
   615        TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsync() - error in aMessage - leaving" );
       
   616        OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - error in aMessage - leaving" );
       
   617        User::Leave(KErrArgument);
       
   618        }
       
   619 
       
   620     aMessage.ReadL( 0, iRequestParams );
       
   621     const TThumbnailRequestParams& params = iRequestParams();
       
   622     
       
   623     ResolveMimeTypeL(NULL);
       
   624     
       
   625     if(params.iThumbnailSize == EFullScreenThumbnailSize ||
       
   626        params.iThumbnailSize == EGridThumbnailSize ||
       
   627        params.iThumbnailSize == EListThumbnailSize )
       
   628         {
       
   629         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   630         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
       
   631         ModifyThumbnailSize(sourceType);
       
   632         }
       
   633     
       
   634     // should always be true
       
   635     if (params.iControlFlags != EThumbnailGeneratePersistentSizesOnly)
       
   636 		{
       
   637 	    TRAPD( err, FetchThumbnailL());
       
   638 	    
       
   639 	    if ( !err && iBitmap )
       
   640 	        {
       
   641 	        TN_DEBUG1( 
       
   642 	            "CThumbnailServerSession::RequestThumbByPathAsyncL() - found existing thumbnail- bitmap" );
       
   643 	        OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - found existing thumbnail- bitmap" );
       
   644 
       
   645 	        ProcessBitmapL();
       
   646 	        }
       
   647 	    else if ( !err && iBuffer)
       
   648 	        {
       
   649 	        TN_DEBUG1( 
       
   650 	            "CThumbnailServerSession::RequestThumbByPathAsyncL() - found existing thumbnail- jpeg" );
       
   651 	        OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - found existing thumbnail- jpeg" );
       
   652 	        
       
   653 	        CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server()
       
   654 	               ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode );
       
   655 	        
       
   656 	        CleanupStack::PushL( task );
       
   657 	        task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ), iMessage, iClientThread );
       
   658 	        Server()->QueueTaskL( task );
       
   659 	        CleanupStack::Pop( task ); // owned by processor now
       
   660 	        
       
   661 	        // Decode task is now responsible for completing the message
       
   662 	        iMessage = RMessage2();
       
   663 	        
       
   664 	        //CThumbnailDecodeTask is responsible freeing
       
   665 	        iBuffer = NULL;
       
   666 	        }
       
   667 	    else if( err == KErrCompletion )
       
   668 	        {
       
   669             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
       
   670             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" );
       
   671             OstTrace0( TRACE_NORMAL, DUP4_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL - thumbnail blacklisted" );
       
   672             
       
   673             aMessage.Complete( err );
       
   674             iMessage = RMessage2();
       
   675 	        }
       
   676 	    else 
       
   677 	        {
       
   678 	        TN_DEBUG2( 
       
   679 	            "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err );
       
   680 	        OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL  - thumbnail not found;err=%d", err );
       
   681 	        
       
   682 	        // don't try to create from virtual URI
       
   683 	        if ( params.iVirtualUri )
       
   684 	            {
       
   685                 User::Leave(err);
       
   686 	            }
       
   687 	        
       
   688             // disk space check only for stored sizes
       
   689             if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
   690                  Server()->StoreForPathL(params.iFileName)->IsDiskFull() )
       
   691                 {
       
   692                 User::Leave( KErrDiskFull );
       
   693                 }
       
   694 	        
       
   695 	        if ( (err == KErrNotFound || err == KErrAccessDenied) && 
       
   696 	            !(params.iFlags& CThumbnailManager::EDoNotCreate) )
       
   697 	            {
       
   698 	            // Special error code so that the client side can open the file
       
   699 	            // and retry the request using file handle
       
   700 	            err = KThumbnailErrThumbnailNotFound;
       
   701 	            }
       
   702 
       
   703             User::Leave(err);
       
   704 	        }   
       
   705 	   }
       
   706     
       
   707 #ifdef _DEBUG
       
   708     aStop.UniversalTime();
       
   709     TInt tookTime = (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000;
       
   710     TN_DEBUG2( "CThumbnailStore::RequestThumbByPathAsyncL() request took %d ms", (TInt)aStop.MicroSecondsFrom(aStart).Int64()/1000 );
       
   711     OstTrace1( TRACE_NORMAL, DUP6_CTHUMBNAILSERVERSESSION_REQUESTTHUMBBYPATHASYNCL, "CThumbnailServerSession::RequestThumbByPathAsyncL;tookTime=%d", tookTime );
       
   712 #endif
       
   713     }   
       
   714     
       
   715 void CThumbnailServerSession::RequestSetThumbnailByBufferL( const RMessage2& aMessage )
       
   716     {
       
   717     TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBufferL()" );
       
   718     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBUFFERL, "CThumbnailServerSession::RequestSetThumbnailByBufferL" );
       
   719     
       
   720     if(aMessage.Int3() != KCheckValue)
       
   721         {
       
   722         TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBufferL() - error in aMessage - leaving" );
       
   723         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBUFFERL, "CThumbnailServerSession::RequestSetThumbnailByBufferL - error in aMessage - leaving" );
       
   724         User::Leave(KErrArgument);
       
   725         }
       
   726       
       
   727     aMessage.ReadL( 0, iRequestParams );
       
   728     const TThumbnailRequestParams& params = iRequestParams();
       
   729     
       
   730     // delete existing
       
   731     if(params.iOverwrite)
       
   732         {
       
   733         Server()->DeleteThumbnailsL( params.iTargetUri);
       
   734         }
       
   735     
       
   736     // if only one size
       
   737     if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0)
       
   738         {
       
   739         if(params.iThumbnailSize == EFullScreenThumbnailSize ||
       
   740            params.iThumbnailSize == EGridThumbnailSize ||
       
   741            params.iThumbnailSize == EListThumbnailSize )
       
   742            {
       
   743            TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   744            TDataType mimetype;
       
   745            TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
   746            
       
   747            if( ret == KErrNone )
       
   748                {
       
   749                sourceType = Server()->SourceTypeFromMimeType( mimetype );   
       
   750                ModifyThumbnailSize(sourceType);
       
   751                }
       
   752            User::LeaveIfError( ret );
       
   753            }
       
   754         }
       
   755     
       
   756     TInt bufferSize = aMessage.Int2();
       
   757     HBufC8* buffer = HBufC8::NewMaxLC( bufferSize );
       
   758     TPtr8 ptr = buffer->Des();
       
   759     aMessage.ReadL( 1 /* buffer pointer */, ptr );
       
   760     
       
   761     CreateGenerateTaskFromBufferL( buffer );
       
   762     CleanupStack::Pop( buffer );
       
   763     }
       
   764 
       
   765 void CThumbnailServerSession::RequestSetThumbnailByBitmapL( const RMessage2& aMessage )
       
   766     {
       
   767     TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL()" );
       
   768     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "CThumbnailServerSession::RequestSetThumbnailByBitmapL" );
       
   769 
       
   770     if(aMessage.Int2() != KCheckValue)
       
   771         {
       
   772         TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - error in aMessage - leaving" );
       
   773         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "CThumbnailServerSession::RequestSetThumbnailByBitmapL - error in aMessage - leaving" );
       
   774         User::Leave(KErrArgument);
       
   775         }
       
   776         
       
   777     aMessage.ReadL( 0, iRequestParams );
       
   778     const TThumbnailRequestParams& params = iRequestParams();
       
   779     
       
   780     const TThumbnailServerRequestId reqId( this, params.iRequestId );
       
   781     
       
   782     // delete existing
       
   783     if(params.iOverwrite)
       
   784         {
       
   785         Server()->DeleteThumbnailsL( params.iTargetUri);
       
   786         }
       
   787     
       
   788     // if only one size
       
   789     if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0)
       
   790         {
       
   791         if(params.iThumbnailSize == EFullScreenThumbnailSize ||
       
   792            params.iThumbnailSize == EGridThumbnailSize ||
       
   793            params.iThumbnailSize == EListThumbnailSize )
       
   794            {
       
   795            TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   796            TDataType mimetype;
       
   797            TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
   798            
       
   799            if( ret == KErrNone )
       
   800                {
       
   801                sourceType = Server()->SourceTypeFromMimeType( mimetype );   
       
   802                ModifyThumbnailSize(sourceType);
       
   803                }
       
   804            User::LeaveIfError( ret );
       
   805            }
       
   806         }
       
   807     
       
   808     TInt bitmapHandle = aMessage.Int1();
       
   809     
       
   810     // get bitmap
       
   811     CFbsBitmap* bitmap = new( ELeave )CFbsBitmap();
       
   812     CleanupStack::PushL( bitmap );
       
   813     User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) );
       
   814 
       
   815     // use pool to prevent bitmap leak
       
   816     // this bitmap is shared to several scale tasks, one of which can Leave
       
   817     Server()->AddBitmapToPoolL( this, bitmap, reqId );
       
   818     
       
   819     CleanupStack::Pop( bitmap );
       
   820     iBitmapHandle = bitmap->Handle();
       
   821     
       
   822     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
       
   823     
       
   824     // source type
       
   825     TDataType mimeType;
       
   826     TInt sourceType = 0;
       
   827     TInt err = Server()->MimeTypeFromFileExt( params.iTargetUri, mimeType );
       
   828     
       
   829     // get missing sizes
       
   830     if ( err == KErrNone && ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 )
       
   831         {
       
   832         sourceType = Server()->SourceTypeFromMimeType( mimeType );
       
   833         
       
   834         missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
       
   835         CleanupClosePushL( *missingSizes );
       
   836     
       
   837         Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse);
       
   838             
       
   839         if ( missingSizes->Count() == 0)
       
   840             {
       
   841             // all thumbs already exist
       
   842             CleanupStack::PopAndDestroy( missingSizes );
       
   843             delete missingSizes;
       
   844             missingSizes = NULL;
       
   845             }            
       
   846         }
       
   847     
       
   848     // if missing sizes, create scale tasks
       
   849     if ( missingSizes )
       
   850         {
       
   851         const TInt count = missingSizes->Count();
       
   852         
       
   853         TSize bitmapSize = bitmap->SizeInPixels();
       
   854         
       
   855         // scale small thumbs first, because fullscreen encoding takes longer
       
   856         for ( TInt i( count-1 ); i >= 0; i-- )
       
   857             {           
       
   858             if( bitmapSize.iWidth < bitmapSize.iHeight )
       
   859                {
       
   860                TThumbnailSize size = (*missingSizes)[ i ].iType;
       
   861         
       
   862                if ( size == EFullScreenThumbnailSize ||
       
   863                     size == EVideoFullScreenThumbnailSize ||
       
   864                     size == EAudioFullScreenThumbnailSize ||
       
   865                     size == EImageFullScreenThumbnailSize ||
       
   866                     size == EContactFullScreenThumbnailSize )
       
   867                    {
       
   868                    TInt height = (*missingSizes)[i].iSize.iHeight;
       
   869                    (*missingSizes)[i].iSize.iHeight = (*missingSizes)[i].iSize.iWidth;
       
   870                    (*missingSizes)[i].iSize.iWidth = height;
       
   871                     
       
   872                    TN_DEBUG1( "CThumbnailServerSession::RequestSetThumbnailByBitmapL() - portrait");
       
   873                    OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_REQUESTSETTHUMBNAILBYBITMAPL, "CThumbnailServerSession::RequestSetThumbnailByBitmapL - portrait" );
       
   874                    }
       
   875                }
       
   876         
       
   877             CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(),
       
   878                     *Server(), params.iTargetUri, bitmap, bitmapSize,
       
   879                     (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode,
       
   880                     KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse,
       
   881                     reqId, params.iVirtualUri);
       
   882             
       
   883             CleanupStack::PushL( scaleTask );
       
   884             scaleTask->SetDoStore( ETrue );
       
   885             Server()->Processor().AddTaskL( scaleTask );
       
   886             CleanupStack::Pop( scaleTask );
       
   887         
       
   888             // completion to first task, because task processor works like stack
       
   889             if( i == 0 )
       
   890                 {            
       
   891                 // scaleTask is now responsible for completing the RMessage
       
   892                 scaleTask->SetMessageData( reqId, iMessage, iClientThread );
       
   893                 iMessage = RMessage2();
       
   894                 }
       
   895             }
       
   896         }
       
   897     else
       
   898         {
       
   899         // complete message
       
   900         aMessage.Complete( KErrNone );
       
   901         iMessage = RMessage2();
       
   902         }
       
   903     
       
   904     if ( missingSizes )
       
   905         {
       
   906         CleanupStack::PopAndDestroy( missingSizes );
       
   907         delete missingSizes;
       
   908         missingSizes = NULL;
       
   909         }
       
   910     
       
   911     // Scale tasks now reference the bitmap in the pool
       
   912     Server()->DeleteBitmapFromPool( iBitmapHandle );
       
   913     iBitmapHandle = 0;
       
   914     bitmap = NULL;
       
   915     }
       
   916  
       
   917 // -----------------------------------------------------------------------------
       
   918 // CThumbnailServerSession::CreateGenerateTaskL()
       
   919 // Create a task to generate a new thumbnail
       
   920 // -----------------------------------------------------------------------------
       
   921 //
       
   922 void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile)
       
   923     {
       
   924     TThumbnailRequestParams& params = iRequestParams();
       
   925 
       
   926     TN_DEBUG2( 
       
   927         "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", &params.iFileName );
       
   928     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMFILEHANDLEL, "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL -- create thumbnail generation task for;params.iFileName=%S", params.iFileName );
       
   929     
       
   930     // disk space check only for stored sizes
       
   931     if ( params.iImport && 
       
   932          Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() )
       
   933         {
       
   934         User::Leave( KErrDiskFull );
       
   935         }
       
   936     else if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
   937          Server()->StoreForPathL(params.iFileName)->IsDiskFull() )
       
   938         {
       
   939         User::Leave( KErrDiskFull );
       
   940         }
       
   941     
       
   942     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
       
   943     
       
   944     // get missing sizes
       
   945     if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 )
       
   946         {
       
   947         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   948         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
       
   949         missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
       
   950         CleanupClosePushL( *missingSizes );
       
   951 		
       
   952 	    TBool gridSizeOnly(EFalse);
       
   953             
       
   954 	    if ( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview )
       
   955 	        {
       
   956 	        gridSizeOnly = ETrue;
       
   957 	        }
       
   958         
       
   959 	    // import vs. normal
       
   960 	    if(params.iImport)
       
   961 	        {
       
   962             Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, gridSizeOnly);
       
   963 	        }
       
   964 	    else
       
   965 	        {
       
   966             Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly);
       
   967 	        }     
       
   968         
       
   969         if ( missingSizes->Count() == 0)
       
   970             {
       
   971             // all thumbs already exist
       
   972             CleanupStack::PopAndDestroy( missingSizes );
       
   973             delete missingSizes;
       
   974             missingSizes = NULL;
       
   975             
       
   976             if( aFile )
       
   977                {
       
   978                aFile->Close();
       
   979                }
       
   980             return;
       
   981             }            
       
   982         }
       
   983     // creating single TN on demand
       
   984     else if( params.iThumbnailSize > ECustomThumbnailSize && params.iThumbnailSize  < EThumbnailSizeCount)
       
   985         {
       
   986         TThumbnailPersistentSize persistentSize = Server()->PersistentSizeL(params.iThumbnailSize);
       
   987         
       
   988         if(persistentSize.iCrop)
       
   989             {
       
   990             params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags | CThumbnailManager::ECropToAspectRatio);
       
   991             }
       
   992         else
       
   993             {
       
   994             params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags & CThumbnailManager::ECropToAspectRatio);
       
   995             }
       
   996         
       
   997         if( ClientThreadAlive() )
       
   998             {
       
   999             iMessage.Write( 0, iRequestParams );
       
  1000             }
       
  1001         }
       
  1002     
       
  1003     // priority
       
  1004     TInt priority = params.iPriority;
       
  1005     if ( priority > KMaxGeneratePriority )
       
  1006         {
       
  1007         priority = KMaxGeneratePriority;
       
  1008         }
       
  1009     
       
  1010     // create new task
       
  1011     if( !aFile)
       
  1012         {
       
  1013         TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() - KErrArgument");
       
  1014         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMFILEHANDLEL, "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL - KErrArgument" );
       
  1015         User::Leave( KErrArgument );
       
  1016         }
       
  1017     CleanupClosePushL( *aFile );
       
  1018     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
       
  1019         ->Processor(), * Server(), aFile, NULL, &params.iMimeType, params.iFlags,
       
  1020         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
       
  1021         params.iThumbnailSize, params.iModified, params.iQualityPreference,
       
  1022         params.iVirtualUri);
       
  1023 
       
  1024     // do not store bitmaps to server pool when generating only
       
  1025     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
       
  1026         {
       
  1027         task->ScaledBitmapToPool( EFalse );
       
  1028         }
       
  1029         
       
  1030     CleanupStack::Pop( aFile );
       
  1031     
       
  1032     CleanupStack::PushL( task );
       
  1033     task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread );
       
  1034     Server()->QueueTaskL( task );
       
  1035     CleanupStack::Pop( task ); // owned by processor now
       
  1036     
       
  1037     if ( missingSizes )
       
  1038         {
       
  1039         CleanupStack::Pop( missingSizes );
       
  1040         }
       
  1041 
       
  1042     // Generate task is now responsible for completing the message
       
  1043     iMessage = RMessage2();
       
  1044     } 
       
  1045 
       
  1046 // -----------------------------------------------------------------------------
       
  1047 // CThumbnailServerSession::CreateGenerateTaskL()
       
  1048 // Create a task to generate a new thumbnail
       
  1049 // -----------------------------------------------------------------------------
       
  1050 //
       
  1051 void CThumbnailServerSession::CreateGenerateTaskFromBufferL( TDesC8* aBuffer )
       
  1052     {
       
  1053     const TThumbnailRequestParams& params = iRequestParams();
       
  1054 
       
  1055     TN_DEBUG2( 
       
  1056         "CThumbnailServerSession::CreateGenerateTaskFromBufferL() -- create thumbnail generation task for %S", &params.iTargetUri );
       
  1057     OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL -  -- create thumbnail generation task for;params.iTargetUri=%S", params.iTargetUri );
       
  1058   
       
  1059     // disk space check only for stored sizes
       
  1060     if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
  1061          Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() )
       
  1062         {
       
  1063         User::Leave( KErrDiskFull );
       
  1064         }
       
  1065     
       
  1066     if(aBuffer && params.iMimeType.Des().Match( KVideoMime ) == 0 )
       
  1067         {
       
  1068         User::Leave( KErrNotSupported );
       
  1069         }
       
  1070     
       
  1071     TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
  1072     
       
  1073     TDataType mimetype;
       
  1074     TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
  1075     if(ret == KErrNotFound)
       
  1076         {
       
  1077         Server()->Fs().ShareProtected();
       
  1078         RFile64 file;
       
  1079         CleanupClosePushL( file );
       
  1080         
       
  1081         User::LeaveIfError( file.Open( Server()->Fs(), params.iTargetUri, EFileShareReadersOrWriters )); 
       
  1082         TN_DEBUG2( "CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle opened for %S", &params.iFileName );
       
  1083                 OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL;params.iFileName=%S", params.iFileName );
       
  1084                 
       
  1085         mimetype = Server()->ResolveMimeTypeL(file);
       
  1086                 
       
  1087         file.Close();
       
  1088         TN_DEBUG1("CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle closed");
       
  1089         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL - file handle closed" );
       
  1090         
       
  1091         CleanupStack::Pop( &file );    
       
  1092         }
       
  1093         
       
  1094     sourceType = Server()->SourceTypeFromMimeType( mimetype );    
       
  1095     
       
  1096     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
       
  1097     
       
  1098     // get missing sizes
       
  1099     if ( ( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly ) != 0 )
       
  1100         {
       
  1101         missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
       
  1102         CleanupClosePushL( *missingSizes );
       
  1103         
       
  1104         Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, EFalse );
       
  1105             
       
  1106         if ( missingSizes->Count() == 0)
       
  1107             {
       
  1108             // all thumbs already exist
       
  1109             CleanupStack::PopAndDestroy( missingSizes );
       
  1110             delete missingSizes;
       
  1111             missingSizes = NULL;
       
  1112             
       
  1113             if ( aBuffer)
       
  1114                {
       
  1115                delete aBuffer;
       
  1116                aBuffer = NULL; 
       
  1117                }
       
  1118             return;
       
  1119             }            
       
  1120         }
       
  1121     
       
  1122     // priority
       
  1123     TInt priority = params.iPriority;
       
  1124     if ( priority > KMaxGeneratePriority )
       
  1125         {
       
  1126         priority = KMaxGeneratePriority;
       
  1127         }
       
  1128     
       
  1129     // create new task
       
  1130     if( !aBuffer)
       
  1131         {
       
  1132         TN_DEBUG1( "CThumbnailServerSession::UpdateThumbnailsL() - KErrArgument" );
       
  1133         OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILSERVERSESSION_CREATEGENERATETASKFROMBUFFERL, "CThumbnailServerSession::CreateGenerateTaskFromBufferL - KErrArgument" );
       
  1134         User::Leave( KErrArgument );
       
  1135         }
       
  1136     
       
  1137     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
       
  1138         ->Processor(), * Server(), NULL, aBuffer, &params.iMimeType, params.iFlags,
       
  1139         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
       
  1140         params.iThumbnailSize, params.iModified, params.iQualityPreference,
       
  1141         params.iVirtualUri);
       
  1142 
       
  1143     // do not store bitmaps to server pool when generating only
       
  1144     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
       
  1145         {
       
  1146         task->ScaledBitmapToPool( EFalse );
       
  1147         }  
       
  1148     
       
  1149     CleanupStack::PushL( task );
       
  1150     task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ),iMessage, iClientThread );
       
  1151     Server()->QueueTaskL( task );
       
  1152     CleanupStack::Pop( task ); // owned by processor now
       
  1153     
       
  1154     if ( missingSizes )
       
  1155         {
       
  1156         CleanupStack::Pop( missingSizes );
       
  1157         }
       
  1158 
       
  1159     // Generate task is now responsible for completing the message
       
  1160     iMessage = RMessage2();
       
  1161     } 
       
  1162 // -----------------------------------------------------------------------------
       
  1163 // CThumbnailServerSession::FetchThumbnailL()
       
  1164 // Fetch thumbnail data from database
       
  1165 // -----------------------------------------------------------------------------
       
  1166 //
       
  1167 void CThumbnailServerSession::FetchThumbnailL()
       
  1168     {
       
  1169     TN_DEBUG1("CThumbnailServerSession::FetchThumbnailL()");
       
  1170     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_FETCHTHUMBNAILL, "CThumbnailServerSession::FetchThumbnailL" );
       
  1171     __ASSERT_DEBUG( !iBitmap, ThumbnailPanic( EThumbnailBitmapNotReleased ));
       
  1172     __ASSERT_DEBUG( !iBuffer, ThumbnailPanic( EThumbnailBitmapNotReleased ));
       
  1173 
       
  1174     delete iBitmap;
       
  1175     iBitmap = NULL;
       
  1176     delete iBuffer;
       
  1177     iBuffer = NULL;
       
  1178 
       
  1179     TThumbnailRequestParams& params = iRequestParams();
       
  1180     
       
  1181     if ( params.iThumbnailSize != EUnknownThumbnailSize &&
       
  1182          params.iThumbnailSize != ECustomThumbnailSize )
       
  1183         {
       
  1184         TThumbnailPersistentSize & persistentSize = Server()->PersistentSizeL( params.iThumbnailSize );
       
  1185         params.iSize = persistentSize.iSize;
       
  1186         }
       
  1187     
       
  1188     if( params.iFileName != KNullDesC )
       
  1189         {
       
  1190         TN_DEBUG3( "CThumbnailServerSession::FetchThumbnailL( ThumbnailSize=%d ( Path=%S ))", 
       
  1191                  params.iThumbnailSize, &params.iFileName );
       
  1192         OstTraceExt1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_FETCHTHUMBNAILL, "CThumbnailServerSession::FetchThumbnailL;params.iFileName=%S", params.iFileName );
       
  1193         Server()->FetchThumbnailL( params.iFileName, iBitmap, iBuffer, params.iThumbnailSize, iOriginalSize);
       
  1194         }
       
  1195     else
       
  1196         {
       
  1197         User::Leave( KErrNotSupported );
       
  1198         }
       
  1199 #ifdef _DEBUG
       
  1200     if( iBitmap)
       
  1201         {
       
  1202         TN_DEBUG4( "CThumbnailServerSession::FetchThumbnailL() size %d x %d displaymode %d", iBitmap->SizeInPixels().iWidth, iBitmap->SizeInPixels().iHeight, iBitmap->DisplayMode());
       
  1203         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() );
       
  1204         }
       
  1205 #endif
       
  1206     }
       
  1207 
       
  1208 // -----------------------------------------------------------------------------
       
  1209 // CThumbnailServerSession::ProcessBitmapL()
       
  1210 // Process a fetched bitmap by creating scale tasks or by returning the
       
  1211 // bitmap as such.
       
  1212 // -----------------------------------------------------------------------------
       
  1213 //
       
  1214 void CThumbnailServerSession::ProcessBitmapL()
       
  1215     {   
       
  1216     TThumbnailRequestParams& params = iRequestParams();
       
  1217     
       
  1218     if ( ClientThreadAlive() )
       
  1219         {        
       
  1220         TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle());
       
  1221         OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_PROCESSBITMAPL, "CThumbnailServerSession::ProcessBitmapL;iBitmap->Handle()=%o", iBitmap->Handle() );
       
  1222         
       
  1223         params.iBitmapHandle = iBitmap->Handle();
       
  1224         const TSize bitmapSize = iBitmap->SizeInPixels();
       
  1225         
       
  1226         if ( params.iQualityPreference == CThumbnailManager
       
  1227             ::EOptimizeForQualityWithPreview && bitmapSize.iWidth <
       
  1228             params.iSize.iWidth && bitmapSize.iHeight < params.iSize.iHeight &&
       
  1229             bitmapSize.iWidth < iOriginalSize.iWidth && bitmapSize.iHeight <
       
  1230             iOriginalSize.iHeight )
       
  1231             {
       
  1232             // This is a non-scaled preview bitmap
       
  1233             params.iControlFlags = EThumbnailPreviewThumbnail;
       
  1234             }
       
  1235 
       
  1236         iMessage.WriteL( 0, iRequestParams );
       
  1237         
       
  1238         TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool");
       
  1239         OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_PROCESSBITMAPL, "CThumbnailServerSession::ProcessBitmapL - bitmap to pool" );
       
  1240         
       
  1241         Server()->AddBitmapToPoolL( this, iBitmap, TThumbnailServerRequestId( this, params.iRequestId ) );
       
  1242         
       
  1243         iMessage.Complete( KErrNone );
       
  1244         iMessage = RMessage2();
       
  1245         
       
  1246         iBitmap = NULL; // owned by server now
       
  1247         }            
       
  1248     else
       
  1249         {
       
  1250         delete iBitmap;
       
  1251         iBitmap = NULL;
       
  1252         }
       
  1253     }
       
  1254 
       
  1255 // -----------------------------------------------------------------------------
       
  1256 // CThumbnailServerSession::ReleaseBitmap()
       
  1257 // Release bitmap from bitmap pool
       
  1258 // -----------------------------------------------------------------------------
       
  1259 //
       
  1260 void CThumbnailServerSession::ReleaseBitmap( const RMessage2& aMessage )
       
  1261     {
       
  1262     TN_DEBUG2( "CThumbnailServerSession::ReleaseBitmap(%d)", aMessage.Int0());
       
  1263     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RELEASEBITMAP, "CThumbnailServerSession::ReleaseBitmap;aMessage.Int0()=%d", aMessage.Int0() );
       
  1264     Server()->DeleteBitmapFromPool( aMessage.Int0());
       
  1265     }
       
  1266 
       
  1267 
       
  1268 // -----------------------------------------------------------------------------
       
  1269 // CThumbnailServerSession::CancelRequest()
       
  1270 // Cancel pending request.
       
  1271 // -----------------------------------------------------------------------------
       
  1272 //
       
  1273 TInt CThumbnailServerSession::CancelRequest( const RMessage2& aMessage )
       
  1274     {
       
  1275     TN_DEBUG1( "CThumbnailServerSession::CancelRequest()" );
       
  1276     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest" );
       
  1277     
       
  1278     const TThumbnailServerRequestId requestId( this, aMessage.Int0());
       
  1279     const TInt err = Server()->DequeTask( requestId );
       
  1280     TN_DEBUG4( 
       
  1281         "CThumbnailServerSession::CancelRequest(0x%08x/%d) - returning %d",
       
  1282         requestId.iSession, requestId.iRequestId, err );
       
  1283     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest;requestId.iSession=%o", requestId.iSession );
       
  1284     OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CANCELREQUEST, "CThumbnailServerSession::CancelRequest;err=%d", err );
       
  1285     
       
  1286     return err;
       
  1287     }
       
  1288 
       
  1289 // -----------------------------------------------------------------------------
       
  1290 // CThumbnailServerSession::ChangePriority()
       
  1291 // Change priority of pending request.
       
  1292 // -----------------------------------------------------------------------------
       
  1293 //
       
  1294 TInt CThumbnailServerSession::ChangePriority( const RMessage2& aMessage )
       
  1295     {
       
  1296     TN_DEBUG1( "CThumbnailServerSession::ChangePriority()" );
       
  1297     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority" );
       
  1298     
       
  1299     const TThumbnailServerRequestId requestId( this, aMessage.Int0());
       
  1300     const TInt newPriority = aMessage.Int1();
       
  1301 
       
  1302     const TInt err = Server()->ChangeTaskPriority( requestId, newPriority );
       
  1303     TN_DEBUG5( 
       
  1304         "CThumbnailServerSession::ChangePriority(0x%08x/%d, %d) - returning %d",
       
  1305         requestId.iSession, requestId.iRequestId, newPriority, err );
       
  1306     OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority;requestId.iSession=%o", requestId.iSession );
       
  1307     OstTraceExt2( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CHANGEPRIORITY, "CThumbnailServerSession::ChangePriority;requestId.iRequestId=%u;err=%d", requestId.iRequestId, err );
       
  1308     
       
  1309     return err;
       
  1310     }
       
  1311 
       
  1312 // -----------------------------------------------------------------------------
       
  1313 // CThumbnailServerSession::DeleteThumbnailsL()
       
  1314 // Delete thumbnails for given object file
       
  1315 // -----------------------------------------------------------------------------
       
  1316 //
       
  1317 void CThumbnailServerSession::DeleteThumbnailsL( const RMessage2& aMessage )
       
  1318     {
       
  1319     if(aMessage.Int2() != KCheckValue)
       
  1320        {
       
  1321        TN_DEBUG1( "CThumbnailServerSession::DeleteThumbnailsL() - error in aMessage - leaving" );
       
  1322        OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_DELETETHUMBNAILSL, "CThumbnailServerSession::DeleteThumbnailsL - error in aMessage - leaving" );
       
  1323        User::Leave(KErrArgument);
       
  1324        }
       
  1325     
       
  1326     HBufC* fileName = HBufC::NewLC( KMaxFileName );
       
  1327     TPtr ptr = fileName->Des();
       
  1328     aMessage.ReadL( 1, ptr );
       
  1329     Server()->DeleteThumbnailsL( ptr );
       
  1330     CleanupStack::PopAndDestroy( fileName );
       
  1331     
       
  1332     aMessage.Complete( KErrNone );
       
  1333     iMessage = RMessage2();
       
  1334     }
       
  1335 
       
  1336 // -----------------------------------------------------------------------------
       
  1337 // CThumbnailServerSession::DeleteThumbnailsByIdL()
       
  1338 // Delete thumbnails by TThumbnailId.
       
  1339 // -----------------------------------------------------------------------------
       
  1340 //
       
  1341 void CThumbnailServerSession::DeleteThumbnailsByIdL( const RMessage2& aMessage )
       
  1342     {
       
  1343     if(aMessage.Int2() != KCheckValue)
       
  1344        {
       
  1345        TN_DEBUG1( "CThumbnailServerSession::DeleteThumbnailsByIdL() - error in aMessage - leaving" );
       
  1346        OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_DELETETHUMBNAILSBYIDL, "CThumbnailServerSession::DeleteThumbnailsByIdL - error in aMessage - leaving" );
       
  1347        User::Leave(KErrArgument);
       
  1348        }
       
  1349     
       
  1350     // read message params
       
  1351     aMessage.ReadL( 0, iRequestParams );
       
  1352     const TThumbnailRequestParams& params = iRequestParams();
       
  1353     
       
  1354 #ifdef RD_MDS_2_5        
       
  1355     // try to query path from MDS
       
  1356     CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask(
       
  1357             Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server());
       
  1358     
       
  1359     CleanupStack::PushL( task );
       
  1360     task->QueryPathByIdL(params.iThumbnailId, ETrue);
       
  1361     task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ) );
       
  1362     Server()->QueueTaskL( task );
       
  1363     CleanupStack::Pop( task ); // owned by processor now
       
  1364 #endif // RD_MDS_2_5
       
  1365     
       
  1366     aMessage.Complete( KErrNone );
       
  1367     iMessage = RMessage2();
       
  1368     }
       
  1369 
       
  1370 // -----------------------------------------------------------------------------
       
  1371 // Get the required size (in characters) for a buffer that contains the
       
  1372 // list of supported MIME types
       
  1373 // -----------------------------------------------------------------------------
       
  1374 //
       
  1375 void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage )
       
  1376     {
       
  1377     TPckgBuf < TInt > buf;
       
  1378     buf() = Server()->GetMimeTypeBufferSize();
       
  1379     aMessage.WriteL( 0, buf );
       
  1380     }
       
  1381 
       
  1382 // -----------------------------------------------------------------------------
       
  1383 // Get the list of supported MIME types and store them in the buffer
       
  1384 // allocated by the client.
       
  1385 // -----------------------------------------------------------------------------
       
  1386 //
       
  1387 void CThumbnailServerSession::GetMimeTypeListL( const RMessage2& aMessage )
       
  1388     {
       
  1389     TN_DEBUG1( "CThumbnailServerSession::GetMimeTypeListL()" );
       
  1390     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_GETMIMETYPELISTL, "CThumbnailServerSession::GetMimeTypeListL" );
       
  1391     
       
  1392     TInt len = aMessage.GetDesMaxLengthL( 0 );
       
  1393     HBufC* buf = HBufC::NewLC( len );
       
  1394     TPtr ptr = buf->Des();
       
  1395     Server()->GetMimeTypeList( ptr );
       
  1396     aMessage.WriteL( 0, * buf );
       
  1397     CleanupStack::PopAndDestroy( buf );
       
  1398     }
       
  1399 
       
  1400 // ---------------------------------------------------------------------------
       
  1401 // CThumbnailServerSession::ModifyThumbnailSize
       
  1402 // ---------------------------------------------------------------------------
       
  1403 //
       
  1404 void CThumbnailServerSession::ModifyThumbnailSize( TInt aSourceType )   
       
  1405     {
       
  1406     TThumbnailRequestParams& params = iRequestParams();
       
  1407     if(aSourceType == TThumbnailPersistentSize::EImage)
       
  1408         {
       
  1409         if(params.iThumbnailSize == EFullScreenThumbnailSize)
       
  1410             {
       
  1411             params.iThumbnailSize = EImageFullScreenThumbnailSize;
       
  1412             }
       
  1413         else if(params.iThumbnailSize == EGridThumbnailSize)
       
  1414             {
       
  1415             params.iThumbnailSize = EImageGridThumbnailSize;
       
  1416             }
       
  1417         else if(params.iThumbnailSize == EListThumbnailSize)
       
  1418             {
       
  1419             params.iThumbnailSize = EImageListThumbnailSize;
       
  1420             }       
       
  1421         }
       
  1422     else if(aSourceType == TThumbnailPersistentSize::EVideo)
       
  1423            {
       
  1424            if(params.iThumbnailSize == EFullScreenThumbnailSize)
       
  1425                {
       
  1426                params.iThumbnailSize = EVideoFullScreenThumbnailSize;
       
  1427                }
       
  1428            else if(params.iThumbnailSize == EGridThumbnailSize)
       
  1429                {
       
  1430                params.iThumbnailSize = EVideoGridThumbnailSize;
       
  1431                }
       
  1432            else if(params.iThumbnailSize == EListThumbnailSize)
       
  1433                {
       
  1434                params.iThumbnailSize = EVideoListThumbnailSize;
       
  1435                }       
       
  1436            }
       
  1437     else if(aSourceType == TThumbnailPersistentSize::EAudio)
       
  1438            {
       
  1439            if(params.iThumbnailSize == EFullScreenThumbnailSize)
       
  1440                {
       
  1441                params.iThumbnailSize = EAudioFullScreenThumbnailSize;
       
  1442                }
       
  1443            else if(params.iThumbnailSize == EGridThumbnailSize)
       
  1444                {
       
  1445                params.iThumbnailSize = EAudioGridThumbnailSize;
       
  1446                }
       
  1447            else if(params.iThumbnailSize == EListThumbnailSize)
       
  1448                {
       
  1449                params.iThumbnailSize = EAudioListThumbnailSize;
       
  1450                }       
       
  1451            }
       
  1452     else if(aSourceType == TThumbnailPersistentSize::EContact)
       
  1453            {
       
  1454            if(params.iThumbnailSize == EFullScreenThumbnailSize)
       
  1455                {
       
  1456                params.iThumbnailSize = EContactFullScreenThumbnailSize;
       
  1457                }
       
  1458            else if(params.iThumbnailSize == EGridThumbnailSize)
       
  1459                {
       
  1460                params.iThumbnailSize = EContactGridThumbnailSize;
       
  1461                }
       
  1462            else if(params.iThumbnailSize == EListThumbnailSize)
       
  1463                {
       
  1464                params.iThumbnailSize = EContactListThumbnailSize;
       
  1465                }       
       
  1466            }
       
  1467     }
       
  1468 
       
  1469 //------------------------------------------------------------------------
       
  1470 // CThumbnailServerSession::ModifyThumbnailSize
       
  1471 // ---------------------------------------------------------------------------
       
  1472 //
       
  1473 void CThumbnailServerSession::ResolveMimeTypeL( RFile64* aFile )
       
  1474     { 
       
  1475     TThumbnailRequestParams& params = iRequestParams();
       
  1476     TInt res = 0;
       
  1477         
       
  1478     // mime type
       
  1479     if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) )
       
  1480         {
       
  1481         // try parsing from file extension
       
  1482         if (params.iImport)
       
  1483             {
       
  1484             res = Server()->MimeTypeFromFileExt( params.iTargetUri, params.iMimeType );
       
  1485             }
       
  1486         else
       
  1487             {
       
  1488             res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType );
       
  1489             }
       
  1490         
       
  1491         if ( res == KErrNotFound )
       
  1492             {
       
  1493             if( aFile )
       
  1494                 {
       
  1495                 // parsed type not in the list, resolve from file
       
  1496                 params.iMimeType = Server()->ResolveMimeTypeL(*aFile);
       
  1497                 }
       
  1498             else
       
  1499                 {
       
  1500                 Server()->Fs().ShareProtected();
       
  1501                 RFile64 file;
       
  1502                 CleanupClosePushL( file );
       
  1503               
       
  1504                 User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); 
       
  1505                 TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", &params.iFileName );
       
  1506                 OstTraceExt1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_RESOLVEMIMETYPEL, "CThumbnailServerSession::ResolveMimeTypeL - file handle opened;params.iFileName=%S", params.iFileName );
       
  1507               
       
  1508                 params.iMimeType = Server()->ResolveMimeTypeL(file);
       
  1509               
       
  1510                 file.Close();
       
  1511                 TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed");
       
  1512                 OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_RESOLVEMIMETYPEL, "CThumbnailServerSession::ResolveMimeTypeL - file handle closed" );
       
  1513               
       
  1514                 CleanupStack::Pop( &file );    
       
  1515                 }    
       
  1516             }        
       
  1517         }       
       
  1518     }
       
  1519 
       
  1520 
       
  1521 // ---------------------------------------------------------------------------
       
  1522 // RThumbnailMessage::FilterSqlErr
       
  1523 // ---------------------------------------------------------------------------
       
  1524 //
       
  1525 TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason )
       
  1526     {
       
  1527     TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason);
       
  1528     OstTrace1( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CONVERTSQLERRTOE32ERR, "CThumbnailServerSession::ConvertSqlErrToE32Err;aReason=%d", aReason );
       
  1529     TInt e32Err(aReason);
       
  1530 	
       
  1531     if ( aReason >=  - 144 )
       
  1532     // magic: [-1..-144] is E32 error range 
       
  1533         {
       
  1534         // E32 error value or non-negative value
       
  1535         switch ( aReason )
       
  1536             {
       
  1537             case KErrServerTerminated:
       
  1538                 e32Err = KErrCorrupt;
       
  1539                 break;
       
  1540             default:
       
  1541                 e32Err = aReason;
       
  1542             }
       
  1543         }
       
  1544     else
       
  1545         {
       
  1546         switch ( aReason )
       
  1547             {
       
  1548             case KSqlErrGeneral:
       
  1549                 e32Err = KErrGeneral;
       
  1550                 break;
       
  1551             case KSqlErrInternal:
       
  1552                 e32Err = KErrGeneral;
       
  1553                 break;
       
  1554             case KSqlErrPermission:
       
  1555                 e32Err = KErrPermissionDenied;
       
  1556                 break;
       
  1557             case KSqlErrAbort:
       
  1558                 e32Err = KErrAbort;
       
  1559                 break;
       
  1560             case KSqlErrBusy:
       
  1561                 e32Err = KErrServerBusy;
       
  1562                 break;
       
  1563             case KSqlErrLocked:
       
  1564                 e32Err = KErrLocked;
       
  1565                 break;
       
  1566             case KSqlErrReadOnly:
       
  1567                 e32Err = KErrAccessDenied;
       
  1568                 break;
       
  1569             case KSqlErrInterrupt:
       
  1570                 e32Err = KErrAbort;
       
  1571                 break;
       
  1572             case KSqlErrIO:
       
  1573                 e32Err = KErrGeneral;
       
  1574                 break;
       
  1575             case KSqlErrCorrupt:
       
  1576                 e32Err = KErrCorrupt;
       
  1577                 break;
       
  1578             case KSqlErrNotFound:
       
  1579                 e32Err = KErrNotFound;
       
  1580                 break;
       
  1581             case KSqlErrFull:
       
  1582                 e32Err = KErrOverflow;
       
  1583                 break;
       
  1584             case KSqlErrCantOpen:
       
  1585                 e32Err = KErrCouldNotConnect;
       
  1586                 break;
       
  1587             case KSqlErrProtocol:
       
  1588                 e32Err = KErrLocked;
       
  1589                 break;
       
  1590             case KSqlErrEmpty:
       
  1591                 e32Err = KErrNotFound;
       
  1592                 break;
       
  1593             case KSqlErrSchema:
       
  1594                 e32Err = KErrAbort;
       
  1595                 break;
       
  1596             case KSqlErrTooBig:
       
  1597                 e32Err = KErrTooBig;
       
  1598                 break;
       
  1599             case KSqlErrConstraint:
       
  1600                 e32Err = KErrGeneral;
       
  1601                 break;
       
  1602             case KSqlErrMismatch:
       
  1603                 e32Err = KErrGeneral;
       
  1604                 break;
       
  1605             case KSqlErrMisuse:
       
  1606                 e32Err = KErrGeneral;
       
  1607                 break;
       
  1608             case KSqlErrRange:
       
  1609                 e32Err = KErrOverflow;
       
  1610                 break;
       
  1611             case KSqlErrNotDb:
       
  1612                 e32Err = KErrCorrupt;
       
  1613                 break;
       
  1614             case KSqlErrStmtExpired:
       
  1615                 e32Err = KErrAbort;
       
  1616                 break;
       
  1617             default:
       
  1618                 e32Err = aReason;
       
  1619             }
       
  1620         }
       
  1621     return e32Err;
       
  1622     }
       
  1623 
       
  1624 // ---------------------------------------------------------------------------
       
  1625 // CThumbnailServerSession::ClientThreadAlive()
       
  1626 // Checks if client thread is still alive and RMessage2 handle valid.
       
  1627 // ---------------------------------------------------------------------------
       
  1628 //
       
  1629 TBool CThumbnailServerSession::ClientThreadAlive()
       
  1630     {
       
  1631     TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive()");
       
  1632     OstTrace0( TRACE_NORMAL, CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive" );
       
  1633     
       
  1634     if ( iMessage.Handle())
       
  1635         {
       
  1636         // check if client thread alive
       
  1637         TExitType exitType = iClientThread.ExitType();
       
  1638         
       
  1639         if( exitType != EExitPending )
       
  1640             {
       
  1641             TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - client thread died");
       
  1642             OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive - client thread died" );
       
  1643         
       
  1644             iMessage = RMessage2();
       
  1645             
       
  1646             return EFalse;
       
  1647             }
       
  1648         else
       
  1649             {
       
  1650             // all OK
       
  1651             return ETrue;
       
  1652             }
       
  1653         }
       
  1654     else
       
  1655         {
       
  1656         TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null");       
       
  1657         OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILSERVERSESSION_CLIENTTHREADALIVE, "CThumbnailServerSession::ClientThreadAlive - message null" );
       
  1658         return EFalse;
       
  1659         }
       
  1660     }
       
  1661 
       
  1662 
       
  1663 // End of file