harvester/client/src/harvesterrequestqueue.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/harvester/client/src/harvesterrequestqueue.cpp	Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,276 @@
+/*
+* 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 harvester requests
+*
+*/
+
+
+#include "harvesterrequestqueue.h"
+#include "harvesterrequestactive.h"
+#include "harvesterlog.h"
+
+// maximum number of active client requests ( 18 burst images + 1 video )
+const TUint KMaxClientRequests = 19;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::NewL()
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CHarvesterRequestQueue* CHarvesterRequestQueue::NewL()
+    {
+    CHarvesterRequestQueue* self = new( ELeave )CHarvesterRequestQueue();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::CHarvesterRequestQueue()
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityStandard )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::ConstructL()
+    {
+    iActiveRequests = 0;
+    iShutdown = EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::~CHarvesterRequestQueue()
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+CHarvesterRequestQueue::~CHarvesterRequestQueue()
+    {
+    WRITELOG( "CHarvesterRequestQueue::~CHarvesterRequestQueue()");
+    
+    Cancel();
+    iRequests.ResetAndDestroy();
+    
+    WRITELOG( "CHarvesterRequestQueue::~CHarvesterRequestQueue() - All requests deleted");
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::Process()
+// Activates next request if possible.
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::Process()
+    {
+    WRITELOG( "CHarvesterRequestQueue::Process()");
+
+    if ( !IsActive() && !iShutdown && (iActiveRequests < KMaxClientRequests) )
+        {  
+        SetActive();
+        TRequestStatus* statusPtr = &iStatus;
+        User::RequestComplete( statusPtr, KErrNone );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::AddRequestL()
+// Adds new request to the queue.
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::AddRequestL( CHarvesterRequestActive* aRequest )
+    {
+    WRITELOG( "CHarvesterRequestQueue::AddRequestL()");
+    
+    iRequests.AppendL( aRequest );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::RunL()
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::RunL()
+    {
+    WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d",
+               iRequests.Count(), iActiveRequests );
+    
+    CHarvesterRequestActive* selectedRequest = NULL;
+    
+    for ( TInt i = 0; i < iRequests.Count(); i++ )
+        {
+        CHarvesterRequestActive* request = iRequests[i];
+        
+        // remove completed tasks    
+        if ( request->RequestCompleted() && !request->IsActive() )
+            {
+            // delete completed task
+            delete request;
+            iRequests.Remove( i );
+            
+            // correct the index so that no tasks are skipped
+            i--;
+            if(i <= -1)
+                {
+                i = -1;
+                }
+            
+            WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
+            }
+        // select priorised task
+        else
+            {
+            // not yet activated
+            if( !request->IsActive() )
+                {
+                selectedRequest = request;
+                }
+            }
+        }
+
+    // activate selected
+    if ( selectedRequest )
+        {
+        iActiveRequests++;
+        selectedRequest->Start();
+        }
+    
+    WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d",
+            iRequests.Count(), iActiveRequests );
+    
+    // continue processing if needed
+    if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
+            (iRequests.Count() > iActiveRequests))
+        {  
+        SetActive();
+        TRequestStatus* statusPtr = &iStatus;
+        User::RequestComplete( statusPtr, KErrNone );
+        }
+    else
+    	{
+    	iRequests.Compress();
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// Handle any error from RunL
+// ---------------------------------------------------------------------------
+//
+TInt CHarvesterRequestQueue::RunError( TInt aError )
+    {
+    WRITELOG1( "CHarvesterRequestQueue::RunError() - %d", aError);
+    
+    if (aError)
+        {
+        iActiveRequests--;
+        if(iActiveRequests <= -1)
+            {
+            iActiveRequests = 0;
+            }
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::DoCancel()
+    {
+    WRITELOG( "CHarvesterRequestQueue::DoCancel()");
+    
+    for( TInt i(0); i < iRequests.Count(); i++ )
+        {
+        iRequests[i]->Cancel();
+        }
+    
+    iShutdown = ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::RequestComplete()
+// Completes the request
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::RequestComplete()
+    {
+    WRITELOG( "CHarvesterRequestQueue::RequestComplete()");
+ 
+    iActiveRequests--;
+    if(iActiveRequests <= -1)
+        {
+        iActiveRequests = 0;
+        }
+    
+    WRITELOG1( "CHarvesterRequestQueue::RequestComplete() - active requests: %d", iActiveRequests );
+    
+    // clean completed request and possibly process next
+    if ( !IsActive() && !iShutdown )
+        {  
+        SetActive();
+        TRequestStatus* statusPtr = &iStatus;
+        User::RequestComplete( statusPtr, KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::ForceRequests()
+// ---------------------------------------------------------------------------
+//
+void CHarvesterRequestQueue::ForceRequests()
+    {
+    WRITELOG( "CHarvesterRequestQueue::ForceRequests()");
+    
+    Cancel();
+    
+    for ( TInt i = 0; i < iRequests.Count(); i++ )
+        {
+        CHarvesterRequestActive* request = iRequests[i];
+        // remove completed tasks    
+        if ( request->RequestCompleted() )
+            {
+            // delete completed task
+            delete request;
+            iRequests.Remove( i );
+        
+            // correct the index so that no tasks are skipped
+            i--;
+            if(i <= -1)
+                {
+                i = -1;
+                }
+            }
+        else
+            {
+            iRequests[i]->ForceHarvest();
+            }
+        }
+    }
+
+// End of file