commonappservices/alarmserver/Server/Include/ASSrvIteratorBase.h
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonappservices/alarmserver/Server/Include/ASSrvIteratorBase.h	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,214 @@
+// Copyright (c) 1999-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 __ASSRVITERATORBASE_H__
+#define __ASSRVITERATORBASE_H__
+
+// System includes
+#include <e32base.h>
+
+// User includes
+#include "ASSrvAlarm.h"
+
+// Classes referenced
+class CASSrvAlarmQueue;
+
+
+//
+// ----> RASSrvIteratorBase (header)
+//
+/**
+ * The base class for server iterators
+ */
+class RASSrvIteratorBase
+	{
+//
+public:										// CONSTRUCT
+//
+
+	/**
+	 * Constructor
+	 */
+	RASSrvIteratorBase(CASSrvAlarmQueue& aQueue);
+
+	/**
+	 * Only the primary iterator should ever be opened.
+	 */
+	void									Open();
+
+//
+public:										// ACCESS
+//
+
+	/**
+	 * Is another alarm available?
+	 */
+	virtual TBool							NextAlarmAvailable() const;
+
+	/**
+	 * Return the next available alarm
+	 */
+	virtual TASSrvAlarm&					NextAlarm();
+
+	/**
+	 * Resets the iterator back to the start of the queue
+	 */
+	virtual void							Reset();
+
+	/**
+	 * Attaches another iterator to this one. Allows iterators to be chained
+	 * together so that different conditions can be satisfied without complex
+	 * (custom-written) individual iterator combinations.
+	 */
+	virtual void							IteratorAttach(RASSrvIteratorBase& aIterator);
+
+	/**
+	 * Release a previously attached iterator
+	 */
+	virtual void							IteratorRelease();
+
+//
+protected:									// INTERNAL
+//
+
+	/**
+	 * Is an iterator attached?
+	 */
+	TBool									IteratorAttached() const;
+
+	/**
+	 * Access the attached iterator
+	 */
+	RASSrvIteratorBase&						Iterator();
+
+	/**
+	 * Access a constant handle to the attached iterator
+	 */
+	const RASSrvIteratorBase&				Iterator() const;
+
+	/**
+	 * Synchronise this iterator with another
+	 */
+	virtual void							IteratorSynchronize(RASSrvIteratorBase& aInterator);
+
+	/**
+	 * Does the specified alarm satisfy the criteria associated with
+	 * this iterator?
+	 */
+	virtual TBool							Matches(const TASSrvAlarm& aAlarm) const;
+
+//
+private:									// INTERNAL
+//
+
+	/**
+	 * Return a reference to the alarm at the specified index
+	 */
+	TASSrvAlarm&							AlarmAt(TInt aIndex);
+
+	/**
+	 * Return the number of alarms
+	 */
+	TInt									AlarmCount() const;
+
+//
+private:									// INTERNAL ENUMERATIONS
+//
+
+	/**
+	 * The type of iterator
+	 */
+	enum TASSrvIteratorType
+		{
+		/**
+		 * The secondary iterator which is only called (to check for matches)
+		 * when the primary iterator identifies a matching alarm.
+		 */
+		EASSrvIteratorTypeSecondary			= 0,
+
+		/**
+		 * The main iterator which is first checked, before
+		 * passing onto the child.
+		 */
+		EASSrvIteratorTypePrimary
+		};
+
+	/**
+	 * Iterator panic
+	 */
+	enum TASSrvIteratorPanic
+		{
+		/**
+		 * The iterator has reached the end of the alarm
+		 * queue unexpectedly.
+		 */
+		EASSrvIteratorPanicNoNextAlarmForIterator = 0,
+
+		/**
+		 * An iterator is attempting to add itself as
+		 * a secondary iterator.
+		 */
+		EASSrvIteratorPanicCyclicAttach,
+
+		/**
+		 * No secondary iterator is attached, but it 
+		 * is expected to be so.
+		 */
+		EASSrvIteratorPanicNoneAttached,
+
+		/**
+		 * An iterator isn't correctly initialized.
+		 */
+		EASSrvIteratorPanicNotInitialized,
+
+		/**
+		 * The iterator type isn't correct
+		 */
+		EASSrvIteratorPanicTypeMismatch
+
+		};
+
+	/**
+	 * Panic the Alarm Server
+	 */
+	static void								Panic(TASSrvIteratorPanic aPanic);
+
+//
+protected:									// MEMBER DATA
+//
+
+	/**
+	 * The queue
+	 */
+	CASSrvAlarmQueue&						iQueue;
+
+	/**
+	 * The index of the current alarm which the iterator is
+	 * pointing to.
+	 */
+	TInt									iCurrentIndex;
+
+	/**
+	 * The type of iterator
+	 */
+	TASSrvIteratorType						iType;
+
+	/**
+	 * A pointer to a secondary iterator. Not always initialised.
+	 */
+	RASSrvIteratorBase*						iAttachedIterator;
+	};
+
+#endif