commondrm/drmutility/src/DrmQueue.inl
changeset 0 95b198f216e5
--- /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