diff -r 000000000000 -r b16258d2340f applayerpluginsandutils/bookmarksupport/test/cenrepsrv/sessnotf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/applayerpluginsandutils/bookmarksupport/test/cenrepsrv/sessnotf.cpp Tue Feb 02 01:09:52 2010 +0200 @@ -0,0 +1,133 @@ +// Copyright (c) 2004-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 "sessnotf.h" + +CSessionNotifier::CSessionNotifier() : + iIdReportingOn(ETrue), iRequests(KArrayGranularity, _FOFF(SRequest, id)) + { + } + +CSessionNotifier::~CSessionNotifier() + { + CancelAllRequests(); + } + +void CSessionNotifier::Notify(TUint32 aId) + { + SRequest s; + s.id = aId; + + // Check if iIdReportingOn is True. If it's false return KUnspecifiedKey, otherwise return + // the individual key. One exception to this is where the individual key is KRequestPending. + // To prevent problems in AO's using key notifications KUnspecifiedKey will be returned to + // notify for changes to this key. + TUint32 reportedId = (iIdReportingOn && (aId != static_cast(KRequestPending))) ? aId : KUnspecifiedKey; + + TInt i = iRequests.FindInUnsignedKeyOrder(s); + if(i>=0) + { + iRequests[i].msg.Complete(reportedId); + iRequests.Remove(i); + } + + for(i=iGroupRequests.Count()-1; i>=0; i--) + { + SGroupRequest& s = iGroupRequests[i]; + if((aId & s.idMask)==(s.partialId & s.idMask)) + { + s.msg.Complete(reportedId); + iGroupRequests.Remove(i); + } + } + } + +TInt CSessionNotifier::AddRequest(TUint32 aId, TClientRequest aMessage) + { + SRequest s; + s.id = aId; + s.msg = aMessage; + + return iRequests.InsertInUnsignedKeyOrder(s); + } + +TInt CSessionNotifier::AddRequest(TUint32 aPartialId, TUint32 aIdMask, TClientRequest aMessage) + { + SGroupRequest s; + s.partialId = aPartialId;; + s.idMask = aIdMask; + s.msg = aMessage; + + return iGroupRequests.Append(s); + } + +TInt CSessionNotifier::CancelRequest(TUint32 aId) + { + SRequest s; + s.id = aId; + + TInt r = iRequests.FindInUnsignedKeyOrder(s); + if(r>=0) + { + iRequests[r].msg.Complete(KUnspecifiedKey); + iRequests.Remove(r); + } + + return r; + } + +TInt CSessionNotifier::CancelRequest(TUint32 aPartialId, TUint32 aIdMask) + { + TInt n = 0; + for(TInt i=iGroupRequests.Count()-1; i>=0; i--) + { + SGroupRequest& s = iGroupRequests[i]; + if(aPartialId==s.partialId && aIdMask==s.idMask) + { + n++; + s.msg.Complete(KUnspecifiedKey); + iGroupRequests.Remove(i); + } + } + + return n>0 ? KErrNone : KErrNotFound; + } + +TInt CSessionNotifier::CancelAllRequests() + { + TInt n = iRequests.Count(); + while(n-->0) + iRequests[n].msg.Complete(KUnspecifiedKey); + + iRequests.Reset(); + + n = iGroupRequests.Count(); + while(n-->0) + iGroupRequests[n].msg.Complete(KUnspecifiedKey); + + iGroupRequests.Reset(); + + return KErrNone; + } + +void CSessionNotifier::IdReportingOn() + { + iIdReportingOn = ETrue; + } + +void CSessionNotifier::IdReportingOff() + { + iIdReportingOn = EFalse; + }