diff -r 000000000000 -r 2e3d3ce01487 commonappservices/alarmserver/Server/Source/ASSrvIteratorBase.cpp --- /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(*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); + } + + + +