harvester/client/src/harvesterrequestqueue.cpp
changeset 1 acef663c1218
parent 0 c53acadfccc6
child 3 b73a2e62868f
equal deleted inserted replaced
0:c53acadfccc6 1:acef663c1218
    43 // ---------------------------------------------------------------------------
    43 // ---------------------------------------------------------------------------
    44 // CHarvesterRequestQueue::CHarvesterRequestQueue()
    44 // CHarvesterRequestQueue::CHarvesterRequestQueue()
    45 // C++ default constructor can NOT contain any code, that might leave.
    45 // C++ default constructor can NOT contain any code, that might leave.
    46 // ---------------------------------------------------------------------------
    46 // ---------------------------------------------------------------------------
    47 //
    47 //
    48 CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityStandard )
    48 CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityUserInput )
    49     {
    49     {
    50     CActiveScheduler::Add( this );
    50     CActiveScheduler::Add( this );
    51     }
    51     }
    52 
    52 
    53 
    53 
   117 void CHarvesterRequestQueue::RunL()
   117 void CHarvesterRequestQueue::RunL()
   118     {
   118     {
   119     WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d",
   119     WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d",
   120                iRequests.Count(), iActiveRequests );
   120                iRequests.Count(), iActiveRequests );
   121     
   121     
   122     CHarvesterRequestActive* selectedRequest = NULL;
   122     const TInt status = iStatus.Int();
   123     
   123 
   124     for ( TInt i = 0; i < iRequests.Count(); i++ )
   124     if ( status >= KErrNone && !iShutdown )
   125         {
   125         {
   126         CHarvesterRequestActive* request = iRequests[i];
   126         CHarvesterRequestActive* selectedRequest = NULL;
       
   127     
       
   128         for ( TInt i = 0; i < iRequests.Count(); i++ )
       
   129             {
       
   130             CHarvesterRequestActive* request = iRequests[i];
   127         
   131         
   128         // remove completed tasks    
   132             // remove completed tasks    
   129         if ( request->RequestCompleted() && !request->IsActive() )
   133             if ( !request || (request->RequestCompleted() && !request->IsActive()) )
   130             {
   134                 {
   131             // delete completed task
   135                 // delete completed task
   132             delete request;
   136                 delete request;
   133             iRequests.Remove( i );
   137                 request = NULL;
       
   138                 iRequests.Remove( i );
   134             
   139             
   135             // correct the index so that no tasks are skipped
   140                 // correct the index so that no tasks are skipped
   136             i--;
   141                 i--;
   137             if(i <= -1)
   142                 if(i <= -1)
       
   143                     {
       
   144                     i = -1;
       
   145                     }
       
   146             
       
   147                 WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
       
   148                 }
       
   149             // select priorised task
       
   150             else
   138                 {
   151                 {
   139                 i = -1;
   152                 // not yet activated
       
   153                 if( !request->IsActive() )
       
   154                      {
       
   155                     selectedRequest = request;
       
   156                     break;
       
   157                     }
   140                 }
   158                 }
   141             
   159             }
   142             WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
   160 
   143             }
   161         // activate selected
   144         // select priorised task
   162         if ( selectedRequest && !iShutdown )
       
   163             {
       
   164             iActiveRequests++;
       
   165             selectedRequest->Start();
       
   166             }
       
   167  
       
   168 #ifdef _DEBUG        
       
   169         WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d",
       
   170                 iRequests.Count(), iActiveRequests );
       
   171 #endif
       
   172     
       
   173         // continue processing if needed
       
   174         if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
       
   175                 (iRequests.Count() > iActiveRequests))
       
   176             {  
       
   177             SetActive();
       
   178             TRequestStatus* statusPtr = &iStatus;
       
   179             User::RequestComplete( statusPtr, KErrNone );
       
   180             }
   145         else
   181         else
   146             {
   182             {
   147             // not yet activated
   183             iRequests.Compress();
   148             if( !request->IsActive() )
   184             }
   149                 {
   185         }
   150                 selectedRequest = request;
   186     else if( status != KErrCancel )
   151                 }
   187         {
   152             }
   188         // continue processing if needed
   153         }
   189         if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
   154 
   190                 (iRequests.Count() > iActiveRequests))
   155     // activate selected
   191             {  
   156     if ( selectedRequest )
   192             SetActive();
   157         {
   193             TRequestStatus* statusPtr = &iStatus;
   158         iActiveRequests++;
   194             User::RequestComplete( statusPtr, KErrNone );
   159         selectedRequest->Start();
   195             }
   160         }
   196         }
   161     
       
   162     WRITELOG2( "CHarvesterRequestQueue::RunL() end - requests: %d, active requests: %d",
       
   163             iRequests.Count(), iActiveRequests );
       
   164     
       
   165     // continue processing if needed
       
   166     if ( !iShutdown && (iActiveRequests < KMaxClientRequests)  && 
       
   167             (iRequests.Count() > iActiveRequests))
       
   168         {  
       
   169         SetActive();
       
   170         TRequestStatus* statusPtr = &iStatus;
       
   171         User::RequestComplete( statusPtr, KErrNone );
       
   172         }
       
   173     else
       
   174     	{
       
   175     	iRequests.Compress();
       
   176     	}
       
   177     }
   197     }
   178 
   198 
   179 // ---------------------------------------------------------------------------
   199 // ---------------------------------------------------------------------------
   180 // Handle any error from RunL
   200 // Handle any error from RunL
   181 // ---------------------------------------------------------------------------
   201 // ---------------------------------------------------------------------------
   201 // ---------------------------------------------------------------------------
   221 // ---------------------------------------------------------------------------
   202 //
   222 //
   203 void CHarvesterRequestQueue::DoCancel()
   223 void CHarvesterRequestQueue::DoCancel()
   204     {
   224     {
   205     WRITELOG( "CHarvesterRequestQueue::DoCancel()");
   225     WRITELOG( "CHarvesterRequestQueue::DoCancel()");
   206     
   226 
   207     for( TInt i(0); i < iRequests.Count(); i++ )
       
   208         {
       
   209         iRequests[i]->Cancel();
       
   210         }
       
   211     
       
   212     iShutdown = ETrue;
   227     iShutdown = ETrue;
       
   228     
       
   229     const TInt count( iRequests.Count() );
       
   230     for( TInt i = 0; i < count; i++ )
       
   231         {
       
   232         CHarvesterRequestActive* request = iRequests[i];
       
   233         if( request )
       
   234             {
       
   235             request->Cancel();
       
   236             }
       
   237         }
   213     }
   238     }
   214 
   239 
   215 
   240 
   216 // ---------------------------------------------------------------------------
   241 // ---------------------------------------------------------------------------
   217 // CHarvesterRequestQueue::RequestComplete()
   242 // CHarvesterRequestQueue::RequestComplete()
   245 //
   270 //
   246 void CHarvesterRequestQueue::ForceRequests()
   271 void CHarvesterRequestQueue::ForceRequests()
   247     {
   272     {
   248     WRITELOG( "CHarvesterRequestQueue::ForceRequests()");
   273     WRITELOG( "CHarvesterRequestQueue::ForceRequests()");
   249     
   274     
   250     Cancel();
       
   251     
       
   252     for ( TInt i = 0; i < iRequests.Count(); i++ )
   275     for ( TInt i = 0; i < iRequests.Count(); i++ )
   253         {
   276         {
   254         CHarvesterRequestActive* request = iRequests[i];
   277         CHarvesterRequestActive* request = iRequests[i];
   255         // remove completed tasks    
   278           
   256         if ( request->RequestCompleted() )
   279         if ( request && !request->RequestCompleted() )
   257             {
   280             {
   258             // delete completed task
   281 			request->ForceHarvest();
   259             delete request;
   282 			}
   260             iRequests.Remove( i );
   283         // delete completed task
       
   284         delete request;
       
   285         request = NULL;
       
   286         iRequests.Remove( i );
   261         
   287         
   262             // correct the index so that no tasks are skipped
   288         // correct the index so that no tasks are skipped
   263             i--;
   289         i--;
   264             if(i <= -1)
   290         if(i <= -1)
   265                 {
   291             {
   266                 i = -1;
   292             i = -1;
   267                 }
   293             }
   268             }
   294         }
   269         else
   295     }
   270             {
   296 
   271             iRequests[i]->ForceHarvest();
   297 // ---------------------------------------------------------------------------
   272             }
   298 // CHarvesterRequestQueue::DoCancel()
   273         }
   299 // ---------------------------------------------------------------------------
       
   300 //
       
   301 TBool CHarvesterRequestQueue::RequestsPending()
       
   302     {
       
   303     if( iRequests.Count() > 0 )
       
   304         {
       
   305         return ETrue;
       
   306         }
       
   307     return EFalse;
   274     }
   308     }
   275 
   309 
   276 // End of file
   310 // End of file
       
   311