imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp
changeset 0 2014ca87e772
child 1 235a7fc86938
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestactive.cpp	Tue Jan 26 15:18:05 2010 +0200
@@ -0,0 +1,729 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Active object for an asynchronous thumbnail request
+ *
+*/
+
+
+#include <e32base.h>
+#include <hal.h>
+#include <hal_data.h>
+#include <apmstd.h>
+
+#include "thumbnailrequestactive.h"
+#include "thumbnailrequestqueue.h"
+#include "thumbnailsession.h"
+#include "thumbnailmanagerobserver.h"
+#include "thumbnailmanagerconstants.h"
+#include "thumbnaildataimpl.h"
+#include "thumbnailpanic.h"
+#include "thumbnaillog.h"
+
+#include "thumbnailmanagerimpl.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::~CThumbnailRequestActive()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestActive::~CThumbnailRequestActive()
+    {
+    Cancel();
+    
+    if(iTimer)
+        {
+        iTimer->Cancel();
+        }
+    delete iTimer;
+    
+    ReleaseServerBitmap();
+    delete iCallbackThumbnail;
+    delete iParams.iBuffer;
+    delete iBitmap;
+    iFile.Close();
+    iMyFileHandle.Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestActive* CThumbnailRequestActive::NewL( RFs& aFs,
+    RThumbnailSession& aThumbnailSession, MThumbnailManagerObserver& aObserver,
+    TThumbnailRequestId aId, TInt aPriority, CThumbnailRequestQueue* aQueue )
+    {
+    CThumbnailRequestActive* self = new( ELeave )CThumbnailRequestActive( aFs,
+        aThumbnailSession, aObserver, aId, aPriority, aQueue );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::CThumbnailRequestActive()
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestActive::CThumbnailRequestActive( RFs& aFs, RThumbnailSession&
+    aThumbnailSession, MThumbnailManagerObserver& aObserver,
+    TThumbnailRequestId aId, TInt aPriority, CThumbnailRequestQueue* aQueue ):
+    CActive( aPriority ), iSession( aThumbnailSession ), iParamsPckg( iParams ),
+    iObserver( aObserver ), iFs( aFs ), iBitmapHandle( 0 ), iRequestId( aId ), 
+    iRequestQueue( aQueue )
+    {
+    CActiveScheduler::Add( this );
+    TN_DEBUG2( "CThumbnaiRequestActive::CThumbnailRequestActive() AO's priority = %d", Priority());
+    
+    iBitmap = NULL;
+    iRequestCompleted = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::ConstructL()
+    {
+    iCallbackThumbnail = new( ELeave )CThumbnailDataImpl();
+
+    iTimer = CPeriodic::NewL(CActive::EPriorityIdle);
+    
+#ifdef _DEBUG
+    iStartExecTime.UniversalTime();
+#endif
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::StartL()
+// Start active request.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::StartL()
+    {
+    TN_DEBUG3( "CThumbnailRequestActive::StartL(0x%08x) reqid = %d", this, iRequestId );
+    
+    iRequestActive = ETrue;
+
+#ifdef _DEBUG
+    TTime stop;
+    stop.UniversalTime();
+    TN_DEBUG3( "CThumbnailRequestActive::StartL() req id = %d, queuing time %d ms",
+               iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
+#endif
+    
+    switch (iRequestType)
+        {
+        case EReqGetThumbnailHandle:
+            {
+            iSession.RequestThumbnailL( iFile, iTargetUri, iParamsPckg, iStatus );
+            break;
+            }        
+        case EReqGetThumbnailPath:
+            {
+            iSession.RequestThumbnailL( iPath, iTargetUri, iParams.iThumbnailId, 
+                                        iParamsPckg, iStatus );
+            break;
+            }  
+        case EReqSetThumbnailBuffer:
+            {
+            iSession.RequestSetThumbnailL( iParams.iBuffer, iTargetUri, iParamsPckg, iStatus );
+            break;
+            }  
+        case EReqSetThumbnailBitmap:
+            {
+            iSession.RequestSetThumbnailL( iBitmap->Handle(), iTargetUri, iParamsPckg, iStatus );
+            break;
+            }  
+        case EReqUpdateThumbnails:
+            {
+            iSession.UpdateThumbnails( iPath, iOrientation, iModified, iParamsPckg, iStatus );
+            break;
+            }       
+        case EReqGetThumbnailHandleLater:
+            {
+            // open file handle
+            User::LeaveIfError( iFile.Open( iFs, iTargetUri, EFileShareReadersOrWriters ) );  
+            
+            TN_DEBUG2( "CThumbnailRequestActive::StartL() - file handle opened for %S", &iTargetUri );
+            
+            CleanupClosePushL( iFile );
+            iSession.RequestThumbnailL( iFile, iTargetUri, iParamsPckg, iStatus );
+            CleanupStack::PopAndDestroy( &iFile );
+            break;
+            }  
+        case EReqDeleteThumbnails:
+            {
+            // by path
+            if (iPath != KNullDesC)
+                {
+                iSession.DeleteThumbnails( iPath, iParamsPckg, iStatus );
+                }
+            // by id
+            else
+                {
+                iSession.DeleteThumbnails( iParams.iThumbnailId, iParamsPckg, iStatus );
+                }
+            break;
+            } 
+        default:
+            {
+            break;
+            }
+        }
+    
+    iTimer->Start( KClientRequestTimeout, KClientRequestTimeout, 
+                   TCallBack(TimerCallBack, this));
+    SetActive();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::RunL()
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::RunL()
+    {
+    TN_DEBUG1( "CThumbnaiRequestActive::RunL()" );
+    
+    if ( iParams.iControlFlags == EThumbnailPreviewThumbnail )
+        {
+        iRequestCompleted = EFalse;
+		iProcessingPreview = ETrue;
+        }
+    else
+        {
+        iRequestCompleted = ETrue;
+        }
+    
+    iTimer->Cancel();
+    
+    if (iRequestType == EReqDeleteThumbnails)
+        {
+        // no action for delete
+        iRequestQueue->RequestComplete(this);
+        
+#ifdef _DEBUG
+    TTime stop;
+    stop.UniversalTime();
+    TN_DEBUG3( "CThumbnailRequestActive::RunL() total execution time of req %d is %d ms",
+                iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
+#endif
+        }
+    else if ( iStatus.Int() == KThumbnailErrThumbnailNotFound && iParams.iFileName.Length() && 
+         !( iParams.iFlags& CThumbnailManager::EDoNotCreate ))
+        {
+        TN_DEBUG1( "CThumbnaiRequestActive::RunL() - no thumbnail found - lets try with file handle" );
+        iRequestCompleted = EFalse;
+        
+        // We tried to get thumbnail using file path, but it was not found in
+        // the database. We need to open the file now (on the client side) and
+        // use file handle.
+        User::LeaveIfError( iFile.Open( iFs, iParams.iFileName, EFileShareReadersOrWriters ));
+        CleanupClosePushL( iFile );
+        
+        TN_DEBUG2( "CThumbnaiRequestActive::RunL() - file handle opened for %S", &iParams.iFileName );
+        
+        iSession.RequestThumbnailL( iFile, iParams.iTargetUri, iParamsPckg, iStatus );
+        CleanupStack::PopAndDestroy( &iFile );
+        
+        iTimer->Start( KClientRequestTimeout, KClientRequestTimeout, 
+                           TCallBack(TimerCallBack, this));
+        SetActive();
+        }
+    else if ( iStatus.Int())
+        {
+        TN_DEBUG2( "CThumbnaiRequestActive::RunL() - error (%d) occured", iStatus.Int() );
+        // An error occurred
+        iError = iStatus.Int();
+        HandleError();
+        }
+    else if (iParams.iControlFlags == EThumbnailGeneratePersistentSizesOnly)
+	    {
+	    TN_DEBUG1( "CThumbnaiRequestActive::RunL()- generate persistent sizes" );
+	    iBitmapHandle = iParams.iBitmapHandle;
+	    
+	    TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
+	    iObserver.ThumbnailReady( iStatus.Int(), *iCallbackThumbnail, iParams.iRequestId );
+	  
+	    ReleaseServerBitmap();
+	    iRequestQueue->RequestComplete(this);
+	    
+#ifdef _DEBUG
+    TTime stop;
+    stop.UniversalTime();
+    TN_DEBUG3( "CThumbnailRequestActive::RunL() total execution time %d, %d ms",
+               iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
+#endif
+	    }
+    else
+        {
+        TN_DEBUG1( "CThumbnaiRequestActive::RunL() - succesful" );
+        
+        // Success
+        iBitmapHandle = iParams.iBitmapHandle;
+        CFbsBitmap* bitmap = new( ELeave )CFbsBitmap();
+        CleanupStack::PushL( bitmap );
+        User::LeaveIfError( bitmap->Duplicate( iBitmapHandle ));
+        CleanupStack::Pop( bitmap );
+		
+		// reduce bpp value (displaymode to match reqested bits per pixel)
+		#ifdef _DEBUG
+        TN_DEBUG2( "CThumbnaiRequestActive::RunL() - displaymode is %d", bitmap->DisplayMode());
+		#endif
+        
+        if( bitmap->DisplayMode() > iParams.iDisplayMode )
+            {
+            bitmap->SetDisplayMode( iParams.iDisplayMode );
+			#ifdef _DEBUG
+            TN_DEBUG2( "CThumbnaiRequestActive::RunL() - displaymode is now %d", bitmap->DisplayMode());
+			#endif
+            }
+        
+        iCallbackThumbnail->Set( bitmap, iClientData );
+        bitmap = NULL; // Owned by iCallbackThumbnail or client now
+
+        if ( iProcessingPreview )
+            {
+            TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailPreviewReady %d", iParams.iRequestId );
+            iObserver.ThumbnailPreviewReady( *iCallbackThumbnail, iParams.iRequestId );
+            iProcessingPreview = EFalse;
+            ReleaseServerBitmap();
+            Get2ndPhaseThumbnailL();
+            }
+        else
+            {
+            TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
+            
+            iObserver.ThumbnailReady( iStatus.Int(), * iCallbackThumbnail, iParams.iRequestId );
+            ReleaseServerBitmap();    
+            
+            iRequestQueue->RequestComplete(this);
+            
+#ifdef _DEBUG
+        TTime stop;
+        stop.UniversalTime();
+        TN_DEBUG4( "CThumbnailRequestActive::RunL(0x%08x) total execution time of req %d is %d ms",
+                this, iParams.iRequestId, (TInt)stop.MicroSecondsFrom(iStartExecTime).Int64()/1000 );
+#endif
+            }
+        }
+    
+    delete iBitmap;
+    iBitmap = NULL;
+    
+    //if request is complete set it also not active -> really finished
+    if(iRequestCompleted)
+        {
+        iRequestActive = EFalse;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::RunError()
+// ---------------------------------------------------------------------------
+//
+TInt CThumbnailRequestActive::RunError( TInt aError )
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::RunError");
+    
+    iTimer->Cancel();
+    
+    // If RunL() left, the client did not get any callbacks yet.
+    // We need to notify it of the error now.
+    iError = aError;
+    HandleError();
+    
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::DoCancel()
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::DoCancel");
+    iTimer->Cancel();
+    
+    __ASSERT_DEBUG(( iRequestId > 0 ), ThumbnailPanic( EThumbnailWrongId ));
+
+    iSession.CancelRequest( iRequestId );
+    ReleaseServerBitmap();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::ReleaseServerBitmap()
+// Releases reserved bitmap.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::ReleaseServerBitmap()
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::ReleaseServerBitmap");
+    
+    if ( iBitmapHandle && iSession.Handle())
+        {
+        iSession.ReleaseBitmap( iBitmapHandle );
+        iBitmapHandle = 0;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::HandleError()
+// Error handling function.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::HandleError()
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::HandleError");
+    
+    if ( iError )
+        {
+        if( iError == KErrServerTerminated)
+            {
+            iSession.Close();
+            iSession.Connect();
+            }
+        iCallbackThumbnail->Set( NULL, iClientData );
+        
+        // don't leak internal TNM codes
+        if (iError == KThumbnailErrThumbnailNotFound)
+            {
+            iError = KErrNotFound;
+            }
+        
+        TN_DEBUG2( "CThumbnaiRequestActive::RunL() - iObserver.ThumbnailReady %d", iParams.iRequestId );
+        iObserver.ThumbnailReady( iError, *iCallbackThumbnail, iParams.iRequestId );
+        
+        iError = KErrNone;
+        }
+    
+    ReleaseServerBitmap();
+    
+    iRequestCompleted = ETrue;
+    iRequestQueue->RequestComplete(this);
+    iRequestActive = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::GetThumbnailL()
+// Get a thumbnail for an object file.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::GetThumbnailL( const RFile64& aFile, TThumbnailId aThumbnailId,
+    CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
+    ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
+    TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
+    const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
+    {
+    iRequestType = EReqGetThumbnailHandle;
+
+    if ( aQualityPreference == CThumbnailManager
+        ::EOptimizeForQualityWithPreview )
+        {
+        // We may need the file handle later for the 2nd phase
+        // thumbnail
+        iMyFileHandle.Close();
+        User::LeaveIfError( iMyFileHandle.Duplicate( aFile ));
+        }
+
+    iClientData = aClientData;
+    iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
+    						EThumbnailGeneratePersistentSizesOnly :
+    						EThumbnailNoControlFlags);    
+    iParams.iBitmapHandle = 0;
+    iParams.iSize = aSize;
+    iParams.iDisplayMode = aDisplayMode;
+    User::LeaveIfError( aFile.FullName( iParams.iFileName ));
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailSize = aThumbnailSize;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    User::LeaveIfError( iFile.Duplicate( aFile ));
+    
+    iTargetUri = aTargetUri;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::GetThumbnailL()
+// Get a thumbnail opening an object file later.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::GetThumbnailL( TThumbnailId aThumbnailId,
+    const TDesC& aPath, CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
+    ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
+    TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
+    const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
+    {
+    iRequestType = EReqGetThumbnailHandleLater;
+
+    iClientData = aClientData;
+    iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
+                            EThumbnailGeneratePersistentSizesOnly :
+                            EThumbnailNoControlFlags);    
+    iParams.iBitmapHandle = 0;
+    iParams.iSize = aSize;
+    iParams.iDisplayMode = aDisplayMode;
+    iParams.iFileName = aPath;
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailSize = aThumbnailSize;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    iTargetUri = aTargetUri;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::GetThumbnailL()
+// Get a thumbnail for an object file.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::GetThumbnailL( const TDesC& aPath, TThumbnailId aThumbnailId,
+    CThumbnailManager::TThumbnailFlags aFlags, CThumbnailManager
+    ::TThumbnailQualityPreference aQualityPreference, const TSize& aSize, const
+    TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData, TBool aGeneratePersistentSizesOnly,
+    const TDesC& aTargetUri, TThumbnailSize aThumbnailSize)
+    {
+    iRequestType = EReqGetThumbnailPath;
+
+    iClientData = aClientData;
+    iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
+    						EThumbnailGeneratePersistentSizesOnly :
+    						EThumbnailNoControlFlags);
+    						
+    iParams.iBitmapHandle = 0;
+    iParams.iSize = aSize;
+    iParams.iDisplayMode = aDisplayMode;
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailSize = aThumbnailSize;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    iPath = aPath;
+    iTargetUri = aTargetUri;
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::SetThumbnailL()
+// Get a thumbnail for an object file.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::SetThumbnailL( TDesC8* aBuffer, TThumbnailId aThumbnailId,
+    const TDesC8& aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
+    CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const TSize& aSize,
+    const TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData,
+    TBool aGeneratePersistentSizesOnly, const TDesC& aTargetUri, TThumbnailSize aThumbnailSize )
+    {
+    iRequestType = EReqSetThumbnailBuffer;
+
+    iClientData = aClientData;
+    iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
+                            EThumbnailGeneratePersistentSizesOnly :
+                            EThumbnailNoControlFlags);
+                           
+    iParams.iMimeType = TDataType( aMimeType );
+    iParams.iBitmapHandle = 0;
+    iParams.iSize = aSize;
+    iParams.iBuffer = aBuffer; // save pointer for deletion (~CThumbnailRequestActive())
+    iParams.iThumbnailSize = aThumbnailSize;
+    iParams.iDisplayMode = aDisplayMode;
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    iTargetUri = aTargetUri;
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::SetThumbnailL()
+// Get a thumbnail for an object file.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::SetThumbnailL( CFbsBitmap* aBitmap, TThumbnailId aThumbnailId,
+    const TDesC8& aMimeType, CThumbnailManager::TThumbnailFlags aFlags,
+    CThumbnailManager::TThumbnailQualityPreference aQualityPreference, const TSize& aSize,
+    const TDisplayMode aDisplayMode, const TInt aPriority, TAny* aClientData,
+    TBool aGeneratePersistentSizesOnly, const TDesC& aTargetUri, TThumbnailSize aThumbnailSize )
+    {    
+    iClientData = aClientData;
+    iParams.iControlFlags = (aGeneratePersistentSizesOnly ?
+                            EThumbnailGeneratePersistentSizesOnly :
+                            EThumbnailNoControlFlags);
+                           
+    iParams.iBitmapHandle = 0;
+    iParams.iSize = aSize;
+    iParams.iThumbnailSize = aThumbnailSize;
+    iParams.iDisplayMode = aDisplayMode;
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailId = aThumbnailId;
+    iParams.iFileName = aTargetUri;
+    
+    iTargetUri = aTargetUri;
+    
+    TInt memoryFree( 0 );
+    HAL::Get( HALData::EMemoryRAMFree, memoryFree );
+    
+    TN_DEBUG2( "CThumbnaiRequestActive::SetThumbnailbyBitmap() - memoryFree %d", memoryFree );
+    
+    if(memoryFree > KMemoryNeed)
+        {
+        // save parameter bitmap, it will be deleted when request is complete
+        iBitmap = aBitmap;                   
+        iParams.iMimeType = TDataType( aMimeType );
+        iRequestType = EReqSetThumbnailBitmap;
+        }
+    else
+        {
+        // memory low, create thumbs using filehandle
+        TN_DEBUG1( "CThumbnaiRequestActive::SetThumbnailbyBitmap() - memory low, create thumbs using filehandle!" );
+        delete aBitmap;
+        aBitmap = NULL;
+        iParams.iPriority = aPriority - 1;
+        iRequestType = EReqGetThumbnailHandleLater;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::UpdateThumbnailsL()
+// Update thumbnails by Id.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::UpdateThumbnailsL( const TDesC& aPath, 
+    const TThumbnailId aThumbnailId, CThumbnailManager::TThumbnailFlags aFlags, 
+    CThumbnailManager::TThumbnailQualityPreference aQualityPreference, 
+    const TDisplayMode aDisplayMode, const TInt aPriority, const TInt aOrientation,
+    const TInt64 aModified )
+    {
+    iRequestType = EReqUpdateThumbnails;
+    
+    iParams.iControlFlags = EThumbnailGeneratePersistentSizesOnly;   
+    iParams.iBitmapHandle = 0;
+    iParams.iDisplayMode = aDisplayMode;
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iFlags = aFlags;
+    iParams.iQualityPreference = aQualityPreference;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    iPath = aPath;
+    iOrientation = aOrientation;
+    iModified = aModified;
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::DeleteThumbnails()
+// Delete thumbnails.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::DeleteThumbnails( const TDesC& aPath, 
+    const TThumbnailId aThumbnailId, const TInt aPriority )
+    {
+    iRequestType = EReqDeleteThumbnails;
+    
+    iParams.iRequestId = iRequestId;
+    iParams.iPriority = aPriority;
+    iParams.iThumbnailId = aThumbnailId;
+    
+    iPath = aPath;
+    }
+
+// ---------------------------------------------------------------------------
+// Request 2nd phase thumbnail
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::Get2ndPhaseThumbnailL()
+    {
+    TN_DEBUG2( "CThumbnailRequestActive::Get2ndPhaseThumbnailL() %d", iParams.iRequestId );
+    
+    iParams.iQualityPreference = CThumbnailManager::EOptimizeForQuality;
+    iParams.iControlFlags = EThumbnailNoControlFlags;
+    
+    if ( iMyFileHandle.SubSessionHandle())
+        {
+        User::LeaveIfError( iMyFileHandle.FullName( iParams.iFileName ));
+        iSession.RequestThumbnailL( iMyFileHandle, iParams.iTargetUri, iParamsPckg, iStatus );
+        SetActive();
+        }
+    else
+        {
+        iSession.RequestThumbnailL( iParams.iFileName, iParams.iTargetUri, iParams.iThumbnailId, iParamsPckg, iStatus );
+        SetActive();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::ChangePriority()
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestActive::ChangePriority( const TInt aNewPriority )
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::ChangePriority");
+    
+    iParams.iPriority = aNewPriority;
+    
+    if (!IsActive())
+        {
+        this->SetPriority(aNewPriority);
+        }
+    else
+        {
+        iSession.ChangePriority(iRequestId, aNewPriority);
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestActive::TimerCallBack()
+// ---------------------------------------------------------------------------
+//
+TInt CThumbnailRequestActive::TimerCallBack(TAny* aAny)
+    {
+    TN_DEBUG1( "CThumbnailRequestActive::TimerCallBack() - request timeout");
+    
+    CThumbnailRequestActive* self = static_cast<CThumbnailRequestActive*>( aAny );
+    
+    self->Cancel();
+    self->iError = KErrTimedOut;
+    self->HandleError();
+    
+    return KErrNone;
+    }
+
+// End of file