--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/centralrepository/cenrepsrv/sessnotf.cpp Fri Jan 22 11:06:30 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<TUint32>(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>=0 ? KErrNone : KErrNotFound;
+ }
+
+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;
+ }