locationtriggering/ltserver/ltserverlogic/src/lbtnotificationmap.cpp
changeset 0 667063e416a2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/locationtriggering/ltserver/ltserverlogic/src/lbtnotificationmap.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,273 @@
+/*
+* Copyright (c) 2007 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:  Defines the notification map data structure used by Location 
+*				 Triggering Server Logic to store notification request messages
+*
+*/
+
+
+//  INCLUDE FILES
+#include <e32base.h>
+#include "lbtnotificationmap.h"
+#include "lbtglobal.h"
+#include "lbtlogger.h"
+
+// ======== LOCAL FUNCTIONS ========
+
+TInt OrderNotifReqs(
+    const CLbtNotificationMap::TLbtNotificationReq& aLhs, 
+    const CLbtNotificationMap::TLbtNotificationReq& aRhs)
+	{
+	FUNC_ENTER("CLbtNotificationMap::OrderNotifReqs");
+	const RMessage2& lhs = aLhs.iMsg;
+	const RMessage2& rhs = aRhs.iMsg;
+
+	if(lhs.SecureId() == rhs.SecureId())
+		{
+		return 0;
+		}
+	if(lhs.SecureId() < rhs.SecureId())
+		{
+		return -1;
+		}
+	else
+		{
+		return 1;
+		}
+	}
+
+
+TInt SecureIdCompare(CSession2** aSession, RMessage2& aMessage)
+	{
+	FUNC_ENTER("CLbtNotificationMap::SecureIdCompare");
+	if(aMessage.Session() == (*aSession))
+		{
+		return 0;
+		}
+	if(aMessage.Session() < (*aSession))
+		{
+		return -1;
+		}
+	else
+		{
+		return 1;
+		}
+	}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::NewL
+// Symbian Two - phase constructor
+// ---------------------------------------------------------------------------
+//
+CLbtNotificationMap* CLbtNotificationMap::NewL()
+	{
+	FUNC_ENTER("CLbtNotificationMap::NewL");
+	CLbtNotificationMap* self = new ( ELeave ) CLbtNotificationMap;
+    CleanupStack::PushL( self );
+    self->ConstructL();    
+    CleanupStack::Pop();
+    return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::~CLbtNotificationMap
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CLbtNotificationMap::~CLbtNotificationMap()
+	{
+	FUNC_ENTER("CLbtNotificationMap::~CLbtNotificationMap");
+	Reset(KErrServerBusy);
+	iMessageArray.Close();
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::InsertL
+// ---------------------------------------------------------------------------
+//
+void CLbtNotificationMap::InsertL(
+    const RMessage2& aMessage,
+    CLbtServerLogicBase::TSubSessionType aType)	
+	{
+	FUNC_ENTER("CLbtNotificationMap::InsertL");
+	TLbtNotificationReq req = { aMessage, aType };
+
+	//Insert in sorted order into to the message array
+	TLinearOrder<TLbtNotificationReq> OrderPredicate(OrderNotifReqs);
+	iMessageArray.InsertInOrderAllowRepeats(req, OrderPredicate);
+//	iMessageArray.Append(req);
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::Retreive
+// ---------------------------------------------------------------------------
+//
+TInt CLbtNotificationMap::Retreive(RMessage2& aMessage, 
+				    			   TUint32 aSubSessionHandle, 
+				    			   TSecureId aSecureId,
+				    			   TInt aServiceId,
+				    			   CSession2* aSession)
+	{
+	FUNC_ENTER("CLbtNotificationMap::Retreive");
+	for(TInt i=0; i<iMessageArray.Count(); ++i)
+		{
+		
+		RMessage2& msg = iMessageArray[i].iMsg;
+		if( msg.SecureId() == aSecureId &&
+		    msg.Int3() == aSubSessionHandle && 
+		    msg.Function() == aServiceId && 
+		    msg.Session() == aSession )
+			{
+			aMessage = msg;
+			iMessageArray.Remove(i);
+			return KErrNone;
+			}
+		}
+
+	return KErrNotFound;
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::Retreive
+// ---------------------------------------------------------------------------
+//
+TInt CLbtNotificationMap::Retreive(RMessage2& aMessage, 
+				    			   TSecureId aSecureId,
+				    			   TInt aServiceId)
+	{
+	FUNC_ENTER("CLbtNotificationMap::Retreive");
+	for(TInt i=0; i<iMessageArray.Count(); ++i)
+		{
+		RMessage2& msg = iMessageArray[i].iMsg;
+		if( msg.SecureId() == aSecureId &&
+			msg.Function() == aServiceId )
+			{
+			aMessage = msg;
+			iMessageArray.Remove(i);
+			return KErrNone;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::Retreive
+// ---------------------------------------------------------------------------
+//
+TInt CLbtNotificationMap::Retreive(RMessage2& aMessage, 
+                                   TInt aSubSessionHandle,
+                                   TSecureId aSecureId)
+    {
+    FUNC_ENTER("CLbtNotificationMap::Retreive");
+    for(TInt i=0; i<iMessageArray.Count(); ++i)
+        {
+        RMessage2& msg = iMessageArray[i].iMsg;
+        if( msg.SecureId() == aSecureId && 
+            msg.Int3() == aSubSessionHandle )
+            {
+            aMessage = msg;
+            iMessageArray.Remove(i);
+            return KErrNone;
+            }
+        }
+    return KErrNotFound;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::Retreive
+// ---------------------------------------------------------------------------
+//
+TInt CLbtNotificationMap::Retreive(RMessage2& aMessage, 
+				    			   TInt aServiceId,
+				    			   CLbtServerLogicBase::TSubSessionType aType)
+	{
+	FUNC_ENTER("CLbtNotificationMap::Retreive");
+	for(TInt i=0; i<iMessageArray.Count(); ++i)
+		{
+		RMessage2& msg = iMessageArray[i].iMsg;
+		if( msg.Function() == aServiceId &&
+			iMessageArray[i].iType == aType )
+			{
+			aMessage = msg;
+			iMessageArray.Remove(i);
+			return KErrNone;
+			}
+		}
+	return KErrNotFound;
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::CompleteMessagesOfSubsession
+// ---------------------------------------------------------------------------
+//
+void CLbtNotificationMap::CompleteMessagesOfSubsession(const CSession2* aSession, const TInt aSubSessionHandle, TInt aErrorCode)
+	{
+	FUNC_ENTER("CLbtNotificationMap::CompleteMessagesOfSubsession");
+	for(TInt i=0;i<iMessageArray.Count();++i)
+		{
+		RMessage2& message = iMessageArray[i].iMsg;
+		if(message.Session() == aSession && 
+		   message.Int3() == aSubSessionHandle)
+			{
+			LbtGlobal::RequestComplete(message, aErrorCode);
+			iMessageArray.Remove(i);
+			}
+		}
+	}
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::CompleteMessagesOfSubsession
+// ---------------------------------------------------------------------------
+//
+void CLbtNotificationMap::RemoveAllClientMessages(TSecureId aSecureId)	
+	{
+	FUNC_ENTER("CLbtNotificationMap::RemoveAllClientMessages");
+	for(TInt i=0;i<iMessageArray.Count();i++)
+		{
+		RMessage2& message = iMessageArray[i].iMsg;
+		if(message.SecureId() == aSecureId)
+			{
+			LbtGlobal::RequestComplete(message,KErrDied);
+			iMessageArray.Remove(i);
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::Reset
+// ---------------------------------------------------------------------------
+//
+void CLbtNotificationMap::Reset(TInt aErrorCode)
+	{
+	FUNC_ENTER("CLbtNotificationMap::Reset");
+	for(TInt i=0;i<iMessageArray.Count();++i)
+		{
+		const RMessage2& message = iMessageArray[i].iMsg;
+		LbtGlobal::RequestComplete(message, aErrorCode);
+		}
+	iMessageArray.Reset();
+	}
+
+// ---------------------------------------------------------------------------
+// CLbtNotificationMap::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CLbtNotificationMap::ConstructL()
+	{
+	FUNC_ENTER("CLbtNotificationMap::ConstructL");
+	}
+
+// end of file