imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp
changeset 0 2014ca87e772
child 1 235a7fc86938
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp	Tue Jan 26 15:18:05 2010 +0200
@@ -0,0 +1,278 @@
+/*
+* 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:  Processor object for running thumbnail requests
+*
+*/
+
+
+#include "thumbnailrequestqueue.h"
+#include "thumbnailrequestactive.h"
+#include "thumbnaillog.h"
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestQueue* CThumbnailRequestQueue::NewL()
+    {
+    CThumbnailRequestQueue* self = new( ELeave )CThumbnailRequestQueue();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::CThumbnailRequestQueue()
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestQueue::CThumbnailRequestQueue()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestQueue::ConstructL()
+    {
+    iActiveRequests = 0;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::~CThumbnailRequestQueue()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CThumbnailRequestQueue::~CThumbnailRequestQueue()
+    {
+    TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue()");
+    
+    iRequests.ResetAndDestroy();
+    
+    TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue() - All requests deleted");
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::Process()
+// Activates next request if possible.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestQueue::Process()
+    {
+    TN_DEBUG1( "CThumbnailRequestQueue::Process()");
+    
+    while ( (iActiveRequests < KMaxClientRequests) &&
+            (iRequests.Count() > iActiveRequests) )
+        {             
+        CThumbnailRequestActive* selectedRequest = NULL;
+        TInt priority( KMinTInt );
+        TInt reqPriority;
+        CThumbnailRequestActive* request = NULL;
+        
+        for ( TInt i = 0; i < iRequests.Count(); i++ )
+           {
+           request = iRequests[i];
+
+           // this task is not yet activated or processed
+           if( request && !request->RequestCompleted() && !request->IsRequestActive()  )
+               {
+               TN_DEBUG4( "CThumbnailRequestQueue::Process() - candidate at %d, id = %d, (0x%08x)", i, 
+                       request->RequestId(), 
+                       request);
+               reqPriority = request->Priority();
+               if ( reqPriority > priority )
+                   {
+                   priority = reqPriority;
+                   selectedRequest = request;
+                   }
+               }
+           }
+        
+        // activate selected
+        if ( selectedRequest )
+           {
+           TN_DEBUG1( "CThumbnailRequestQueue::Process() - starting next request");
+                    
+           TRAPD(err, selectedRequest->StartL());
+           if (err != KErrNone)
+               {
+               iActiveRequests++;
+               }
+           }
+         else
+            {
+            break;
+            }
+        }
+    
+    TN_DEBUG3( "CThumbnailRequestQueue::Process() end - requests: %d, active requests: %d",
+               iRequests.Count(), iActiveRequests );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::AddRequestL()
+// Adds new request to the queue.
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestQueue::AddRequestL( CThumbnailRequestActive* aRequest )
+    {
+    TN_DEBUG3( "CThumbnailRequestQueue::AddRequestL() - requests: %d, active requests: %d",
+               iRequests.Count(), iActiveRequests );
+    
+    RemoveCompleted(NULL);
+    iRequests.AppendL( aRequest );
+    }
+
+void CThumbnailRequestQueue::RemoveCompleted( CThumbnailRequestActive* aRequestAO)
+    {
+    TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() - begin - requests: %d, active requests: %d",
+               iRequests.Count(), iActiveRequests );
+            
+    //process completed queue and remove finished tasks
+    for ( TInt i = iRequests.Count() -1; i >= 0 && iRequests.Count(); i-- )
+         {
+         CThumbnailRequestActive* request = iRequests[i];
+         
+         // remove completed task if it's not active anymore and not this
+         if ( request->RequestCompleted() && !request->IsRequestActive() && aRequestAO != request)
+             {
+             // delete completed task
+             TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() - deleted id = %d (0x%08x)", request->RequestId(), request);
+             delete request;
+             iRequests.Remove( i );
+             }
+         }
+     
+     TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() end - requests: %d, active requests: %d",
+                    iRequests.Count(), iActiveRequests );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::CancelRequest()
+// Removes specific request from the queue.
+// ---------------------------------------------------------------------------
+//
+TInt CThumbnailRequestQueue::CancelRequest( const TThumbnailRequestId aRequestId )
+    {
+    TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - request ID: %d", aRequestId);
+    
+    TInt res = KErrNotFound;
+
+    for ( TInt i = iRequests.Count(); --i >= 0; )
+        {
+        CThumbnailRequestActive* request = iRequests[i];
+        if ( request->RequestId() == aRequestId )
+            {
+            // Cancel and remove from queue
+            if (iRequests[i]->IsActive()) 
+                {
+                iRequests[i]->Cancel();
+                
+                iActiveRequests--;
+                if(iActiveRequests <= -1)
+                    {
+                    iActiveRequests = 0;
+                    }
+                
+                delete request;
+                iRequests.Remove( i );
+                
+                TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - canceled request ID: %d", aRequestId);
+                }
+            else
+                {
+                delete request;
+                iRequests.Remove( i );
+                          
+                TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - removed request ID: %d", aRequestId);
+                }
+
+            res = KErrNone;
+            break;
+            }
+        }
+    
+	RemoveCompleted(NULL);
+	
+    Process();
+    
+    return res;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::ChangeReqPriority()
+// Changes priority of a request.
+// ---------------------------------------------------------------------------
+//
+TInt CThumbnailRequestQueue::ChangePriority( const TThumbnailRequestId aRequestId,
+                                             const TInt aNewPriority )
+    {
+    TN_DEBUG1( "CThumbnailRequestQueue::ChangePriority()");
+    
+    TInt err = KErrNotFound;
+    const TInt count = iRequests.Count();
+    
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        if ( iRequests[i]->RequestId() == aRequestId )
+            {
+            iRequests[i]->ChangePriority( aNewPriority );
+            
+            err = KErrNone;
+            break;
+            }
+        }
+    
+    return err;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CThumbnailRequestQueue::RequestComplete()
+// Completes the request
+// ---------------------------------------------------------------------------
+//
+void CThumbnailRequestQueue::RequestComplete(CThumbnailRequestActive* aRequestAO)
+    {
+    TN_DEBUG2( "CThumbnailRequestQueue::RequestComplete(0x%08x)", aRequestAO);
+    
+    iActiveRequests--;
+    if(iActiveRequests <= -1)
+        {
+        iActiveRequests = 0;
+        }
+    
+    RemoveCompleted( aRequestAO );
+    
+    Process();
+    
+    TN_DEBUG2( "CThumbnailRequestQueue::RequestComplete() end - active requests: %d", iActiveRequests );
+    }
+
+
+// End of file