diff -r 000000000000 -r 95b198f216e5 commondrm/drmutility/src/DrmQueue.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commondrm/drmutility/src/DrmQueue.inl Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,213 @@ +/* +* 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: DRM Queue +* +*/ + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CDrmQueue +// Constructor +// ----------------------------------------------------------------------------- +// +template< class T > inline DRM::CDrmQueue< T >::CDrmQueue() : CBase() + { + } + +// ----------------------------------------------------------------------------- +// ~CDrmQueue +// Destructor +// ----------------------------------------------------------------------------- +// +template< class T > inline DRM::CDrmQueue< T >::~CDrmQueue() + { + T* payload = PopFront(); + + // Empty the queue: + while( payload ) + { + delete payload; + payload = PopFront(); + } + iSemaphore.Close(); + } + +// ----------------------------------------------------------------------------- +// CDrmQueue::ConstructL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +template< class T > inline void DRM::CDrmQueue< T >::ConstructL() + { + User::LeaveIfError( iSemaphore.CreateLocal(1) ); + } + + +// ----------------------------------------------------------------------------- +// CDrmQueue::NewLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +template< class T > inline DRM::CDrmQueue< T >* DRM::CDrmQueue< T >::NewLC() + { + DRM::CDrmQueue< T >* self( new( ELeave ) DRM::CDrmQueue< T >() ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CDrmQueue::NewL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +template< class T > inline DRM::CDrmQueue< T >* DRM::CDrmQueue< T >::NewL() + { + DRM::CDrmQueue< T >* self( DRM::CDrmQueue< T >::NewLC() ); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CDrmRightsInfoImpl::AppendToQueue +// ----------------------------------------------------------------------------- +// +template< class T > inline void DRM::CDrmQueue< T >::AppendToQueueL( T* aData ) + { + CleanupStack::PushL( aData ); + + QueueData* data( new (ELeave) QueueData ); + // insert the data into the queue object + data->iData = aData; + data->iNext = NULL; + + CleanupStack::Pop( aData ); + + // Critical area start: + iSemaphore.Wait(); + + if( !iLast ) + { + iFirst = data; + iLast = iFirst; + } + else + { + iLast->iNext = data; + iLast = data; + } + + // Critical area end + iSemaphore.Signal(); + } + +// ----------------------------------------------------------------------------- +// CDrmRightsInfoImpl::PopFront +// ----------------------------------------------------------------------------- +// +template< class T > inline T* DRM::CDrmQueue< T >::PopFront() + { + QueueData* data = NULL; + T* payload = NULL; + + // If there is nothing in the queue return NULL + if( !iFirst ) + { + return payload; + } + + // Critical area start: + iSemaphore.Wait(); + + data = iFirst; + + // Set the first and the next + iFirst = iFirst->iNext; + + // reset the pointer on data + data->iNext = NULL; + + // if there is no next in iFirst, this is the last or if there is no iFirst + if( !iFirst || !iFirst->iNext ) + { + iLast = iFirst; + } + + // Critical Area End + iSemaphore.Signal(); + + payload = data->iData; + delete data; + data = NULL; + + return payload; + } + +// ----------------------------------------------------------------------------- +// CDrmRightsInfoImpl::PopItem +// ----------------------------------------------------------------------------- +// +template< class T > inline T* DRM::CDrmQueue< T >::PopItem( TInt aId ) + { + QueueData* current( iFirst ); + QueueData* previous( NULL ); + T* payload( NULL ); + + // If there is nothing in the queue return NULL + if( !iFirst ) + { + return payload; + } + // Critical area start: + iSemaphore.Wait(); + // Iterate over all items in the queue + while ( current ) + { + if ( aId == current->iData->iOperationId ) + { + payload = current->iData; + current->iData = NULL; + if ( previous ) + { + // Previous present. So its member iNext must be updated. + previous->iNext = current->iNext; + } + else + { + // previous not present, so current was first, + // and iFirst must be updated. + iFirst = current->iNext; + } + + if ( !current->iNext ) + { + // Current was last item. So iLast must be updated. + iLast = previous; + } + current->iNext = NULL; + delete current; + break; + } + previous = current; + current = current->iNext; + } + // Critical Area End + iSemaphore.Signal(); + return payload; + } + +// End of File