imagehandlingutilities/thumbnailmanager/thumbnailserver/src/thumbnailserversession.cpp
branchGCC_SURGE
changeset 32 a0ee3f735f8b
parent 30 b67379558a75
child 33 221be23823c5
equal deleted inserted replaced
26:ea43e3e86079 32:a0ee3f735f8b
    53 // ---------------------------------------------------------------------------
    53 // ---------------------------------------------------------------------------
    54 //
    54 //
    55 CThumbnailServerSession::~CThumbnailServerSession()
    55 CThumbnailServerSession::~CThumbnailServerSession()
    56     {
    56     {
    57     Server()->DropSession(this);
    57     Server()->DropSession(this);
       
    58     delete iBitmap;
       
    59     iBitmap = NULL;
       
    60     delete iBuffer;
       
    61     iBuffer = NULL;
    58     }
    62     }
    59 
    63 
    60 
    64 
    61 // -----------------------------------------------------------------------------
    65 // -----------------------------------------------------------------------------
    62 // CThumbnailServerSession::DispatchMessageL()
    66 // CThumbnailServerSession::DispatchMessageL()
   154 // CThumbnailServerSession::CreateL()
   158 // CThumbnailServerSession::CreateL()
   155 // ---------------------------------------------------------------------------
   159 // ---------------------------------------------------------------------------
   156 //
   160 //
   157 void CThumbnailServerSession::CreateL()
   161 void CThumbnailServerSession::CreateL()
   158     {
   162     {
       
   163     TN_DEBUG2( "CThumbnailServerSession::AddSession() = 0x%08x", this );
       
   164     
   159     Server()->AddSession();
   165     Server()->AddSession();
   160     }
   166     }
   161 
   167 
   162 
   168 
   163 // -----------------------------------------------------------------------------
   169 // -----------------------------------------------------------------------------
   440     
   446     
   441     aMessage.ReadL( 0, iRequestParams );
   447     aMessage.ReadL( 0, iRequestParams );
   442     const TThumbnailRequestParams& params = iRequestParams();
   448     const TThumbnailRequestParams& params = iRequestParams();
   443 
   449 
   444     RFile64 file;
   450     RFile64 file;
       
   451     CleanupClosePushL(file);
   445     User::LeaveIfError( file.AdoptFromClient( aMessage, 2, 3 ));
   452     User::LeaveIfError( file.AdoptFromClient( aMessage, 2, 3 ));
   446     
   453     
   447     ResolveMimeTypeL(&file);
   454     ResolveMimeTypeL(&file);
   448     
   455     
   449     if(params.iThumbnailSize == EFullScreenThumbnailSize ||
   456     if(params.iThumbnailSize == EFullScreenThumbnailSize ||
   453         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   460         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   454         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
   461         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
   455         ModifyThumbnailSize(sourceType);
   462         ModifyThumbnailSize(sourceType);
   456         }
   463         }
   457     
   464     
       
   465     // delete existing
       
   466     if(params.iImport && params.iOverwrite)
       
   467         {
       
   468         Server()->DeleteThumbnailsL( params.iTargetUri);
       
   469         }
       
   470     
   458     // CreateThumbnails
   471     // CreateThumbnails
   459     if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly)
   472     if (params.iControlFlags == EThumbnailGeneratePersistentSizesOnly)
   460         {
   473         {
   461         TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" );
   474         TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - EThumbnailGeneratePersistentSizesOnly" );
   462         CleanupClosePushL( file );
       
   463         CreateGenerateTaskFromFileHandleL( &file );
   475         CreateGenerateTaskFromFileHandleL( &file );
   464         CleanupStack::Pop( &file );         
   476         
       
   477         // ownership of the file transferred
       
   478         CleanupStack::Pop(&file);
   465         }
   479         }
   466     // single thumbnail request
   480     // single thumbnail request
   467     else
   481     else
   468         {
   482         {
   469         TRAPD( err, FetchThumbnailL());
   483         TRAPD( err, FetchThumbnailL());
   470         
   484         
   471         if( err == KErrCompletion )
   485         if( err == KErrCompletion )
   472             {
   486             {
   473             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
   487             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
   474             TN_DEBUG1( 
   488             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" );
   475                 "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail blacklisted" );
   489             
   476             aMessage.Complete( err );
   490             aMessage.Complete( err );
   477             iMessage = RMessage2();
   491             iMessage = RMessage2();
       
   492             
       
   493             // close file
       
   494             CleanupStack::PopAndDestroy(&file);
   478             }
   495             }
   479         else if ( !err && iBitmap )
   496         else if ( !err && iBitmap )
   480             {
   497             {
   481             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - bitmap " );
   498             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - bitmap " );
   482 
   499 
   483             // Thumbnail already stored
   500             // Thumbnail already stored
   484             file.Close();
   501             CleanupStack::PopAndDestroy(&file);
   485             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
   502             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
   486 
   503 
   487             ProcessBitmapL();
   504             ProcessBitmapL();
   488             }
   505             }
   489         else if ( (err == KErrNotFound || err == KErrAccessDenied) && 
   506         else if ( (err == KErrNotFound || err == KErrAccessDenied) && 
   490                  !(params.iFlags& CThumbnailManager::EDoNotCreate) )
   507                  !(params.iFlags& CThumbnailManager::EDoNotCreate) )
   491             {
   508             {
   492             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" );
   509             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - KErrNotFound & !EDoNotCreate" );
   493             CreateGenerateTaskFromFileHandleL( &file);
   510             CreateGenerateTaskFromFileHandleL( &file);
       
   511             
       
   512             // ownership of the file transferred
       
   513         	CleanupStack::Pop(&file);
   494             }
   514             }
   495         else if (!err && iBuffer)
   515         else if (!err && iBuffer)
   496             {
   516             {
   497             TN_DEBUG1( 
   517             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - jpeg " );
   498                 "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - found existing thumbnail - jpeg " );
       
   499             
   518             
   500             CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server()
   519             CThumbnailDecodeTask* task = new( ELeave )CThumbnailDecodeTask( Server()
   501                         ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode );
   520                         ->Processor(), * Server(), iBuffer, params.iPriority, params.iDisplayMode );
   502             
   521             
   503             CleanupStack::PushL( task );
   522             CleanupStack::PushL( task );
   508             // Decode task is now responsible for completing the message
   527             // Decode task is now responsible for completing the message
   509             iMessage = RMessage2();
   528             iMessage = RMessage2();
   510             
   529             
   511             //CThumbnailDecodeTask is responsible freeing
   530             //CThumbnailDecodeTask is responsible freeing
   512             iBuffer = NULL;
   531             iBuffer = NULL;
   513             file.Close();
   532             
       
   533             // close file
       
   534             CleanupStack::PopAndDestroy(&file);
   514             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
   535             TN_DEBUG1("CThumbnailServerSession::RequestThumbByFileHandleAsyncL - file handle closed");
   515             }
   536             }
   516         else
   537         else
   517             {
   538             {
   518             TN_DEBUG2( 
   539             TN_DEBUG2( "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err );
   519                 "CThumbnailServerSession::RequestThumbByFileHandleAsyncL() - thumbnail not found, err=%d", err );
   540             
   520             aMessage.Complete( ConvertSqlErrToE32Err( err ));
   541             aMessage.Complete( ConvertSqlErrToE32Err( err ));
   521             iMessage = RMessage2();
   542             iMessage = RMessage2();
       
   543             
       
   544             // close file
       
   545             CleanupStack::PopAndDestroy(&file);
   522             }     
   546             }     
   523         }
   547         }
   524     }
   548     }
   525 
   549 
   526 // -----------------------------------------------------------------------------
   550 // -----------------------------------------------------------------------------
   589 	        iBuffer = NULL;
   613 	        iBuffer = NULL;
   590 	        }
   614 	        }
   591 	    else if( err == KErrCompletion )
   615 	    else if( err == KErrCompletion )
   592 	        {
   616 	        {
   593             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
   617             // If thumbnail of requested size is blacklisted, fetching is left with KErrCompletion
   594             TN_DEBUG1( 
   618             TN_DEBUG1( "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" );
   595                 "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail blacklisted" );
   619             
   596             aMessage.Complete( err );
   620             aMessage.Complete( err );
   597             iMessage = RMessage2();
   621             iMessage = RMessage2();
   598 	        }
   622 	        }
   599 	    else 
   623 	    else 
   600 	        {
   624 	        {
   601 	        TN_DEBUG2( 
   625 	        TN_DEBUG2( 
   602 	            "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err );
   626 	            "CThumbnailServerSession::RequestThumbByPathAsyncL() - thumbnail not found, err = %d", err );
   603 	        
   627 	        
       
   628 	        // don't try to create from virtual URI
       
   629 	        if ( params.iVirtualUri )
       
   630 	            {
       
   631                 User::Leave(err);
       
   632 	            }
       
   633 	        
       
   634             // disk space check only for stored sizes
       
   635             if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
   636                  Server()->StoreForPathL(params.iFileName)->IsDiskFull() )
       
   637                 {
       
   638                 User::Leave( KErrDiskFull );
       
   639                 }
       
   640 	        
   604 	        if ( (err == KErrNotFound || err == KErrAccessDenied) && 
   641 	        if ( (err == KErrNotFound || err == KErrAccessDenied) && 
   605 	            !(params.iFlags& CThumbnailManager::EDoNotCreate) )
   642 	            !(params.iFlags& CThumbnailManager::EDoNotCreate) )
   606 	            {
   643 	            {
   607 	            // Special error code so that the client side can open the file
   644 	            // Special error code so that the client side can open the file
   608 	            // and retry the request using file handle
   645 	            // and retry the request using file handle
   609 	            err = KThumbnailErrThumbnailNotFound;
   646 	            err = KThumbnailErrThumbnailNotFound;
   610 	            }
   647 	            }
   611 	        else
       
   612 	            {
       
   613                 User::Leave(err);
       
   614                 }
       
   615 	        
       
   616 	        if(Server()->StoreForPathL(params.iFileName)->IsDiskFull())
       
   617 	            {
       
   618 	            User::Leave( KErrDiskFull );
       
   619 	            }
       
   620 
   648 
   621             User::Leave(err);
   649             User::Leave(err);
   622 	        }   
   650 	        }   
   623 	   }
   651 	   }
   624     
   652     
   639         }
   667         }
   640       
   668       
   641     aMessage.ReadL( 0, iRequestParams );
   669     aMessage.ReadL( 0, iRequestParams );
   642     const TThumbnailRequestParams& params = iRequestParams();
   670     const TThumbnailRequestParams& params = iRequestParams();
   643     
   671     
   644     if(params.iThumbnailSize != EUnknownThumbnailSize)
   672     // delete existing
       
   673     if(params.iOverwrite)
   645         {
   674         {
   646         Server()->DeleteThumbnailsL( params.iTargetUri);
   675         Server()->DeleteThumbnailsL( params.iTargetUri);
   647         }
   676         }
   648     
   677     
   649     if(params.iThumbnailSize == EFullScreenThumbnailSize ||
   678     // if only one size
   650        params.iThumbnailSize == EGridThumbnailSize ||
   679     if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0)
   651        params.iThumbnailSize == EListThumbnailSize )
   680         {
   652        {
   681         if(params.iThumbnailSize == EFullScreenThumbnailSize ||
   653        TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   682            params.iThumbnailSize == EGridThumbnailSize ||
   654        TDataType mimetype;
   683            params.iThumbnailSize == EListThumbnailSize )
   655        TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
   656 	   
       
   657        if( ret == KErrNone )
       
   658            {
   684            {
   659            sourceType = Server()->SourceTypeFromMimeType( mimetype );   
   685            TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   660            ModifyThumbnailSize(sourceType);
   686            TDataType mimetype;
       
   687            TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
   688            
       
   689            if( ret == KErrNone )
       
   690                {
       
   691                sourceType = Server()->SourceTypeFromMimeType( mimetype );   
       
   692                ModifyThumbnailSize(sourceType);
       
   693                }
       
   694            User::LeaveIfError( ret );
   661            }
   695            }
   662        User::LeaveIfError( ret );
   696         }
   663        }
       
   664     
   697     
   665     TInt bufferSize = aMessage.Int2();
   698     TInt bufferSize = aMessage.Int2();
   666     HBufC8* buffer = HBufC8::NewMaxLC( bufferSize );
   699     HBufC8* buffer = HBufC8::NewMaxLC( bufferSize );
   667     TPtr8 ptr = buffer->Des();
   700     TPtr8 ptr = buffer->Des();
   668     aMessage.ReadL( 1 /* buffer pointer */, ptr );
   701     aMessage.ReadL( 1 /* buffer pointer */, ptr );
   682         }
   715         }
   683         
   716         
   684     aMessage.ReadL( 0, iRequestParams );
   717     aMessage.ReadL( 0, iRequestParams );
   685     const TThumbnailRequestParams& params = iRequestParams();
   718     const TThumbnailRequestParams& params = iRequestParams();
   686     
   719     
       
   720     const TThumbnailServerRequestId reqId( this, params.iRequestId );
       
   721     
       
   722     // delete existing
       
   723     if(params.iOverwrite)
       
   724         {
       
   725         Server()->DeleteThumbnailsL( params.iTargetUri);
       
   726         }
       
   727     
       
   728     // if only one size
       
   729     if ((params.iControlFlags & EThumbnailGeneratePersistentSizesOnly) == 0)
       
   730         {
       
   731         if(params.iThumbnailSize == EFullScreenThumbnailSize ||
       
   732            params.iThumbnailSize == EGridThumbnailSize ||
       
   733            params.iThumbnailSize == EListThumbnailSize )
       
   734            {
       
   735            TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
       
   736            TDataType mimetype;
       
   737            TInt ret = Server()->MimeTypeFromFileExt( params.iTargetUri, mimetype );
       
   738            
       
   739            if( ret == KErrNone )
       
   740                {
       
   741                sourceType = Server()->SourceTypeFromMimeType( mimetype );   
       
   742                ModifyThumbnailSize(sourceType);
       
   743                }
       
   744            User::LeaveIfError( ret );
       
   745            }
       
   746         }
       
   747     
   687     TInt bitmapHandle = aMessage.Int1();
   748     TInt bitmapHandle = aMessage.Int1();
   688     TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId;
       
   689     
   749     
   690     // get bitmap
   750     // get bitmap
   691     CFbsBitmap* bitmap = new( ELeave )CFbsBitmap();
   751     CFbsBitmap* bitmap = new( ELeave )CFbsBitmap();
   692     CleanupStack::PushL( bitmap );
   752     CleanupStack::PushL( bitmap );
   693     User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) );
   753     User::LeaveIfError( bitmap->Duplicate( bitmapHandle ) );
   694     
   754 
   695     // use pool to prevent bitmap leak
   755     // use pool to prevent bitmap leak
   696     // this bitmap is shared to several scale tasks, one of which can Leave
   756     // this bitmap is shared to several scale tasks, one of which can Leave
   697     Server()->AddBitmapToPoolL( reqId.iSession, bitmap, reqId );
   757     Server()->AddBitmapToPoolL( this, bitmap, reqId );
   698     
   758     
   699     CleanupStack::Pop( bitmap );
   759     CleanupStack::Pop( bitmap );
   700     iBitmapHandle = bitmap->Handle();
   760     iBitmapHandle = bitmap->Handle();
   701     
   761     
   702     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
   762     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
   753         
   813         
   754             CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(),
   814             CThumbnailScaleTask* scaleTask = CThumbnailScaleTask::NewL( Server()->Processor(),
   755                     *Server(), params.iTargetUri, bitmap, bitmapSize,
   815                     *Server(), params.iTargetUri, bitmap, bitmapSize,
   756                     (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode,
   816                     (*missingSizes)[i].iSize, (*missingSizes)[i].iCrop, params.iDisplayMode,
   757                     KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse,
   817                     KMaxPriority, KNullDesC, (*missingSizes)[i].iType, params.iModified, EFalse, EFalse,
   758                     reqId);
   818                     reqId, params.iVirtualUri);
       
   819             
   759             CleanupStack::PushL( scaleTask );
   820             CleanupStack::PushL( scaleTask );
   760             scaleTask->SetDoStore( ETrue );
   821             scaleTask->SetDoStore( ETrue );
   761             Server()->Processor().AddTaskL( scaleTask );
   822             Server()->Processor().AddTaskL( scaleTask );
   762             CleanupStack::Pop( scaleTask );
   823             CleanupStack::Pop( scaleTask );
   763         
   824         
   764             // completion to first task, because task processor works like stack
   825             // completion to first task, because task processor works like stack
   765             if( i == 0 )
   826             if( i == 0 )
   766                 {
   827                 {            
   767                 // scaleTask is now responsible for completing the RMessage
   828                 // scaleTask is now responsible for completing the RMessage
   768                 scaleTask->SetMessageData( reqId, iMessage, iClientThread );
   829                 scaleTask->SetMessageData( reqId, iMessage, iClientThread );
   769                 iMessage = RMessage2();
   830                 iMessage = RMessage2();
   770                 }
   831                 }
   771             }
   832             }
   795 // Create a task to generate a new thumbnail
   856 // Create a task to generate a new thumbnail
   796 // -----------------------------------------------------------------------------
   857 // -----------------------------------------------------------------------------
   797 //
   858 //
   798 void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile)
   859 void CThumbnailServerSession::CreateGenerateTaskFromFileHandleL( RFile64* aFile)
   799     {
   860     {
   800     const TThumbnailRequestParams& params = iRequestParams();
   861     TThumbnailRequestParams& params = iRequestParams();
   801 
   862 
   802     TN_DEBUG2( 
   863     TN_DEBUG2( 
   803         "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", &params.iFileName );
   864         "CThumbnailServerSession::CreateGenerateTaskFromFileHandleL() -- create thumbnail generation task for %S", &params.iFileName );
   804     
   865     
   805     if(Server()->StoreForPathL(params.iFileName)->IsDiskFull())
   866     // disk space check only for stored sizes
       
   867     if ( params.iImport && 
       
   868          Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() )
       
   869         {
       
   870         User::Leave( KErrDiskFull );
       
   871         }
       
   872     else if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
   873          Server()->StoreForPathL(params.iFileName)->IsDiskFull() )
   806         {
   874         {
   807         User::Leave( KErrDiskFull );
   875         User::Leave( KErrDiskFull );
   808         }
   876         }
   809     
   877     
   810     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
   878     RArray < TThumbnailPersistentSize >* missingSizes = NULL;
   815         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   883         TInt sourceType = TThumbnailPersistentSize::EUnknownSourceType;
   816         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
   884         sourceType = Server()->SourceTypeFromMimeType( params.iMimeType );
   817         missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
   885         missingSizes = new (ELeave) RArray < TThumbnailPersistentSize >;
   818         CleanupClosePushL( *missingSizes );
   886         CleanupClosePushL( *missingSizes );
   819 		
   887 		
   820 		    
       
   821 	    TBool gridSizeOnly(EFalse);
   888 	    TBool gridSizeOnly(EFalse);
   822             
   889             
   823 	    if ( params.iQualityPreference == CThumbnailManager
   890 	    if ( params.iQualityPreference == CThumbnailManager::EOptimizeForQualityWithPreview )
   824 	                    ::EOptimizeForQualityWithPreview )
       
   825 	        {
   891 	        {
   826 	        gridSizeOnly = ETrue;
   892 	        gridSizeOnly = ETrue;
   827 	        }
   893 	        }
   828         
   894         
   829         Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly);
   895 	    // import vs. normal
       
   896 	    if(params.iImport)
       
   897 	        {
       
   898             Server()->GetMissingSizesL( params.iTargetUri, sourceType, *missingSizes, gridSizeOnly);
       
   899 	        }
       
   900 	    else
       
   901 	        {
       
   902             Server()->GetMissingSizesL( params.iFileName, sourceType, *missingSizes, gridSizeOnly);
       
   903 	        }     
   830         
   904         
   831         if ( missingSizes->Count() == 0)
   905         if ( missingSizes->Count() == 0)
   832             {
   906             {
   833             // all thumbs already exist
   907             // all thumbs already exist
   834             CleanupStack::PopAndDestroy( missingSizes );
   908             CleanupStack::PopAndDestroy( missingSizes );
   838                aFile->Close();
   912                aFile->Close();
   839                }
   913                }
   840             return;
   914             return;
   841             }            
   915             }            
   842         }
   916         }
       
   917     // creating single TN on demand
       
   918     else if( params.iThumbnailSize > ECustomThumbnailSize && params.iThumbnailSize  < EThumbnailSizeCount)
       
   919         {
       
   920         TThumbnailPersistentSize persistentSize = Server()->PersistentSizeL(params.iThumbnailSize);
       
   921         
       
   922         if(persistentSize.iCrop)
       
   923             {
       
   924             params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags | CThumbnailManager::ECropToAspectRatio);
       
   925             }
       
   926         else
       
   927             {
       
   928             params.iFlags = ( CThumbnailManager::TThumbnailFlags ) (params.iFlags & CThumbnailManager::ECropToAspectRatio);
       
   929             }
       
   930         
       
   931         if( ClientThreadAlive() )
       
   932             {
       
   933             iMessage.Write( 0, iRequestParams );
       
   934             }
       
   935         }
   843     
   936     
   844     // priority
   937     // priority
   845     TInt priority = params.iPriority;
   938     TInt priority = params.iPriority;
   846     if ( priority > KMaxGeneratePriority )
   939     if ( priority > KMaxGeneratePriority )
   847         {
   940         {
   856         }
   949         }
   857     CleanupClosePushL( *aFile );
   950     CleanupClosePushL( *aFile );
   858     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
   951     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
   859         ->Processor(), * Server(), aFile, NULL, &params.iMimeType, params.iFlags,
   952         ->Processor(), * Server(), aFile, NULL, &params.iMimeType, params.iFlags,
   860         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
   953         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
   861         params.iThumbnailSize, params.iModified, params.iQualityPreference );
   954         params.iThumbnailSize, params.iModified, params.iQualityPreference,
       
   955         params.iVirtualUri);
   862 
   956 
   863     // do not store bitmaps to server pool when generating only
   957     // do not store bitmaps to server pool when generating only
   864     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
   958     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
   865         {
   959         {
   866         task->ScaledBitmapToPool( EFalse );
   960         task->ScaledBitmapToPool( EFalse );
   879         }
   973         }
   880 
   974 
   881     // Generate task is now responsible for completing the message
   975     // Generate task is now responsible for completing the message
   882     iMessage = RMessage2();
   976     iMessage = RMessage2();
   883     } 
   977     } 
       
   978 
   884 // -----------------------------------------------------------------------------
   979 // -----------------------------------------------------------------------------
   885 // CThumbnailServerSession::CreateGenerateTaskL()
   980 // CThumbnailServerSession::CreateGenerateTaskL()
   886 // Create a task to generate a new thumbnail
   981 // Create a task to generate a new thumbnail
   887 // -----------------------------------------------------------------------------
   982 // -----------------------------------------------------------------------------
   888 //
   983 //
   891     const TThumbnailRequestParams& params = iRequestParams();
   986     const TThumbnailRequestParams& params = iRequestParams();
   892 
   987 
   893     TN_DEBUG2( 
   988     TN_DEBUG2( 
   894         "CThumbnailServerSession::CreateGenerateTaskFromBufferL() -- create thumbnail generation task for %S", &params.iTargetUri );
   989         "CThumbnailServerSession::CreateGenerateTaskFromBufferL() -- create thumbnail generation task for %S", &params.iTargetUri );
   895   
   990   
   896     if(Server()->StoreForPathL(params.iTargetUri)->IsDiskFull())
   991     // disk space check only for stored sizes
       
   992     if ( params.iThumbnailSize != ECustomThumbnailSize && 
       
   993          Server()->StoreForPathL(params.iTargetUri)->IsDiskFull() )
   897         {
   994         {
   898         User::Leave( KErrDiskFull );
   995         User::Leave( KErrDiskFull );
   899         }
   996         }
   900     
   997     
   901     if(aBuffer && params.iMimeType.Des().Match( KVideoMime ) == 0 )
   998     if(aBuffer && params.iMimeType.Des().Match( KVideoMime ) == 0 )
   965         }
  1062         }
   966     
  1063     
   967     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
  1064     CThumbnailGenerateTask* task = new( ELeave )CThumbnailGenerateTask( Server()
   968         ->Processor(), * Server(), NULL, aBuffer, &params.iMimeType, params.iFlags,
  1065         ->Processor(), * Server(), NULL, aBuffer, &params.iMimeType, params.iFlags,
   969         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
  1066         params.iSize, params.iDisplayMode, priority, missingSizes, params.iTargetUri,
   970         params.iThumbnailSize, params.iModified, params.iQualityPreference );
  1067         params.iThumbnailSize, params.iModified, params.iQualityPreference,
       
  1068         params.iVirtualUri);
   971 
  1069 
   972     // do not store bitmaps to server pool when generating only
  1070     // do not store bitmaps to server pool when generating only
   973     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
  1071     if( params.iControlFlags & EThumbnailGeneratePersistentSizesOnly )
   974         {
  1072         {
   975         task->ScaledBitmapToPool( EFalse );
  1073         task->ScaledBitmapToPool( EFalse );
  1038 // -----------------------------------------------------------------------------
  1136 // -----------------------------------------------------------------------------
  1039 //
  1137 //
  1040 void CThumbnailServerSession::ProcessBitmapL()
  1138 void CThumbnailServerSession::ProcessBitmapL()
  1041     {   
  1139     {   
  1042     TThumbnailRequestParams& params = iRequestParams();
  1140     TThumbnailRequestParams& params = iRequestParams();
  1043     
       
  1044     // in import case store bitmap
       
  1045     if ( params.iTargetUri != KNullDesC && params.iFileName != KNullDesC &&
       
  1046          params.iFileName.CompareF(params.iTargetUri) != 0 )
       
  1047         {
       
  1048         Server()->StoreThumbnailL( params.iTargetUri, iBitmap, iOriginalSize,
       
  1049                                    params.iFlags& CThumbnailManager::ECropToAspectRatio,
       
  1050                                    params.iThumbnailSize, params.iModified,
       
  1051                                    EFalse, EFalse);
       
  1052         }
       
  1053     
  1141     
  1054     if ( ClientThreadAlive() )
  1142     if ( ClientThreadAlive() )
  1055         {        
  1143         {        
  1056         TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle());
  1144         TN_DEBUG2("CThumbnailServerSession::ProcessBitmapL(), iBitmap handle= 0x%08x", iBitmap->Handle());
  1057         
  1145         
  1070 
  1158 
  1071         iMessage.WriteL( 0, iRequestParams );
  1159         iMessage.WriteL( 0, iRequestParams );
  1072         
  1160         
  1073         TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool");
  1161         TN_DEBUG1("CThumbnailServerSession()::ProcessBitmapL() bitmap to pool");
  1074         
  1162         
  1075         TThumbnailServerRequestId &reqId = (TThumbnailServerRequestId&)params.iRequestId;
  1163         Server()->AddBitmapToPoolL( this, iBitmap, TThumbnailServerRequestId( this, params.iRequestId ) );
  1076         Server()->AddBitmapToPoolL( this, iBitmap, reqId );
       
  1077         
  1164         
  1078         iMessage.Complete( KErrNone );
  1165         iMessage.Complete( KErrNone );
  1079         iMessage = RMessage2();
  1166         iMessage = RMessage2();
  1080         
  1167         
  1081         iBitmap = NULL; // owned by server now
  1168         iBitmap = NULL; // owned by server now
  1173     
  1260     
  1174     // read message params
  1261     // read message params
  1175     aMessage.ReadL( 0, iRequestParams );
  1262     aMessage.ReadL( 0, iRequestParams );
  1176     const TThumbnailRequestParams& params = iRequestParams();
  1263     const TThumbnailRequestParams& params = iRequestParams();
  1177     
  1264     
  1178     
       
  1179 #ifdef RD_MDS_2_5        
  1265 #ifdef RD_MDS_2_5        
  1180     // try to query path from MDS
  1266     // try to query path from MDS
  1181     CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask(
  1267     CThumbnailMDSQueryTask* task = new( ELeave )CThumbnailMDSQueryTask(
  1182             Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server());
  1268             Server()->Processor(), params.iPriority + 1, Server()->GetMdESession(), *Server());
  1183     
  1269     
  1184     CleanupStack::PushL( task );
  1270     CleanupStack::PushL( task );
  1185     task->QueryPathByIdL(params.iThumbnailId, ETrue);
  1271     task->QueryPathByIdL(params.iThumbnailId, ETrue);
       
  1272     task->SetMessageData( TThumbnailServerRequestId( this, params.iRequestId ) );
  1186     Server()->QueueTaskL( task );
  1273     Server()->QueueTaskL( task );
  1187     CleanupStack::Pop( task ); // owned by processor now
  1274     CleanupStack::Pop( task ); // owned by processor now
  1188 #endif // RD_MDS_2_5
  1275 #endif // RD_MDS_2_5
       
  1276     
  1189     aMessage.Complete( KErrNone );
  1277     aMessage.Complete( KErrNone );
  1190     iMessage = RMessage2();
  1278     iMessage = RMessage2();
  1191     }
  1279     }
  1192 
  1280 
  1193 // -----------------------------------------------------------------------------
  1281 // -----------------------------------------------------------------------------
  1194 // Get the required size (in characters) for a buffer that contains the
  1282 // Get the required size (in characters) for a buffer that contains the
  1195 // list of supported MIME types
  1283 // list of supported MIME types
  1196 // -----------------------------------------------------------------------------
  1284 // -----------------------------------------------------------------------------
  1197 //
  1285 //
  1198 void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage
  1286 void CThumbnailServerSession::GetMimeTypeBufferSizeL( const RMessage2& aMessage )
  1199     )
       
  1200     {
  1287     {
  1201     TPckgBuf < TInt > buf;
  1288     TPckgBuf < TInt > buf;
  1202     buf() = Server()->GetMimeTypeBufferSize();
  1289     buf() = Server()->GetMimeTypeBufferSize();
  1203     aMessage.WriteL( 0, buf );
  1290     aMessage.WriteL( 0, buf );
  1204     }
  1291     }
  1270            else if(params.iThumbnailSize == EListThumbnailSize)
  1357            else if(params.iThumbnailSize == EListThumbnailSize)
  1271                {
  1358                {
  1272                params.iThumbnailSize = EAudioListThumbnailSize;
  1359                params.iThumbnailSize = EAudioListThumbnailSize;
  1273                }       
  1360                }       
  1274            }
  1361            }
       
  1362     else if(aSourceType == TThumbnailPersistentSize::EContact)
       
  1363            {
       
  1364            if(params.iThumbnailSize == EFullScreenThumbnailSize)
       
  1365                {
       
  1366                params.iThumbnailSize = EContactFullScreenThumbnailSize;
       
  1367                }
       
  1368            else if(params.iThumbnailSize == EGridThumbnailSize)
       
  1369                {
       
  1370                params.iThumbnailSize = EContactGridThumbnailSize;
       
  1371                }
       
  1372            else if(params.iThumbnailSize == EListThumbnailSize)
       
  1373                {
       
  1374                params.iThumbnailSize = EContactListThumbnailSize;
       
  1375                }       
       
  1376            }
  1275     }
  1377     }
  1276 
  1378 
  1277 //------------------------------------------------------------------------
  1379 //------------------------------------------------------------------------
  1278 // CThumbnailServerSession::ModifyThumbnailSize
  1380 // CThumbnailServerSession::ModifyThumbnailSize
  1279 // ---------------------------------------------------------------------------
  1381 // ---------------------------------------------------------------------------
  1283     TThumbnailRequestParams& params = iRequestParams();
  1385     TThumbnailRequestParams& params = iRequestParams();
  1284     TInt res = 0;
  1386     TInt res = 0;
  1285         
  1387         
  1286     // mime type
  1388     // mime type
  1287     if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) )
  1389     if ( params.iMimeType.Des8() == KNullDesC8 && !Server()->SupportedMimeType(params.iMimeType) )
  1288        {
  1390         {
  1289        // try parsing from file extension
  1391         // try parsing from file extension
  1290        res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType );
  1392         if (params.iImport)
  1291        if ( res == KErrNotFound )
  1393             {
  1292            {
  1394             res = Server()->MimeTypeFromFileExt( params.iTargetUri, params.iMimeType );
  1293           if( aFile )
  1395             }
  1294              {
  1396         else
  1295              // parsed type not in the list, resolve from file
  1397             {
  1296              params.iMimeType = Server()->ResolveMimeTypeL(*aFile);
  1398             res = Server()->MimeTypeFromFileExt( params.iFileName, params.iMimeType );
  1297              }
  1399             }
  1298           else
  1400         
  1299              {
  1401         if ( res == KErrNotFound )
  1300              Server()->Fs().ShareProtected();
  1402             {
  1301              RFile64 file;
  1403             if( aFile )
  1302              CleanupClosePushL( file );
  1404                 {
  1303              
  1405                 // parsed type not in the list, resolve from file
  1304              User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); 
  1406                 params.iMimeType = Server()->ResolveMimeTypeL(*aFile);
  1305              TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", &params.iFileName );
  1407                 }
  1306              
  1408             else
  1307              params.iMimeType = Server()->ResolveMimeTypeL(file);
  1409                 {
  1308              
  1410                 Server()->Fs().ShareProtected();
  1309              file.Close();
  1411                 RFile64 file;
  1310              TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed");
  1412                 CleanupClosePushL( file );
  1311              
  1413               
  1312              CleanupStack::Pop( &file );    
  1414                 User::LeaveIfError( file.Open( Server()->Fs(), params.iFileName, EFileShareReadersOrWriters )); 
  1313              }    
  1415                 TN_DEBUG2( "CThumbnailServerSession::ResolveMimeType - file handle opened for %S", &params.iFileName );
  1314           }        
  1416               
  1315        }      
  1417                 params.iMimeType = Server()->ResolveMimeTypeL(file);
       
  1418               
       
  1419                 file.Close();
       
  1420                 TN_DEBUG1("CThumbnailServerSession::ResolveMimeType - file handle closed");
       
  1421               
       
  1422                 CleanupStack::Pop( &file );    
       
  1423                 }    
       
  1424             }        
       
  1425         }       
  1316     }
  1426     }
  1317 
  1427 
  1318 
  1428 
  1319 // ---------------------------------------------------------------------------
  1429 // ---------------------------------------------------------------------------
  1320 // RThumbnailMessage::FilterSqlErr
  1430 // RThumbnailMessage::FilterSqlErr
  1321 // ---------------------------------------------------------------------------
  1431 // ---------------------------------------------------------------------------
  1322 //
  1432 //
  1323 TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason )
  1433 TInt CThumbnailServerSession::ConvertSqlErrToE32Err( TInt aReason )
  1324     {
  1434     {
  1325     TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason);
  1435     TN_DEBUG2("CThumbnailServerSession::ConvertSqlErrToE32Err(%d)", aReason);
  1326     TInt e32Err;
  1436     TInt e32Err(aReason);
       
  1437 	
  1327     if ( aReason >=  - 144 )
  1438     if ( aReason >=  - 144 )
  1328     // magic: [-1..-144] is E32 error range 
  1439     // magic: [-1..-144] is E32 error range 
  1329         {
  1440         {
  1330         // E32 error value or non-negative value
  1441         // E32 error value or non-negative value
  1331         e32Err = aReason;
  1442         switch ( aReason )
       
  1443             {
       
  1444             case KErrServerTerminated:
       
  1445                 e32Err = KErrCorrupt;
       
  1446                 break;
       
  1447             default:
       
  1448                 e32Err = aReason;
       
  1449             }
  1332         }
  1450         }
  1333     else
  1451     else
  1334         {
  1452         {
  1335         switch ( aReason )
  1453         switch ( aReason )
  1336             {
  1454             {
  1443         TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null");       
  1561         TN_DEBUG1( "CThumbnailServerSession::ClientThreadAlive() - message null");       
  1444         return EFalse;
  1562         return EFalse;
  1445         }
  1563         }
  1446     }
  1564     }
  1447 
  1565 
       
  1566 
  1448 // End of file
  1567 // End of file