persistentstorage/centralrepository/cenrepsrv/sessnotf.cpp
changeset 0 08ec8eefde2f
--- /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;
+	}