harvester/client/src/harvesterrequestqueue.cpp
changeset 0 c53acadfccc6
child 1 acef663c1218
equal deleted inserted replaced
-1:000000000000 0:c53acadfccc6
       
     1 /*
       
     2 * Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Processor object for running harvester requests
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "harvesterrequestqueue.h"
       
    20 #include "harvesterrequestactive.h"
       
    21 #include "harvesterlog.h"
       
    22 
       
    23 // maximum number of active client requests ( 18 burst images + 1 video )
       
    24 const TUint KMaxClientRequests = 19;
       
    25 
       
    26 // ======== MEMBER FUNCTIONS ========
       
    27 
       
    28 // ---------------------------------------------------------------------------
       
    29 // CHarvesterRequestQueue::NewL()
       
    30 // Two-phased constructor.
       
    31 // ---------------------------------------------------------------------------
       
    32 //
       
    33 CHarvesterRequestQueue* CHarvesterRequestQueue::NewL()
       
    34     {
       
    35     CHarvesterRequestQueue* self = new( ELeave )CHarvesterRequestQueue();
       
    36     CleanupStack::PushL( self );
       
    37     self->ConstructL();
       
    38     CleanupStack::Pop( self );
       
    39     return self;
       
    40     }
       
    41 
       
    42 
       
    43 // ---------------------------------------------------------------------------
       
    44 // CHarvesterRequestQueue::CHarvesterRequestQueue()
       
    45 // C++ default constructor can NOT contain any code, that might leave.
       
    46 // ---------------------------------------------------------------------------
       
    47 //
       
    48 CHarvesterRequestQueue::CHarvesterRequestQueue(): CActive( CActive::EPriorityStandard )
       
    49     {
       
    50     CActiveScheduler::Add( this );
       
    51     }
       
    52 
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // CHarvesterRequestQueue::ConstructL()
       
    56 // Symbian 2nd phase constructor can leave.
       
    57 // ---------------------------------------------------------------------------
       
    58 //
       
    59 void CHarvesterRequestQueue::ConstructL()
       
    60     {
       
    61     iActiveRequests = 0;
       
    62     iShutdown = EFalse;
       
    63     }
       
    64 
       
    65 
       
    66 // ---------------------------------------------------------------------------
       
    67 // CHarvesterRequestQueue::~CHarvesterRequestQueue()
       
    68 // Destructor.
       
    69 // ---------------------------------------------------------------------------
       
    70 //
       
    71 CHarvesterRequestQueue::~CHarvesterRequestQueue()
       
    72     {
       
    73     WRITELOG( "CHarvesterRequestQueue::~CHarvesterRequestQueue()");
       
    74     
       
    75     Cancel();
       
    76     iRequests.ResetAndDestroy();
       
    77     
       
    78     WRITELOG( "CHarvesterRequestQueue::~CHarvesterRequestQueue() - All requests deleted");
       
    79     }
       
    80 
       
    81 
       
    82 // ---------------------------------------------------------------------------
       
    83 // CHarvesterRequestQueue::Process()
       
    84 // Activates next request if possible.
       
    85 // ---------------------------------------------------------------------------
       
    86 //
       
    87 void CHarvesterRequestQueue::Process()
       
    88     {
       
    89     WRITELOG( "CHarvesterRequestQueue::Process()");
       
    90 
       
    91     if ( !IsActive() && !iShutdown && (iActiveRequests < KMaxClientRequests) )
       
    92         {  
       
    93         SetActive();
       
    94         TRequestStatus* statusPtr = &iStatus;
       
    95         User::RequestComplete( statusPtr, KErrNone );
       
    96         }
       
    97     }
       
    98 
       
    99 
       
   100 // ---------------------------------------------------------------------------
       
   101 // CHarvesterRequestQueue::AddRequestL()
       
   102 // Adds new request to the queue.
       
   103 // ---------------------------------------------------------------------------
       
   104 //
       
   105 void CHarvesterRequestQueue::AddRequestL( CHarvesterRequestActive* aRequest )
       
   106     {
       
   107     WRITELOG( "CHarvesterRequestQueue::AddRequestL()");
       
   108     
       
   109     iRequests.AppendL( aRequest );
       
   110     }
       
   111 
       
   112 
       
   113 // ---------------------------------------------------------------------------
       
   114 // CHarvesterRequestQueue::RunL()
       
   115 // ---------------------------------------------------------------------------
       
   116 //
       
   117 void CHarvesterRequestQueue::RunL()
       
   118     {
       
   119     WRITELOG2( "CHarvesterRequestQueue::RunL() begin - requests: %d, active requests: %d",
       
   120                iRequests.Count(), iActiveRequests );
       
   121     
       
   122     CHarvesterRequestActive* selectedRequest = NULL;
       
   123     
       
   124     for ( TInt i = 0; i < iRequests.Count(); i++ )
       
   125         {
       
   126         CHarvesterRequestActive* request = iRequests[i];
       
   127         
       
   128         // remove completed tasks    
       
   129         if ( request->RequestCompleted() && !request->IsActive() )
       
   130             {
       
   131             // delete completed task
       
   132             delete request;
       
   133             iRequests.Remove( i );
       
   134             
       
   135             // correct the index so that no tasks are skipped
       
   136             i--;
       
   137             if(i <= -1)
       
   138                 {
       
   139                 i = -1;
       
   140                 }
       
   141             
       
   142             WRITELOG( "CHarvesterRequestQueue::RunL() - removing completed request");
       
   143             }
       
   144         // select priorised task
       
   145         else
       
   146             {
       
   147             // not yet activated
       
   148             if( !request->IsActive() )
       
   149                 {
       
   150                 selectedRequest = request;
       
   151                 }
       
   152             }
       
   153         }
       
   154 
       
   155     // activate selected
       
   156     if ( selectedRequest )
       
   157         {
       
   158         iActiveRequests++;
       
   159         selectedRequest->Start();
       
   160         }
       
   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     }
       
   178 
       
   179 // ---------------------------------------------------------------------------
       
   180 // Handle any error from RunL
       
   181 // ---------------------------------------------------------------------------
       
   182 //
       
   183 TInt CHarvesterRequestQueue::RunError( TInt aError )
       
   184     {
       
   185     WRITELOG1( "CHarvesterRequestQueue::RunError() - %d", aError);
       
   186     
       
   187     if (aError)
       
   188         {
       
   189         iActiveRequests--;
       
   190         if(iActiveRequests <= -1)
       
   191             {
       
   192             iActiveRequests = 0;
       
   193             }
       
   194         }
       
   195     
       
   196     return KErrNone;
       
   197     }
       
   198 
       
   199 // ---------------------------------------------------------------------------
       
   200 // CHarvesterRequestQueue::DoCancel()
       
   201 // ---------------------------------------------------------------------------
       
   202 //
       
   203 void CHarvesterRequestQueue::DoCancel()
       
   204     {
       
   205     WRITELOG( "CHarvesterRequestQueue::DoCancel()");
       
   206     
       
   207     for( TInt i(0); i < iRequests.Count(); i++ )
       
   208         {
       
   209         iRequests[i]->Cancel();
       
   210         }
       
   211     
       
   212     iShutdown = ETrue;
       
   213     }
       
   214 
       
   215 
       
   216 // ---------------------------------------------------------------------------
       
   217 // CHarvesterRequestQueue::RequestComplete()
       
   218 // Completes the request
       
   219 // ---------------------------------------------------------------------------
       
   220 //
       
   221 void CHarvesterRequestQueue::RequestComplete()
       
   222     {
       
   223     WRITELOG( "CHarvesterRequestQueue::RequestComplete()");
       
   224  
       
   225     iActiveRequests--;
       
   226     if(iActiveRequests <= -1)
       
   227         {
       
   228         iActiveRequests = 0;
       
   229         }
       
   230     
       
   231     WRITELOG1( "CHarvesterRequestQueue::RequestComplete() - active requests: %d", iActiveRequests );
       
   232     
       
   233     // clean completed request and possibly process next
       
   234     if ( !IsActive() && !iShutdown )
       
   235         {  
       
   236         SetActive();
       
   237         TRequestStatus* statusPtr = &iStatus;
       
   238         User::RequestComplete( statusPtr, KErrNone );
       
   239         }
       
   240     }
       
   241 
       
   242 // ---------------------------------------------------------------------------
       
   243 // CHarvesterRequestQueue::ForceRequests()
       
   244 // ---------------------------------------------------------------------------
       
   245 //
       
   246 void CHarvesterRequestQueue::ForceRequests()
       
   247     {
       
   248     WRITELOG( "CHarvesterRequestQueue::ForceRequests()");
       
   249     
       
   250     Cancel();
       
   251     
       
   252     for ( TInt i = 0; i < iRequests.Count(); i++ )
       
   253         {
       
   254         CHarvesterRequestActive* request = iRequests[i];
       
   255         // remove completed tasks    
       
   256         if ( request->RequestCompleted() )
       
   257             {
       
   258             // delete completed task
       
   259             delete request;
       
   260             iRequests.Remove( i );
       
   261         
       
   262             // correct the index so that no tasks are skipped
       
   263             i--;
       
   264             if(i <= -1)
       
   265                 {
       
   266                 i = -1;
       
   267                 }
       
   268             }
       
   269         else
       
   270             {
       
   271             iRequests[i]->ForceHarvest();
       
   272             }
       
   273         }
       
   274     }
       
   275 
       
   276 // End of file