mmresourcemgmt/mmresctrl/inc/mmrcutil.h
changeset 0 40261b775718
child 38 4269ca484c7b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmresourcemgmt/mmresctrl/inc/mmrcutil.h	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,378 @@
+// Copyright (c) 2007-2009 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:
+//
+
+#ifndef _MMRCUTIL_H_
+#define _MMRCUTIL_H_
+
+#include <e32base.h>
+
+template <class T>
+class RMMRCFifoQueue
+	{
+public:
+	RMMRCFifoQueue( );
+	~RMMRCFifoQueue( );
+
+	void Reset( );
+	void ResetAndDestroy();
+	TBool IsEmpty( ) const;
+	TInt Count() const;
+	T* PopAndRemove( );
+	T* PopAndRemove( TInt aIndex );
+	void PushL( T const* const  aElement );
+	T* Pop( ) const;
+	T* Pop( TInt aIndex ) const;
+	T* operator[] ( TInt aIndex ) const;
+
+private:
+	RMMRCFifoQueue( const RMMRCFifoQueue & aMMRCFifoQueue ); //not implemented
+	const RMMRCFifoQueue & operator= ( const RMMRCFifoQueue & aMMRCFifoQueue );  //not implemented
+
+private:
+	struct TListNode
+		{
+		T const*  iElement;
+		TListNode *iNext;
+
+		TListNode( T const* const aElement )
+		: iElement( aElement ), iNext(NULL) { }
+		};
+
+	TListNode *iFirst;
+	TListNode *iLast;
+	TInt iCount;
+	};
+	
+/**
+ Construct the queue.
+*/
+template <class T>
+RMMRCFifoQueue<T>::RMMRCFifoQueue( )
+	{
+	iFirst = iLast = NULL;
+	iCount = 0;
+	}
+
+/**
+ Destructor.
+*/
+template <class T>
+RMMRCFifoQueue<T>::~RMMRCFifoQueue( )
+	{
+	Reset( );
+	}
+
+
+/**
+ Delete each node without deleting the elements.
+*/
+template <class T>
+void RMMRCFifoQueue<T>::Reset( )
+	{
+	while( !IsEmpty( ) )
+		{
+		PopAndRemove( );
+		}
+	}
+
+/**
+ Delete each node and each element.
+*/
+template <class T>
+void RMMRCFifoQueue<T>::ResetAndDestroy( )
+	{
+	while( !IsEmpty( ) )
+		{
+		T* element = PopAndRemove( );
+		delete element;
+		}
+	}
+
+/**
+ Return the number of elements.
+*/
+template <class T>
+TInt RMMRCFifoQueue<T>::Count( ) const
+	{
+	return iCount;
+	}
+
+
+/**
+ Test if the queue is logically empty.
+ Return TTrue if empty, TFalse, otherwise.
+*/
+template <class T>
+TBool RMMRCFifoQueue<T>::IsEmpty( ) const
+	{
+	return iFirst == NULL;
+	}
+
+
+/**
+ Return and remove the least recently inserted item from the queue.
+*/
+template <class T>
+T* RMMRCFifoQueue<T>::PopAndRemove( )
+	{
+	T* element = NULL;
+	if( !IsEmpty( ) )
+		{
+		TListNode* front = iFirst;
+		element = const_cast<T*>(iFirst->iElement);
+		iFirst = iFirst->iNext;
+		if( NULL == iFirst )
+			{
+			iLast = NULL;
+			}
+		iCount--;
+		delete front;
+		front = NULL;
+		}
+	return element;
+	}
+
+/**
+ Return and remove the least recently inserted item from the queue.
+*/
+template <class T>
+T* RMMRCFifoQueue<T>::PopAndRemove( TInt aIndex )
+	{
+	T* element = NULL;
+	TListNode* PreviousNode = NULL;
+	TListNode* node = iFirst;
+	TInt i = 0;
+	for( ; i<aIndex && i<iCount && node->iNext ; i++)
+		{
+		PreviousNode = node;
+		node = node->iNext;
+		}
+	
+	if(node && i < iCount)
+		{
+		if(PreviousNode)
+			{
+			PreviousNode->iNext = node->iNext;
+			if( NULL == node->iNext )
+				{
+				iLast = PreviousNode;
+				}
+			}
+		else 
+			{
+			iFirst = node->iNext;
+			if( NULL == iFirst )
+				{
+				iLast = NULL;
+				} 
+			}
+		element = const_cast<T*>(node->iElement);
+		iCount--;
+		delete node;
+		}
+	return element;
+	}
+
+/**
+ Insert aElement into the queue.
+*/
+template <class T>
+void RMMRCFifoQueue<T>::PushL( T const* const aElement )
+	{
+	if( IsEmpty( ) )
+		{
+		iLast = iFirst = new(ELeave) TListNode( aElement );
+		}
+	else
+		{
+		iLast = iLast->iNext = new(ELeave) TListNode( aElement );
+		}
+	iCount++;
+	}
+
+/**
+ Pop a pointer of the aIndex elements.
+*/
+template <class T>
+T* RMMRCFifoQueue<T>::Pop ( ) const
+	{
+	T* element = NULL;
+	TListNode* node = iFirst;
+	
+	if( node )
+		{
+		element = const_cast<T*>(node->iElement);
+		}
+	
+	return element;
+	}
+
+/**
+ Pop a pointer of the aIndex elements.
+*/
+template <class T>
+T* RMMRCFifoQueue<T>::Pop ( TInt aIndex ) const
+	{
+	T* element = NULL;
+	TListNode* node = iFirst;
+	
+	TInt i = 0;
+	for( ; (i < aIndex) && (i < iCount) && (node->iNext != NULL) ; i++)
+		{
+		node = node->iNext;
+		}
+	
+	if(  ( NULL != node ) 
+			&& ( i < iCount )  )
+		{
+		element = const_cast<T*>(node->iElement);
+		}
+	
+	return element;
+	}
+
+/**
+ Pop a pointer of the aIndex elements.
+*/
+template <class T>
+T* RMMRCFifoQueue<T>::operator[] ( TInt aIndex ) const
+	{
+	return Pop(aIndex);
+	}
+
+
+/**
+ Class for manage the list of the sessions requesting pause.
+*/
+template <class T>
+class RMMRCFifoOrderQueue : private RMMRCFifoQueue <T>
+	{
+
+public:
+	RMMRCFifoOrderQueue( );
+	~RMMRCFifoOrderQueue( );
+	void ResetAndDestroy( );
+	TInt Count() const;
+	void PushL( T const* const  aElement );
+	T* PopAndRemoveForPause( TInt aIndex );
+	T* operator[] ( TInt aIndex ) const;
+
+
+private:
+	RPointerArray< T >  todo;
+	};
+
+
+/**
+ Construct the queue.
+*/
+template <class T>
+RMMRCFifoOrderQueue<T>::RMMRCFifoOrderQueue( )
+	{
+	}
+
+/**
+ Destructor.
+*/
+template <class T>
+RMMRCFifoOrderQueue<T>::~RMMRCFifoOrderQueue( )
+	{
+	todo.Reset();
+	todo.Close();
+	}
+	
+/**
+ Return the number of elements.
+*/
+template <class T>
+TInt RMMRCFifoOrderQueue<T>::Count( ) const
+	{
+	
+	TInt iNum = todo.Count();
+	return iNum;
+	}	
+
+/**
+ Delete each node and each element.
+*/
+template <class T>
+void RMMRCFifoOrderQueue<T>::ResetAndDestroy( )
+	{
+	todo.ResetAndDestroy();
+	}
+
+/**
+ Insert aElement into the queue and ordered.
+*/
+template <class T>
+void RMMRCFifoOrderQueue<T>::PushL( T const* const aElement )
+	{
+	TInt numElements = todo.Count();
+	
+	if( numElements == 0 )
+		{
+		todo.Append(aElement); //TODO: We need to check the error here
+		return;
+		}
+	
+	for(TInt i(0); i<numElements ; ++i)
+		{
+		if(aElement->HasMultimediaCapability() && !(todo[i]->HasMultimediaCapability()))
+			{
+			todo.Insert(aElement, i);
+			return;
+			}
+		else if(aElement->HasMultimediaCapability() == todo[i]->HasMultimediaCapability())	
+			{
+			if (aElement->GetPriority() > todo[i]->GetPriority())
+			 	{
+				todo.Insert(aElement,i);
+				return;
+			 	}			
+			}
+		}
+	todo.Insert(aElement,numElements);
+	}
+	
+/**
+ Return and remove the inserted item from the queue.
+*/
+template <class T>
+T* RMMRCFifoOrderQueue<T>::PopAndRemoveForPause( TInt aIndex )
+	{
+	T* aux = NULL;
+	aux = todo[aIndex];
+	todo.Remove(aIndex);	
+	return aux;
+	}
+
+
+/**
+ Pop a pointer of the aIndex elements.
+*/
+template <class T>
+T* RMMRCFifoOrderQueue<T>::operator[] ( TInt aIndex ) const
+	{
+	if(todo.Count() != 0)
+		{
+		return todo[aIndex];
+		}
+	else
+		{
+		return NULL;
+		}
+	}
+
+#endif /*_MMRCUTIL_H_*/