commonappservices/alarmserver/Server/Source/ASSrvIteratorBase.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonappservices/alarmserver/Server/Source/ASSrvIteratorBase.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,246 @@
+// 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:
+//
+
+#include "ASSrvIteratorBase.h"
+
+// System includes
+
+// User includes
+#include "ASSrvAlarmQueue.h"
+
+// Type definitions
+
+// Constants
+const TInt KInitialIndexValue = -1;
+
+// Enumerations
+
+// Classes referenced
+
+
+//
+// ----> RASSrvIteratorBase (source)
+//
+
+//*************************************************************************************
+RASSrvIteratorBase::RASSrvIteratorBase(CASSrvAlarmQueue& aQueue)
+:	iQueue(aQueue), iCurrentIndex(KInitialIndexValue), iType(EASSrvIteratorTypeSecondary), iAttachedIterator(NULL)
+	{
+	}
+
+
+//*************************************************************************************
+/**
+ * Only the primary iterator should ever be opened.
+ */
+void RASSrvIteratorBase::Open()
+	{
+	iType = EASSrvIteratorTypePrimary;
+
+	// Restore back to default state
+	Reset();
+	}
+
+
+//
+//
+//
+
+
+//*************************************************************************************
+/**
+ * Is another alarm available?
+ */
+TBool RASSrvIteratorBase::NextAlarmAvailable() const
+	{
+	RASSrvIteratorBase& self = const_cast<RASSrvIteratorBase&>(*this);
+	const TInt count = AlarmCount();
+	TInt index = iCurrentIndex;
+	//
+	while(++index < count)
+		{
+		const TASSrvAlarm& alarm = self.AlarmAt(index);
+		if	(Matches(alarm))
+			return ETrue;
+		}
+	return EFalse;
+	}
+
+
+//*************************************************************************************
+/**
+ * Return the next available alarm
+ */
+TASSrvAlarm& RASSrvIteratorBase::NextAlarm()
+	{
+	const TInt count = AlarmCount();
+	while (++iCurrentIndex < count)
+	{
+		TASSrvAlarm& alarm = AlarmAt(iCurrentIndex);
+		if	(Matches(alarm))
+			{
+			IteratorSynchronize(*this);
+			return alarm;
+			}
+		}
+	
+	// Panic because there isn't another available alarm.
+	Panic(EASSrvIteratorPanicNoNextAlarmForIterator);
+	TASSrvAlarm* dummy = NULL;
+	return *dummy;
+	}
+
+
+//*************************************************************************************
+/**
+ * Resets the iterator back to the start of the queue
+ */
+void RASSrvIteratorBase::Reset()
+	{
+	iCurrentIndex = KInitialIndexValue;
+	IteratorSynchronize(*this);
+	}
+
+
+//*************************************************************************************
+/**
+ * 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.
+ */
+void RASSrvIteratorBase::IteratorAttach(RASSrvIteratorBase& aIterator)
+	{
+	__ASSERT_ALWAYS(&aIterator != this, Panic(EASSrvIteratorPanicCyclicAttach));
+	iAttachedIterator = &aIterator;
+	}
+
+
+//*************************************************************************************
+/**
+ * Release a previously attached iterator
+ */
+void RASSrvIteratorBase::IteratorRelease()
+	{
+	iAttachedIterator = NULL;
+	}
+
+
+//
+//
+//
+
+
+//*************************************************************************************
+/**
+ * Is an iterator attached?
+ */
+TBool RASSrvIteratorBase::IteratorAttached() const
+	{
+	return (iAttachedIterator != NULL);
+	}
+
+
+//*************************************************************************************
+/**
+ * Access the attached iterator
+ */
+RASSrvIteratorBase& RASSrvIteratorBase::Iterator()
+	{
+	__ASSERT_ALWAYS(IteratorAttached(), Panic(EASSrvIteratorPanicNoneAttached));
+	return *iAttachedIterator;
+	}
+
+
+//*************************************************************************************
+/**
+ * Access a constant handle to the attached iterator
+ */
+const RASSrvIteratorBase& RASSrvIteratorBase::Iterator() const
+	{
+	__ASSERT_ALWAYS(IteratorAttached(), Panic(EASSrvIteratorPanicNoneAttached));
+	return *iAttachedIterator;
+	}
+
+
+//*************************************************************************************
+/**
+ * Synchronise this iterator with another
+ */
+void RASSrvIteratorBase::IteratorSynchronize(RASSrvIteratorBase& aInterator)
+	{
+	iCurrentIndex = aInterator.iCurrentIndex;
+	if	(IteratorAttached())
+		Iterator().IteratorSynchronize(*this);
+	}
+
+
+//*************************************************************************************
+/**
+ * Does the specified alarm satisfy the criteria associated with
+ * this iterator?
+ */
+TBool RASSrvIteratorBase::Matches(const TASSrvAlarm& aAlarm) const
+	{
+	// If we have an attached iterator, then we should
+	// check with that too.
+	TBool matches = ETrue;
+	//
+	if	(IteratorAttached())
+		matches = Iterator().Matches(aAlarm);
+	//
+	return matches;
+	}
+
+
+//*************************************************************************************
+/**
+ * Return a reference to the alarm at the specified index
+ */
+TASSrvAlarm& RASSrvIteratorBase::AlarmAt(TInt aIndex)
+	{
+	__ASSERT_ALWAYS(iType == EASSrvIteratorTypePrimary, Panic(EASSrvIteratorPanicTypeMismatch));
+	return iQueue.QueueAlarmAt(aIndex);
+	}
+
+
+//*************************************************************************************
+/**
+ * Return the number of alarms
+ */
+TInt RASSrvIteratorBase::AlarmCount() const
+	{
+	__ASSERT_ALWAYS(iType == EASSrvIteratorTypePrimary, Panic(EASSrvIteratorPanicTypeMismatch));
+	return iQueue.QueueAlarmCount();
+	}
+
+
+//
+//
+//
+
+
+//*************************************************************************************
+/**
+ * Panic the Alarm Server
+ */
+void RASSrvIteratorBase::Panic(TASSrvIteratorPanic aPanic)
+	{
+	_LIT(KPanicCategory, "ASSrvIterator");
+	User::Panic(KPanicCategory, aPanic);
+	}
+
+
+
+