diff -r 000000000000 -r 2014ca87e772 imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imagehandlingutilities/thumbnailmanager/thumbnailclient/src/thumbnailrequestqueue.cpp Tue Jan 26 15:18:05 2010 +0200 @@ -0,0 +1,278 @@ +/* +* 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 thumbnail requests +* +*/ + + +#include "thumbnailrequestqueue.h" +#include "thumbnailrequestactive.h" +#include "thumbnaillog.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::NewL() +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CThumbnailRequestQueue* CThumbnailRequestQueue::NewL() + { + CThumbnailRequestQueue* self = new( ELeave )CThumbnailRequestQueue(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::CThumbnailRequestQueue() +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CThumbnailRequestQueue::CThumbnailRequestQueue() + { + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::ConstructL() +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CThumbnailRequestQueue::ConstructL() + { + iActiveRequests = 0; + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::~CThumbnailRequestQueue() +// Destructor. +// --------------------------------------------------------------------------- +// +CThumbnailRequestQueue::~CThumbnailRequestQueue() + { + TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue()"); + + iRequests.ResetAndDestroy(); + + TN_DEBUG1( "CThumbnailRequestQueue::~CThumbnailRequestQueue() - All requests deleted"); + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::Process() +// Activates next request if possible. +// --------------------------------------------------------------------------- +// +void CThumbnailRequestQueue::Process() + { + TN_DEBUG1( "CThumbnailRequestQueue::Process()"); + + while ( (iActiveRequests < KMaxClientRequests) && + (iRequests.Count() > iActiveRequests) ) + { + CThumbnailRequestActive* selectedRequest = NULL; + TInt priority( KMinTInt ); + TInt reqPriority; + CThumbnailRequestActive* request = NULL; + + for ( TInt i = 0; i < iRequests.Count(); i++ ) + { + request = iRequests[i]; + + // this task is not yet activated or processed + if( request && !request->RequestCompleted() && !request->IsRequestActive() ) + { + TN_DEBUG4( "CThumbnailRequestQueue::Process() - candidate at %d, id = %d, (0x%08x)", i, + request->RequestId(), + request); + reqPriority = request->Priority(); + if ( reqPriority > priority ) + { + priority = reqPriority; + selectedRequest = request; + } + } + } + + // activate selected + if ( selectedRequest ) + { + TN_DEBUG1( "CThumbnailRequestQueue::Process() - starting next request"); + + TRAPD(err, selectedRequest->StartL()); + if (err != KErrNone) + { + iActiveRequests++; + } + } + else + { + break; + } + } + + TN_DEBUG3( "CThumbnailRequestQueue::Process() end - requests: %d, active requests: %d", + iRequests.Count(), iActiveRequests ); + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::AddRequestL() +// Adds new request to the queue. +// --------------------------------------------------------------------------- +// +void CThumbnailRequestQueue::AddRequestL( CThumbnailRequestActive* aRequest ) + { + TN_DEBUG3( "CThumbnailRequestQueue::AddRequestL() - requests: %d, active requests: %d", + iRequests.Count(), iActiveRequests ); + + RemoveCompleted(NULL); + iRequests.AppendL( aRequest ); + } + +void CThumbnailRequestQueue::RemoveCompleted( CThumbnailRequestActive* aRequestAO) + { + TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() - begin - requests: %d, active requests: %d", + iRequests.Count(), iActiveRequests ); + + //process completed queue and remove finished tasks + for ( TInt i = iRequests.Count() -1; i >= 0 && iRequests.Count(); i-- ) + { + CThumbnailRequestActive* request = iRequests[i]; + + // remove completed task if it's not active anymore and not this + if ( request->RequestCompleted() && !request->IsRequestActive() && aRequestAO != request) + { + // delete completed task + TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() - deleted id = %d (0x%08x)", request->RequestId(), request); + delete request; + iRequests.Remove( i ); + } + } + + TN_DEBUG3( "CThumbnailRequestQueue::RemoveCompleted() end - requests: %d, active requests: %d", + iRequests.Count(), iActiveRequests ); + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::CancelRequest() +// Removes specific request from the queue. +// --------------------------------------------------------------------------- +// +TInt CThumbnailRequestQueue::CancelRequest( const TThumbnailRequestId aRequestId ) + { + TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - request ID: %d", aRequestId); + + TInt res = KErrNotFound; + + for ( TInt i = iRequests.Count(); --i >= 0; ) + { + CThumbnailRequestActive* request = iRequests[i]; + if ( request->RequestId() == aRequestId ) + { + // Cancel and remove from queue + if (iRequests[i]->IsActive()) + { + iRequests[i]->Cancel(); + + iActiveRequests--; + if(iActiveRequests <= -1) + { + iActiveRequests = 0; + } + + delete request; + iRequests.Remove( i ); + + TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - canceled request ID: %d", aRequestId); + } + else + { + delete request; + iRequests.Remove( i ); + + TN_DEBUG2( "CThumbnailRequestQueue::CancelRequest() - removed request ID: %d", aRequestId); + } + + res = KErrNone; + break; + } + } + + RemoveCompleted(NULL); + + Process(); + + return res; + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::ChangeReqPriority() +// Changes priority of a request. +// --------------------------------------------------------------------------- +// +TInt CThumbnailRequestQueue::ChangePriority( const TThumbnailRequestId aRequestId, + const TInt aNewPriority ) + { + TN_DEBUG1( "CThumbnailRequestQueue::ChangePriority()"); + + TInt err = KErrNotFound; + const TInt count = iRequests.Count(); + + for ( TInt i( 0 ); i < count; i++ ) + { + if ( iRequests[i]->RequestId() == aRequestId ) + { + iRequests[i]->ChangePriority( aNewPriority ); + + err = KErrNone; + break; + } + } + + return err; + } + + +// --------------------------------------------------------------------------- +// CThumbnailRequestQueue::RequestComplete() +// Completes the request +// --------------------------------------------------------------------------- +// +void CThumbnailRequestQueue::RequestComplete(CThumbnailRequestActive* aRequestAO) + { + TN_DEBUG2( "CThumbnailRequestQueue::RequestComplete(0x%08x)", aRequestAO); + + iActiveRequests--; + if(iActiveRequests <= -1) + { + iActiveRequests = 0; + } + + RemoveCompleted( aRequestAO ); + + Process(); + + TN_DEBUG2( "CThumbnailRequestQueue::RequestComplete() end - active requests: %d", iActiveRequests ); + } + + +// End of file