imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp
changeset 0 2014ca87e772
child 1 235a7fc86938
equal deleted inserted replaced
-1:000000000000 0:2014ca87e772
       
     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:  Active object for an asynchronous thumbnail request
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32base.h>
       
    20 #include <hal.h>
       
    21 #include <hal_data.h>
       
    22 #include <apmstd.h>
       
    23 
       
    24 #include "thumbnailrequestactive.h"
       
    25 #include "thumbnailrequestqueue.h"
       
    26 #include "thumbnailsession.h"
       
    27 #include "thumbnailmanagerobserver.h"
       
    28 #include "thumbnailmanagerconstants.h"
       
    29 #include "thumbnaildataimpl.h"
       
    30 #include "thumbnailpanic.h"
       
    31 #include "thumbnaillog.h"
       
    32 
       
    33 #include "thumbnailmanagerimpl.h"
       
    34 
       
    35 // ======== MEMBER FUNCTIONS ========
       
    36 
       
    37 // ---------------------------------------------------------------------------
       
    38 // CThumbnailRequestActive::~CThumbnailRequestActive()
       
    39 // Destructor.
       
    40 // ---------------------------------------------------------------------------
       
    41 //
       
    42 CThumbnailRequestActive::~CThumbnailRequestActive()
       
    43     {
       
    44     Cancel();
       
    45     
       
    46     if(iTimer)
       
    47         {
       
    48         iTimer->Cancel();
       
    49         }
       
    50     delete iTimer;
       
    51     
       
    52     ReleaseServerBitmap();
       
    53     delete iCallbackThumbnail;
       
    54     delete iParams.iBuffer;
       
    55     delete iBitmap;
       
    56     iFile.Close();
       
    57     iMyFileHandle.Close();
       
    58     }
       
    59 
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // CThumbnailRequestActive::NewL
       
    63 // Two-phased constructor.
       
    64 // ---------------------------------------------------------------------------
       
    65 //
       
    66 CThumbnailRequestActive* CThumbnailRequestActive::NewL( RFs& aFs,
       
    67     RThumbnailSession& aThumbnailSession, MThumbnailManagerObserver& aObserver,
       
    68     TThumbnailRequestId aId, TInt aPriority, CThumbnailRequestQueue* aQueue )
       
    69     {
       
    70     CThumbnailRequestActive* self = new( ELeave )CThumbnailRequestActive( aFs,
       
    71         aThumbnailSession, aObserver, aId, aPriority, aQueue );
       
    72     CleanupStack::PushL( self );
       
    73     self->ConstructL();
       
    74     CleanupStack::Pop( self );
       
    75     return self;
       
    76     }
       
    77 
       
    78 
       
    79 // ---------------------------------------------------------------------------
       
    80 // CThumbnailRequestActive::CThumbnailRequestActive()
       
    81 // C++ default constructor can NOT contain any code, that might leave.
       
    82 // ---------------------------------------------------------------------------
       
    83 //
       
    84 CThumbnailRequestActive::CThumbnailRequestActive( RFs& aFs, RThumbnailSession&
       
    85     aThumbnailSession, MThumbnailManagerObserver& aObserver,
       
    86     TThumbnailRequestId aId, TInt aPriority, CThumbnailRequestQueue* aQueue ):
       
    87     CActive( aPriority ), iSession( aThumbnailSession ), iParamsPckg( iParams ),
       
    88     iObserver( aObserver ), iFs( aFs ), iBitmapHandle( 0 ), iRequestId( aId ), 
       
    89     iRequestQueue( aQueue )
       
    90     {
       
    91     CActiveScheduler::Add( this );
       
    92     TN_DEBUG2( "CThumbnaiRequestActive::CThumbnailRequestActive() AO's priority = %d", Priority());
       
    93     
       
    94     iBitmap = NULL;
       
    95     iRequestCompleted = EFalse;
       
    96     }
       
    97 
       
    98 
       
    99 // ---------------------------------------------------------------------------
       
   100 // CThumbnailRequestActive::ConstructL()
       
   101 // Symbian 2nd phase constructor can leave.
       
   102 // ---------------------------------------------------------------------------
       
   103 //
       
   104 void CThumbnailRequestActive::ConstructL()
       
   105     {
       
   106     iCallbackThumbnail = new( ELeave )CThumbnailDataImpl();
       
   107 
       
   108     iTimer = CPeriodic::NewL(CActive::EPriorityIdle);
       
   109     
       
   110 #ifdef _DEBUG
       
   111     iStartExecTime.UniversalTime();
       
   112 #endif
       
   113     }
       
   114 
       
   115 
       
   116 // ---------------------------------------------------------------------------
       
   117 // CThumbnailRequestActive::StartL()
       
   118 // Start active request.
       
   119 // ---------------------------------------------------------------------------
       
   120 //
       
   121 void CThumbnailRequestActive::StartL()
       
   122     {
       
   123     TN_DEBUG3( "CThumbnailRequestActive::StartL(0x%08x) reqid = %d", this, iRequestId );
       
   124     
       
   125     iRequestActive = ETrue;
       
   126 
       
   127 #ifdef _DEBUG
       
   128     TTime stop;
       
   129     stop.UniversalTime();
       
   130     TN_DEBUG3( "CThumbnailRequestActive::StartL() req id = %d, queuing time %d ms",
       
   131                iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
       
   132 #endif
       
   133     
       
   134     switch (iRequestType)
       
   135         {
       
   136         case EReqGetThumbnailHandle:
       
   137             {
       
   138             iSession.RequestThumbnailL( iFile, iTargetUri, iParamsPckg, iStatus );
       
   139             break;
       
   140             }        
       
   141         case EReqGetThumbnailPath:
       
   142             {
       
   143             iSession.RequestThumbnailL( iPath, iTargetUri, iParams.iThumbnailId, 
       
   144                                         iParamsPckg, iStatus );
       
   145             break;
       
   146             }  
       
   147         case EReqSetThumbnailBuffer:
       
   148             {
       
   149             iSession.RequestSetThumbnailL( iParams.iBuffer, iTargetUri, iParamsPckg, iStatus );
       
   150             break;
       
   151             }  
       
   152         case EReqSetThumbnailBitmap:
       
   153             {
       
   154             iSession.RequestSetThumbnailL( iBitmap->Handle(), iTargetUri, iParamsPckg, iStatus );
       
   155             break;
       
   156             }  
       
   157         case EReqUpdateThumbnails:
       
   158             {
       
   159             iSession.UpdateThumbnails( iPath, iOrientation, iModified, iParamsPckg, iStatus );
       
   160             break;
       
   161             }       
       
   162         case EReqGetThumbnailHandleLater:
       
   163             {
       
   164             // open file handle
       
   165             User::LeaveIfError( iFile.Open( iFs, iTargetUri, EFileShareReadersOrWriters ) );  
       
   166             
       
   167             TN_DEBUG2( "CThumbnailRequestActive::StartL() - file handle opened for %S", &iTargetUri );
       
   168             
       
   169             CleanupClosePushL( iFile );
       
   170             iSession.RequestThumbnailL( iFile, iTargetUri, iParamsPckg, iStatus );
       
   171             CleanupStack::PopAndDestroy( &iFile );
       
   172             break;
       
   173             }  
       
   174         case EReqDeleteThumbnails:
       
   175             {
       
   176             // by path
       
   177             if (iPath != KNullDesC)
       
   178                 {
       
   179                 iSession.DeleteThumbnails( iPath, iParamsPckg, iStatus );
       
   180                 }
       
   181             // by id
       
   182             else
       
   183                 {
       
   184                 iSession.DeleteThumbnails( iParams.iThumbnailId, iParamsPckg, iStatus );
       
   185                 }
       
   186             break;
       
   187             } 
       
   188         default:
       
   189             {
       
   190             break;
       
   191             }
       
   192         }
       
   193     
       
   194     iTimer->Start( KClientRequestTimeout, KClientRequestTimeout, 
       
   195                    TCallBack(TimerCallBack, this));
       
   196     SetActive();
       
   197     }
       
   198 
       
   199 
       
   200 // ---------------------------------------------------------------------------
       
   201 // CThumbnailRequestActive::RunL()
       
   202 // ---------------------------------------------------------------------------
       
   203 //
       
   204 void CThumbnailRequestActive::RunL()
       
   205     {
       
   206     TN_DEBUG1( "CThumbnaiRequestActive::RunL()" );
       
   207     
       
   208     if ( iParams.iControlFlags == EThumbnailPreviewThumbnail )
       
   209         {
       
   210         iRequestCompleted = EFalse;
       
   211 		iProcessingPreview = ETrue;
       
   212         }
       
   213     else
       
   214         {
       
   215         iRequestCompleted = ETrue;
       
   216         }
       
   217     
       
   218     iTimer->Cancel();
       
   219     
       
   220     if (iRequestType == EReqDeleteThumbnails)
       
   221         {
       
   222         // no action for delete
       
   223         iRequestQueue->RequestComplete(this);
       
   224         
       
   225 #ifdef _DEBUG
       
   226     TTime stop;
       
   227     stop.UniversalTime();
       
   228     TN_DEBUG3( "CThumbnailRequestActive::RunL() total execution time of req %d is %d ms",
       
   229                 iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
       
   230 #endif
       
   231         }
       
   232     else if ( iStatus.Int() == KThumbnailErrThumbnailNotFound && iParams.iFileName.Length() && 
       
   233          !( iParams.iFlags& CThumbnailManager::EDoNotCreate ))
       
   234         {
       
   235         TN_DEBUG1( "CThumbnaiRequestActive::RunL() - no thumbnail found - lets try with file handle" );
       
   236         iRequestCompleted = EFalse;
       
   237         
       
   238         // We tried to get thumbnail using file path, but it was not found in
       
   239         // the database. We need to open the file now (on the client side) and
       
   240         // use file handle.
       
   241         User::LeaveIfError( iFile.Open( iFs, iParams.iFileName, EFileShareReadersOrWriters ));
       
   242         CleanupClosePushL( iFile );
       
   243         
       
   244         TN_DEBUG2( "CThumbnaiRequestActive::RunL() - file handle opened for %S", &iParams.iFileName );
       
   245         
       
   246         iSession.RequestThumbnailL( iFile, iParams.iTargetUri, iParamsPckg, iStatus );
       
   247         CleanupStack::PopAndDestroy( &iFile );
       
   248         
       
   249         iTimer->Start( KClientRequestTimeout, KClientRequestTimeout, 
       
   250                            TCallBack(TimerCallBack, this));
       
   251         SetActive();
       
   252         }
       
   253     else if ( iStatus.Int())
       
   254         {
       
   255         TN_DEBUG2( "CThumbnaiRequestActive::RunL() - error (%d) occured", iStatus.Int() );
       
   256         // An error occurred
       
   257         iError = iStatus.Int();
       
   258         HandleError();
       
   259         }
       
   260     else if (iParams.iControlFlags == EThumbnailGeneratePersistentSizesOnly)
       
   261 	    {
       
   262 	    TN_DEBUG1( "CThumbnaiRequestActive::RunL()- generate persistent sizes" );
       
   263 	    iBitmapHandle = iParams.iBitmapHandle;
       
   264 	    
       
   265 	    TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
       
   266 	    iObserver.ThumbnailReady( iStatus.Int(), *iCallbackThumbnail, iParams.iRequestId );
       
   267 	  
       
   268 	    ReleaseServerBitmap();
       
   269 	    iRequestQueue->RequestComplete(this);
       
   270 	    
       
   271 #ifdef _DEBUG
       
   272     TTime stop;
       
   273     stop.UniversalTime();
       
   274     TN_DEBUG3( "CThumbnailRequestActive::RunL() total execution time %d, %d ms",
       
   275                iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
       
   276 #endif
       
   277 	    }
       
   278     else
       
   279         {
       
   280         TN_DEBUG1( "CThumbnaiRequestActive::RunL() - succesful" );
       
   281         
       
   282         // Success
       
   283         iBitmapHandle = iParams.iBitmapHandle;
       
   284         CFbsBitmap* bitmap = new( ELeave )CFbsBitmap();
       
   285         CleanupStack::PushL( bitmap );
       
   286         User::LeaveIfError( bitmap->Duplicate( iBitmapHandle ));
       
   287         CleanupStack::Pop( bitmap );
       
   288 		
       
   289 		// reduce bpp value (displaymode to match reqested bits per pixel)
       
   290 		#ifdef _DEBUG
       
   291         TN_DEBUG2( "CThumbnaiRequestActive::RunL() - displaymode is %d", bitmap->DisplayMode());
       
   292 		#endif
       
   293         
       
   294         if( bitmap->DisplayMode() > iParams.iDisplayMode )
       
   295             {
       
   296             bitmap->SetDisplayMode( iParams.iDisplayMode );
       
   297 			#ifdef _DEBUG
       
   298             TN_DEBUG2( "CThumbnaiRequestActive::RunL() - displaymode is now %d", bitmap->DisplayMode());
       
   299 			#endif
       
   300             }
       
   301         
       
   302         iCallbackThumbnail->Set( bitmap, iClientData );
       
   303         bitmap = NULL; // Owned by iCallbackThumbnail or client now
       
   304 
       
   305         if ( iProcessingPreview )
       
   306             {
       
   307             TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailPreviewReady %d", iParams.iRequestId );
       
   308             iObserver.ThumbnailPreviewReady( *iCallbackThumbnail, iParams.iRequestId );
       
   309             iProcessingPreview = EFalse;
       
   310             ReleaseServerBitmap();
       
   311             Get2ndPhaseThumbnailL();
       
   312             }
       
   313         else
       
   314             {
       
   315             TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
       
   316             
       
   317             iObserver.ThumbnailReady( iStatus.Int(), * iCallbackThumbnail, iParams.iRequestId );
       
   318             ReleaseServerBitmap();    
       
   319             
       
   320             iRequestQueue->RequestComplete(this);
       
   321             
       
   322 #ifdef _DEBUG
       
   323         TTime stop;
       
   324         stop.UniversalTime();
       
   325         TN_DEBUG4( "CThumbnailRequestActive::RunL(0x%08x) total execution time of req %d is %d ms",
       
   326                 this, iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
       
   327 #endif
       
   328             }
       
   329         }
       
   330     
       
   331     delete iBitmap;
       
   332     iBitmap = NULL;
       
   333     
       
   334     //if request is complete set it also not active -> really finished
       
   335     if(iRequestCompleted)
       
   336         {
       
   337         iRequestActive = EFalse;
       
   338         }
       
   339     }
       
   340 
       
   341 
       
   342 // ---------------------------------------------------------------------------
       
   343 // CThumbnailRequestActive::RunError()
       
   344 // ---------------------------------------------------------------------------
       
   345 //
       
   346 TInt CThumbnailRequestActive::RunError( TInt aError )
       
   347     {
       
   348     TN_DEBUG1( "CThumbnailRequestActive::RunError");
       
   349     
       
   350     iTimer->Cancel();
       
   351     
       
   352     // If RunL() left, the client did not get any callbacks yet.
       
   353     // We need to notify it of the error now.
       
   354     iError = aError;
       
   355     HandleError();
       
   356     
       
   357     return KErrNone;
       
   358     }
       
   359 
       
   360 
       
   361 // ---------------------------------------------------------------------------
       
   362 // CThumbnailRequestActive::DoCancel()
       
   363 // ---------------------------------------------------------------------------
       
   364 //
       
   365 void CThumbnailRequestActive::DoCancel()
       
   366     {
       
   367     TN_DEBUG1( "CThumbnailRequestActive::DoCancel");
       
   368     iTimer->Cancel();
       
   369     
       
   370     __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
       
   371 
       
   372     iSession.CancelRequest( iRequestId );
       
   373     ReleaseServerBitmap();
       
   374     }
       
   375 
       
   376 
       
   377 // ---------------------------------------------------------------------------
       
   378 // CThumbnailRequestActive::ReleaseServerBitmap()
       
   379 // Releases reserved bitmap.
       
   380 // ---------------------------------------------------------------------------
       
   381 //
       
   382 void CThumbnailRequestActive::ReleaseServerBitmap()
       
   383     {
       
   384     TN_DEBUG1( "CThumbnailRequestActive::ReleaseServerBitmap");
       
   385     
       
   386     if ( iBitmapHandle && iSession.Handle())
       
   387         {
       
   388         iSession.ReleaseBitmap( iBitmapHandle );
       
   389         iBitmapHandle = 0;
       
   390         }
       
   391     }
       
   392 
       
   393 
       
   394 // ---------------------------------------------------------------------------
       
   395 // CThumbnailRequestActive::HandleError()
       
   396 // Error handling function.
       
   397 // ---------------------------------------------------------------------------
       
   398 //
       
   399 void CThumbnailRequestActive::HandleError()
       
   400     {
       
   401     TN_DEBUG1( "CThumbnailRequestActive::HandleError");
       
   402     
       
   403     if ( iError )
       
   404         {
       
   405         if( iError == KErrServerTerminated)
       
   406             {
       
   407             iSession.Close();
       
   408             iSession.Connect();
       
   409             }
       
   410         iCallbackThumbnail->Set( NULL, iClientData );
       
   411         
       
   412         // don't leak internal TNM codes
       
   413         if (iError == KThumbnailErrThumbnailNotFound)
       
   414             {
       
   415             iError = KErrNotFound;
       
   416             }
       
   417         
       
   418         TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
       
   419         iObserver.ThumbnailReady( iError, *iCallbackThumbnail, iParams.iRequestId );
       
   420         
       
   421         iError = KErrNone;
       
   422         }
       
   423     
       
   424     ReleaseServerBitmap();
       
   425     
       
   426     iRequestCompleted = ETrue;
       
   427     iRequestQueue->RequestComplete(this);
       
   428     iRequestActive = EFalse;
       
   429     }
       
   430 
       
   431 
       
   432 // ---------------------------------------------------------------------------
       
   433 // CThumbnailRequestActive::GetThumbnailL()
       
   434 // Get a thumbnail for an object file.
       
   435 // ---------------------------------------------------------------------------
       
   436 //
       
   437 void CThumbnailRequestActive::GetThumbnailL( const RFile64& aFile, TThumbnailId aThumbnailId,
       
   438     CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
       
   439     ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
       
   440     TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
       
   441     const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
       
   442     {
       
   443     iRequestType = EReqGetThumbnailHandle;
       
   444 
       
   445     if ( aQualityPreference == CThumbnailManager
       
   446         ::EOptimizeForQualityWithPreview )
       
   447         {
       
   448         // We may need the file handle later for the 2nd phase
       
   449         // thumbnail
       
   450         iMyFileHandle.Close();
       
   451         User::LeaveIfError( iMyFileHandle.Duplicate( aFile ));
       
   452         }
       
   453 
       
   454     iClientData = aClientData;
       
   455     iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
       
   456     						EThumbnailGeneratePersistentSizesOnly :
       
   457     						EThumbnailNoControlFlags);    
       
   458     iParams.iBitmapHandle = 0;
       
   459     iParams.iSize = aSize;
       
   460     iParams.iDisplayMode = aDisplayMode;
       
   461     User::LeaveIfError( aFile.FullName( iParams.iFileName ));
       
   462     iParams.iRequestId = iRequestId;
       
   463     iParams.iPriority = aPriority;
       
   464     iParams.iFlags = aFlags;
       
   465     iParams.iQualityPreference = aQualityPreference;
       
   466     iParams.iThumbnailSize = aThumbnailSize;
       
   467     iParams.iThumbnailId = aThumbnailId;
       
   468     
       
   469     User::LeaveIfError( iFile.Duplicate( aFile ));
       
   470     
       
   471     iTargetUri = aTargetUri;
       
   472     }
       
   473 
       
   474 
       
   475 // ---------------------------------------------------------------------------
       
   476 // CThumbnailRequestActive::GetThumbnailL()
       
   477 // Get a thumbnail opening an object file later.
       
   478 // ---------------------------------------------------------------------------
       
   479 //
       
   480 void CThumbnailRequestActive::GetThumbnailL( TThumbnailId aThumbnailId,
       
   481     const TDesC& aPath, CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
       
   482     ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
       
   483     TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
       
   484     const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
       
   485     {
       
   486     iRequestType = EReqGetThumbnailHandleLater;
       
   487 
       
   488     iClientData = aClientData;
       
   489     iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
       
   490                             EThumbnailGeneratePersistentSizesOnly :
       
   491                             EThumbnailNoControlFlags);    
       
   492     iParams.iBitmapHandle = 0;
       
   493     iParams.iSize = aSize;
       
   494     iParams.iDisplayMode = aDisplayMode;
       
   495     iParams.iFileName = aPath;
       
   496     iParams.iRequestId = iRequestId;
       
   497     iParams.iPriority = aPriority;
       
   498     iParams.iFlags = aFlags;
       
   499     iParams.iQualityPreference = aQualityPreference;
       
   500     iParams.iThumbnailSize = aThumbnailSize;
       
   501     iParams.iThumbnailId = aThumbnailId;
       
   502     
       
   503     iTargetUri = aTargetUri;
       
   504     }
       
   505 
       
   506 
       
   507 // ---------------------------------------------------------------------------
       
   508 // CThumbnailRequestActive::GetThumbnailL()
       
   509 // Get a thumbnail for an object file.
       
   510 // ---------------------------------------------------------------------------
       
   511 //
       
   512 void CThumbnailRequestActive::GetThumbnailL( const TDesC& aPath, TThumbnailId aThumbnailId,
       
   513     CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
       
   514     ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
       
   515     TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
       
   516     const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
       
   517     {
       
   518     iRequestType = EReqGetThumbnailPath;
       
   519 
       
   520     iClientData = aClientData;
       
   521     iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
       
   522     						EThumbnailGeneratePersistentSizesOnly :
       
   523     						EThumbnailNoControlFlags);
       
   524     						
       
   525     iParams.iBitmapHandle = 0;
       
   526     iParams.iSize = aSize;
       
   527     iParams.iDisplayMode = aDisplayMode;
       
   528     iParams.iRequestId = iRequestId;
       
   529     iParams.iPriority = aPriority;
       
   530     iParams.iFlags = aFlags;
       
   531     iParams.iQualityPreference = aQualityPreference;
       
   532     iParams.iThumbnailSize = aThumbnailSize;
       
   533     iParams.iThumbnailId = aThumbnailId;
       
   534     
       
   535     iPath = aPath;
       
   536     iTargetUri = aTargetUri;
       
   537     }
       
   538 
       
   539 // ---------------------------------------------------------------------------
       
   540 // CThumbnailRequestActive::SetThumbnailL()
       
   541 // Get a thumbnail for an object file.
       
   542 // ---------------------------------------------------------------------------
       
   543 //
       
   544 void CThumbnailRequestActive::SetThumbnailL( TDesC8* aBuffer, TThumbnailId aThumbnailId,
       
   545     const TDesC8& aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
       
   546     CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const TSize& aSize,
       
   547     const TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData,
       
   548     TBool aGeneratePersistentSizesOnly, const TDesC& aTargetUri, TThumbnailSize aThumbnailSize )
       
   549     {
       
   550     iRequestType = EReqSetThumbnailBuffer;
       
   551 
       
   552     iClientData = aClientData;
       
   553     iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
       
   554                             EThumbnailGeneratePersistentSizesOnly :
       
   555                             EThumbnailNoControlFlags);
       
   556                            
       
   557     iParams.iMimeType = TDataType( aMimeType );
       
   558     iParams.iBitmapHandle = 0;
       
   559     iParams.iSize = aSize;
       
   560     iParams.iBuffer = aBuffer; // save pointer for deletion (~CThumbnailRequestActive())
       
   561     iParams.iThumbnailSize = aThumbnailSize;
       
   562     iParams.iDisplayMode = aDisplayMode;
       
   563     iParams.iRequestId = iRequestId;
       
   564     iParams.iPriority = aPriority;
       
   565     iParams.iFlags = aFlags;
       
   566     iParams.iQualityPreference = aQualityPreference;
       
   567     iParams.iThumbnailId = aThumbnailId;
       
   568     
       
   569     iTargetUri = aTargetUri;
       
   570     }
       
   571 
       
   572 // ---------------------------------------------------------------------------
       
   573 // CThumbnailRequestActive::SetThumbnailL()
       
   574 // Get a thumbnail for an object file.
       
   575 // ---------------------------------------------------------------------------
       
   576 //
       
   577 void CThumbnailRequestActive::SetThumbnailL( CFbsBitmap* aBitmap, TThumbnailId aThumbnailId,
       
   578     const TDesC8& aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
       
   579     CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const TSize& aSize,
       
   580     const TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData,
       
   581     TBool aGeneratePersistentSizesOnly, const TDesC& aTargetUri, TThumbnailSize aThumbnailSize )
       
   582     {    
       
   583     iClientData = aClientData;
       
   584     iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
       
   585                             EThumbnailGeneratePersistentSizesOnly :
       
   586                             EThumbnailNoControlFlags);
       
   587                            
       
   588     iParams.iBitmapHandle = 0;
       
   589     iParams.iSize = aSize;
       
   590     iParams.iThumbnailSize = aThumbnailSize;
       
   591     iParams.iDisplayMode = aDisplayMode;
       
   592     iParams.iRequestId = iRequestId;
       
   593     iParams.iPriority = aPriority;
       
   594     iParams.iFlags = aFlags;
       
   595     iParams.iQualityPreference = aQualityPreference;
       
   596     iParams.iThumbnailId = aThumbnailId;
       
   597     iParams.iFileName = aTargetUri;
       
   598     
       
   599     iTargetUri = aTargetUri;
       
   600     
       
   601     TInt memoryFree( 0 );
       
   602     HAL::Get( HALData::EMemoryRAMFree, memoryFree );
       
   603     
       
   604     TN_DEBUG2( "CThumbnaiRequestActive::SetThumbnailbyBitmap() - memoryFree %d", memoryFree );
       
   605     
       
   606     if(memoryFree > KMemoryNeed)
       
   607         {
       
   608         // save parameter bitmap, it will be deleted when request is complete
       
   609         iBitmap = aBitmap;                   
       
   610         iParams.iMimeType = TDataType( aMimeType );
       
   611         iRequestType = EReqSetThumbnailBitmap;
       
   612         }
       
   613     else
       
   614         {
       
   615         // memory low, create thumbs using filehandle
       
   616         TN_DEBUG1( "CThumbnaiRequestActive::SetThumbnailbyBitmap() - memory low, create thumbs using filehandle!" );
       
   617         delete aBitmap;
       
   618         aBitmap = NULL;
       
   619         iParams.iPriority = aPriority - 1;
       
   620         iRequestType = EReqGetThumbnailHandleLater;
       
   621         }
       
   622     }
       
   623 
       
   624 // ---------------------------------------------------------------------------
       
   625 // CThumbnailRequestActive::UpdateThumbnailsL()
       
   626 // Update thumbnails by Id.
       
   627 // ---------------------------------------------------------------------------
       
   628 //
       
   629 void CThumbnailRequestActive::UpdateThumbnailsL( const TDesC& aPath, 
       
   630     const TThumbnailId aThumbnailId, CThumbnailManager::TThumbnailFlags aFlags, 
       
   631     CThumbnailManager::TThumbnailQualityPreference aQualityPreference, 
       
   632     const TDisplayMode aDisplayMode, const TInt aPriority, const TInt aOrientation,
       
   633     const TInt64 aModified )
       
   634     {
       
   635     iRequestType = EReqUpdateThumbnails;
       
   636     
       
   637     iParams.iControlFlags = EThumbnailGeneratePersistentSizesOnly;   
       
   638     iParams.iBitmapHandle = 0;
       
   639     iParams.iDisplayMode = aDisplayMode;
       
   640     iParams.iRequestId = iRequestId;
       
   641     iParams.iPriority = aPriority;
       
   642     iParams.iFlags = aFlags;
       
   643     iParams.iQualityPreference = aQualityPreference;
       
   644     iParams.iThumbnailId = aThumbnailId;
       
   645     
       
   646     iPath = aPath;
       
   647     iOrientation = aOrientation;
       
   648     iModified = aModified;
       
   649     }
       
   650 
       
   651 // ---------------------------------------------------------------------------
       
   652 // CThumbnailRequestActive::DeleteThumbnails()
       
   653 // Delete thumbnails.
       
   654 // ---------------------------------------------------------------------------
       
   655 //
       
   656 void CThumbnailRequestActive::DeleteThumbnails( const TDesC& aPath, 
       
   657     const TThumbnailId aThumbnailId, const TInt aPriority )
       
   658     {
       
   659     iRequestType = EReqDeleteThumbnails;
       
   660     
       
   661     iParams.iRequestId = iRequestId;
       
   662     iParams.iPriority = aPriority;
       
   663     iParams.iThumbnailId = aThumbnailId;
       
   664     
       
   665     iPath = aPath;
       
   666     }
       
   667 
       
   668 // ---------------------------------------------------------------------------
       
   669 // Request 2nd phase thumbnail
       
   670 // ---------------------------------------------------------------------------
       
   671 //
       
   672 void CThumbnailRequestActive::Get2ndPhaseThumbnailL()
       
   673     {
       
   674     TN_DEBUG2( "CThumbnailRequestActive::Get2ndPhaseThumbnailL() %d", iParams.iRequestId );
       
   675     
       
   676     iParams.iQualityPreference = CThumbnailManager::EOptimizeForQuality;
       
   677     iParams.iControlFlags = EThumbnailNoControlFlags;
       
   678     
       
   679     if ( iMyFileHandle.SubSessionHandle())
       
   680         {
       
   681         User::LeaveIfError( iMyFileHandle.FullName( iParams.iFileName ));
       
   682         iSession.RequestThumbnailL( iMyFileHandle, iParams.iTargetUri, iParamsPckg, iStatus );
       
   683         SetActive();
       
   684         }
       
   685     else
       
   686         {
       
   687         iSession.RequestThumbnailL( iParams.iFileName, iParams.iTargetUri, iParams.iThumbnailId, iParamsPckg, iStatus );
       
   688         SetActive();
       
   689         }
       
   690     }
       
   691 
       
   692 // ---------------------------------------------------------------------------
       
   693 // CThumbnailRequestActive::ChangePriority()
       
   694 // ---------------------------------------------------------------------------
       
   695 //
       
   696 void CThumbnailRequestActive::ChangePriority( const TInt aNewPriority )
       
   697     {
       
   698     TN_DEBUG1( "CThumbnailRequestActive::ChangePriority");
       
   699     
       
   700     iParams.iPriority = aNewPriority;
       
   701     
       
   702     if (!IsActive())
       
   703         {
       
   704         this->SetPriority(aNewPriority);
       
   705         }
       
   706     else
       
   707         {
       
   708         iSession.ChangePriority(iRequestId, aNewPriority);
       
   709         }
       
   710     }
       
   711 
       
   712 // ---------------------------------------------------------------------------
       
   713 // CThumbnailRequestActive::TimerCallBack()
       
   714 // ---------------------------------------------------------------------------
       
   715 //
       
   716 TInt CThumbnailRequestActive::TimerCallBack(TAny* aAny)
       
   717     {
       
   718     TN_DEBUG1( "CThumbnailRequestActive::TimerCallBack() - request timeout");
       
   719     
       
   720     CThumbnailRequestActive* self = static_cast<CThumbnailRequestActive*>( aAny );
       
   721     
       
   722     self->Cancel();
       
   723     self->iError = KErrTimedOut;
       
   724     self->HandleError();
       
   725     
       
   726     return KErrNone;
       
   727     }
       
   728 
       
   729 // End of file