harvester/client/src/harvesterrequestqueue.cpp
changeset 1 acef663c1218
parent 0 c53acadfccc6
child 3 b73a2e62868f
--- a/harvester/client/src/harvesterrequestqueue.cpp	Mon Jan 18 20:34:07 2010 +0200
+++ b/harvester/client/src/harvesterrequestqueue.cpp	Tue Jan 26 12:13:20 2010 +0200
@@ -45,7 +45,7 @@
 // C++ default constructor can NOT contain any code, that might leave.
 // ---------------------------------------------------------------------------
 //
-CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityStandard )
+CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityUserInput )
     {
     CActiveScheduler::Add( this );
     }
@@ -119,61 +119,81 @@
     WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d",
                iRequests.Count(), iActiveRequests );
     
-    CHarvesterRequestActive* selectedRequest = NULL;
-    
-    for ( TInt i = 0; i < iRequests.Count(); i++ )
+    const TInt status = iStatus.Int();
+
+    if ( status >= KErrNone && !iShutdown )
         {
-        CHarvesterRequestActive* request = iRequests[i];
-        
-        // remove completed tasks    
-        if ( request->RequestCompleted() && !request->IsActive() )
+        CHarvesterRequestActive* selectedRequest = NULL;
+    
+        for ( TInt i = 0; i < iRequests.Count(); i++ )
             {
-            // delete completed task
-            delete request;
-            iRequests.Remove( i );
+            CHarvesterRequestActive* request = iRequests[i];
+        
+            // remove completed tasks    
+            if ( !request || (request->RequestCompleted() && !request->IsActive()) )
+                {
+                // delete completed task
+                delete request;
+                request = NULL;
+                iRequests.Remove( i );
+            
+                // correct the index so that no tasks are skipped
+                i--;
+                if(i <= -1)
+                    {
+                    i = -1;
+                    }
             
-            // correct the index so that no tasks are skipped
-            i--;
-            if(i <= -1)
+                WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
+                }
+            // select priorised task
+            else
                 {
-                i = -1;
+                // not yet activated
+                if( !request->IsActive() )
+                     {
+                    selectedRequest = request;
+                    break;
+                    }
                 }
-            
-            WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
+            }
+
+        // activate selected
+        if ( selectedRequest && !iShutdown )
+            {
+            iActiveRequests++;
+            selectedRequest->Start();
             }
-        // select priorised task
+ 
+#ifdef _DEBUG        
+        WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d",
+                iRequests.Count(), iActiveRequests );
+#endif
+    
+        // continue processing if needed
+        if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
+                (iRequests.Count() > iActiveRequests))
+            {  
+            SetActive();
+            TRequestStatus* statusPtr = &iStatus;
+            User::RequestComplete( statusPtr, KErrNone );
+            }
         else
             {
-            // not yet activated
-            if( !request->IsActive() )
-                {
-                selectedRequest = request;
-                }
+            iRequests.Compress();
             }
         }
-
-    // activate selected
-    if ( selectedRequest )
+    else if( status != KErrCancel )
         {
-        iActiveRequests++;
-        selectedRequest->Start();
+        // continue processing if needed
+        if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
+                (iRequests.Count() > iActiveRequests))
+            {  
+            SetActive();
+            TRequestStatus* statusPtr = &iStatus;
+            User::RequestComplete( statusPtr, KErrNone );
+            }
         }
-    
-    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();
-    	}
     }
 
 // ---------------------------------------------------------------------------
@@ -203,13 +223,18 @@
 void CHarvesterRequestQueue::DoCancel()
     {
     WRITELOG( "CHarvesterRequestQueue::DoCancel()");
+
+    iShutdown = ETrue;
     
-    for( TInt i(0); i < iRequests.Count(); i++ )
+    const TInt count( iRequests.Count() );
+    for( TInt i = 0; i < count; i++ )
         {
-        iRequests[i]->Cancel();
+        CHarvesterRequestActive* request = iRequests[i];
+        if( request )
+            {
+            request->Cancel();
+            }
         }
-    
-    iShutdown = ETrue;
     }
 
 
@@ -247,30 +272,40 @@
     {
     WRITELOG( "CHarvesterRequestQueue::ForceRequests()");
     
-    Cancel();
-    
     for ( TInt i = 0; i < iRequests.Count(); i++ )
         {
         CHarvesterRequestActive* request = iRequests[i];
-        // remove completed tasks    
-        if ( request->RequestCompleted() )
+          
+        if ( request && !request->RequestCompleted() )
             {
-            // delete completed task
-            delete request;
-            iRequests.Remove( i );
+			request->ForceHarvest();
+			}
+        // delete completed task
+        delete request;
+        request = NULL;
+        iRequests.Remove( i );
         
-            // correct the index so that no tasks are skipped
-            i--;
-            if(i <= -1)
-                {
-                i = -1;
-                }
-            }
-        else
+        // correct the index so that no tasks are skipped
+        i--;
+        if(i <= -1)
             {
-            iRequests[i]->ForceHarvest();
+            i = -1;
             }
         }
     }
 
+// ---------------------------------------------------------------------------
+// CHarvesterRequestQueue::DoCancel()
+// ---------------------------------------------------------------------------
+//
+TBool CHarvesterRequestQueue::RequestsPending()
+    {
+    if( iRequests.Count() > 0 )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
 // End of file
+