imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
equal deleted inserted replaced
42:2e2a89493e2b 54:48dd0f169f0d
     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 thumbnail requests
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "thumbnailrequestqueue.h"
       
    20 #include "thumbnailrequestactive.h"
       
    21 #include "thumbnaillog.h"
       
    22 #include "OstTraceDefinitions.h"
       
    23 #ifdef OST_TRACE_COMPILER_IN_USE
       
    24 #include "thumbnailrequestqueueTraces.h"
       
    25 #endif
       
    26 
       
    27 
       
    28 
       
    29 // ======== MEMBER FUNCTIONS ========
       
    30 
       
    31 // ---------------------------------------------------------------------------
       
    32 // CThumbnailRequestQueue::NewL()
       
    33 // Two-phased constructor.
       
    34 // ---------------------------------------------------------------------------
       
    35 //
       
    36 CThumbnailRequestQueue* CThumbnailRequestQueue::NewL()
       
    37     {
       
    38     CThumbnailRequestQueue* self = new( ELeave )CThumbnailRequestQueue();
       
    39     CleanupStack::PushL( self );
       
    40     self->ConstructL();
       
    41     CleanupStack::Pop( self );
       
    42     return self;
       
    43     }
       
    44 
       
    45 
       
    46 // ---------------------------------------------------------------------------
       
    47 // CThumbnailRequestQueue::CThumbnailRequestQueue()
       
    48 // C++ default constructor can NOT contain any code, that might leave.
       
    49 // ---------------------------------------------------------------------------
       
    50 //
       
    51 CThumbnailRequestQueue::CThumbnailRequestQueue()
       
    52     {
       
    53     }
       
    54 
       
    55 
       
    56 // ---------------------------------------------------------------------------
       
    57 // CThumbnailRequestQueue::ConstructL()
       
    58 // Symbian 2nd phase constructor can leave.
       
    59 // ---------------------------------------------------------------------------
       
    60 //
       
    61 void CThumbnailRequestQueue::ConstructL()
       
    62     {
       
    63     iActiveRequests = 0;
       
    64     }
       
    65 
       
    66 
       
    67 // ---------------------------------------------------------------------------
       
    68 // CThumbnailRequestQueue::~CThumbnailRequestQueue()
       
    69 // Destructor.
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 CThumbnailRequestQueue::~CThumbnailRequestQueue()
       
    73     {
       
    74     TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue()");
       
    75     OstTrace0( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_CTHUMBNAILREQUESTQUEUE, "CThumbnailRequestQueue::~CThumbnailRequestQueue" );
       
    76     
       
    77     iRequests.ResetAndDestroy();
       
    78     
       
    79     TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue() - All requests deleted");
       
    80     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILREQUESTQUEUE_CTHUMBNAILREQUESTQUEUE, "CThumbnailRequestQueue::~CThumbnailRequestQueue - All requests deleted" );
       
    81     }
       
    82 
       
    83 
       
    84 // ---------------------------------------------------------------------------
       
    85 // CThumbnailRequestQueue::Process()
       
    86 // Activates next request if possible.
       
    87 // ---------------------------------------------------------------------------
       
    88 //
       
    89 void CThumbnailRequestQueue::Process()
       
    90     {
       
    91     TN_DEBUG1( "CThumbnailRequestQueue::Process()");
       
    92     OstTrace0( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process" );
       
    93     
       
    94     while ( (iActiveRequests < KMaxClientRequests) &&
       
    95             (iRequests.Count() > iActiveRequests) )
       
    96         {             
       
    97         CThumbnailRequestActive* selectedRequest = NULL;
       
    98         TInt priority( KMinTInt );
       
    99         TInt reqPriority;
       
   100         CThumbnailRequestActive* request = NULL;
       
   101         
       
   102         for ( TInt i = 0; i < iRequests.Count(); i++ )
       
   103            {
       
   104            request = iRequests[i];
       
   105 
       
   106            // this task is not yet activated or processed
       
   107            if( request && !request->RequestCompleted() && !request->IsRequestActive()  )
       
   108                {
       
   109                TN_DEBUG4( "CThumbnailRequestQueue::Process() - candidate at %d, id = %d, (0x%08x)", i, 
       
   110                        request->RequestId(), 
       
   111                        request);
       
   112                OstTrace1( TRACE_NORMAL, DUP4_CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process;request->RequestId()=%u", request->RequestId() );
       
   113                OstTrace1( TRACE_NORMAL, DUP5_CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process;request=%o", request );
       
   114                
       
   115                reqPriority = request->Priority();
       
   116                if ( reqPriority > priority )
       
   117                    {
       
   118                    priority = reqPriority;
       
   119                    selectedRequest = request;
       
   120                    }
       
   121                }
       
   122            }
       
   123         
       
   124         // activate selected
       
   125         if ( selectedRequest )
       
   126            {
       
   127            TN_DEBUG1( "CThumbnailRequestQueue::Process() - starting next request");
       
   128            OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process - starting next request" );
       
   129                     
       
   130            iActiveRequests++;
       
   131            
       
   132            TRAPD(err, selectedRequest->StartL());
       
   133            if (err != KErrNone)
       
   134                {
       
   135                TN_DEBUG1( "CThumbnailRequestQueue::Process() - starting request failed");
       
   136                OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process - starting request failed" );
       
   137                
       
   138                selectedRequest->StartError(err);
       
   139                }
       
   140            }
       
   141          else
       
   142             {
       
   143             break;
       
   144             }
       
   145         }
       
   146     
       
   147     TN_DEBUG3( "CThumbnailRequestQueue::Process() end - requests: %d, active requests: %d",
       
   148                iRequests.Count(), iActiveRequests );
       
   149     OstTraceExt2( TRACE_NORMAL, DUP3_CTHUMBNAILREQUESTQUEUE_PROCESS, "CThumbnailRequestQueue::Process;iRequests.Count()=%d;iActiveRequests=%d", iRequests.Count(), iActiveRequests );
       
   150     }
       
   151 
       
   152 
       
   153 // ---------------------------------------------------------------------------
       
   154 // CThumbnailRequestQueue::AddRequestL()
       
   155 // Adds new request to the queue.
       
   156 // ---------------------------------------------------------------------------
       
   157 //
       
   158 void CThumbnailRequestQueue::AddRequestL( CThumbnailRequestActive* aRequest )
       
   159     {
       
   160     RemoveCompleted(NULL);
       
   161     iRequests.AppendL( aRequest );
       
   162     
       
   163     TN_DEBUG3( "CThumbnailRequestQueue::AddRequestL() end - requests: %d, active requests: %d",
       
   164                iRequests.Count(), iActiveRequests );
       
   165     OstTraceExt2( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_ADDREQUESTL, "CThumbnailRequestQueue::AddRequestL;iRequests.Count()=%d;iActiveRequests=%d", iRequests.Count(), iActiveRequests );
       
   166     }
       
   167 
       
   168 void CThumbnailRequestQueue::RemoveCompleted( CThumbnailRequestActive* aRequestAO)
       
   169     {       
       
   170     //process completed queue and remove finished tasks
       
   171     for ( TInt i = iRequests.Count() -1; i >= 0 && iRequests.Count(); i-- )
       
   172          {
       
   173          CThumbnailRequestActive* request = iRequests[i];
       
   174          
       
   175          // remove completed task if it's not active anymore and not this
       
   176          if ( request->RequestCompleted() && !request->IsRequestActive() && aRequestAO != request)
       
   177              {
       
   178              // delete completed task
       
   179              TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() - deleted id = %d (0x%08x)", request->RequestId(), request);
       
   180              OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILREQUESTQUEUE_REMOVECOMPLETED, "CThumbnailRequestQueue::RemoveCompleted;request=%o", request );
       
   181              OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILREQUESTQUEUE_REMOVECOMPLETED, "CThumbnailRequestQueue::RemoveCompleted;request->RequestId()=%u", request->RequestId() );
       
   182              
       
   183              delete request;
       
   184              request = NULL;
       
   185              iRequests.Remove( i );
       
   186              }
       
   187          }
       
   188     
       
   189     if(!iRequests.Count())
       
   190         {
       
   191         iRequests.Compress();
       
   192         }
       
   193      
       
   194      TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() end - requests: %d, active requests: %d",
       
   195                     iRequests.Count(), iActiveRequests );
       
   196      OstTraceExt2( TRACE_NORMAL, DUP3_CTHUMBNAILREQUESTQUEUE_REMOVECOMPLETED, "CThumbnailRequestQueue::RemoveCompleted;iRequests.Count()=%d;iActiveRequests=%d", iRequests.Count(), iActiveRequests );
       
   197     }
       
   198 
       
   199 
       
   200 // ---------------------------------------------------------------------------
       
   201 // CThumbnailRequestQueue::CancelRequest()
       
   202 // Removes specific request from the queue.
       
   203 // ---------------------------------------------------------------------------
       
   204 //
       
   205 TInt CThumbnailRequestQueue::CancelRequest( const TThumbnailRequestId aRequestId )
       
   206     {
       
   207     TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - request ID: %d", aRequestId);
       
   208     OstTrace1( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_CANCELREQUEST, "CThumbnailRequestQueue::CancelRequest;aRequestId=%u", aRequestId );
       
   209     
       
   210     TInt res = KErrNotFound;
       
   211 
       
   212     for ( TInt i = iRequests.Count(); --i >= 0; )
       
   213         {
       
   214         CThumbnailRequestActive* request = iRequests[i];
       
   215         if ( request->RequestId() == aRequestId )
       
   216             {
       
   217             if (iRequests[i]->IsActive()) 
       
   218                 {
       
   219                 // this doesn't yet actually cancel/complete the AO
       
   220                 iRequests[i]->AsyncCancel();
       
   221                 
       
   222                 TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - canceled request ID: %d", aRequestId);
       
   223                 OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILREQUESTQUEUE_CANCELREQUEST, "CThumbnailRequestQueue::CancelRequest;aRequestId=%u", aRequestId );
       
   224                 }
       
   225             else
       
   226                 {
       
   227                 delete request;
       
   228                 request = NULL;
       
   229                 iRequests.Remove( i );
       
   230                           
       
   231                 TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - removed request ID: %d", aRequestId);
       
   232                 OstTrace1( TRACE_NORMAL, DUP2_CTHUMBNAILREQUESTQUEUE_CANCELREQUEST, "CThumbnailRequestQueue::CancelRequest;aRequestId=%u", aRequestId );
       
   233                 }
       
   234 
       
   235             res = KErrNone;
       
   236             break;
       
   237             }
       
   238         }
       
   239     
       
   240 	RemoveCompleted(NULL);
       
   241 	
       
   242     Process();
       
   243     
       
   244     return res;
       
   245     }
       
   246 
       
   247 
       
   248 // ---------------------------------------------------------------------------
       
   249 // CThumbnailRequestQueue::ChangeReqPriority()
       
   250 // Changes priority of a request.
       
   251 // ---------------------------------------------------------------------------
       
   252 //
       
   253 TInt CThumbnailRequestQueue::ChangePriority( const TThumbnailRequestId aRequestId,
       
   254                                              const TInt aNewPriority )
       
   255     {
       
   256     TN_DEBUG1( "CThumbnailRequestQueue::ChangePriority()");
       
   257     OstTrace0( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_CHANGEPRIORITY, "CThumbnailRequestQueue::ChangePriority" );
       
   258     
       
   259     TInt err = KErrNotFound;
       
   260     const TInt count = iRequests.Count();
       
   261     
       
   262     for ( TInt i( 0 ); i < count; i++ )
       
   263         {
       
   264         if ( iRequests[i]->RequestId() == aRequestId )
       
   265             {
       
   266             iRequests[i]->ChangePriority( aNewPriority );
       
   267             
       
   268             err = KErrNone;
       
   269             break;
       
   270             }
       
   271         }
       
   272     
       
   273     return err;
       
   274     }
       
   275 
       
   276 
       
   277 // ---------------------------------------------------------------------------
       
   278 // CThumbnailRequestQueue::RequestComplete()
       
   279 // Completes the request
       
   280 // ---------------------------------------------------------------------------
       
   281 //
       
   282 void CThumbnailRequestQueue::RequestComplete(CThumbnailRequestActive* aRequestAO)
       
   283     {
       
   284     TN_DEBUG2( "CThumbnailRequestQueue::RequestComplete(0x%08x)", aRequestAO);
       
   285     OstTrace1( TRACE_NORMAL, CTHUMBNAILREQUESTQUEUE_REQUESTCOMPLETE, "CThumbnailRequestQueue::RequestComplete;aRequestAO=%o", aRequestAO );
       
   286     
       
   287     iActiveRequests--;
       
   288     if(iActiveRequests <= -1)
       
   289         {
       
   290         iActiveRequests = 0;
       
   291         }
       
   292     
       
   293     RemoveCompleted( aRequestAO );
       
   294     
       
   295     Process();
       
   296     }
       
   297 
       
   298 
       
   299 // End of file