realtimenetprots/sipfw/SIP/Server/src/CSIPRoutingRequestStore.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Server/src/CSIPRoutingRequestStore.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,195 @@
+// Copyright (c) 2005-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:
+// Name          : CSIPRoutingRequestStore.cpp
+// Part of       : SIP Server Core
+// Version       : SIP/4.0 
+//
+
+
+
+#include "CSIPRoutingRequestStore.h"
+#include "CSIPRoutingRequest.h"
+#include "MSIPRequestRouterObserver.h"
+#include "CSipServerCore.h"
+#include "sipresponse.h"
+
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::NewL
+// ----------------------------------------------------------------------------
+//
+CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewL(
+    CSipServerCore& aServerCore)
+    {
+    CSIPRoutingRequestStore* self = 
+        CSIPRoutingRequestStore::NewLC(aServerCore);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::NewLC
+// ----------------------------------------------------------------------------
+//
+CSIPRoutingRequestStore* CSIPRoutingRequestStore::NewLC(
+    CSipServerCore& aServerCore)
+    {
+	CSIPRoutingRequestStore* self = 
+		new(ELeave)CSIPRoutingRequestStore(aServerCore);
+    CleanupStack::PushL(self);
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::CSIPRoutingRequestStore
+// ----------------------------------------------------------------------------
+//
+CSIPRoutingRequestStore::CSIPRoutingRequestStore (CSipServerCore& aServerCore)
+: iServerCore(aServerCore),
+  iList(CSIPRoutingRequest::LinkOffset())
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::~CSIPRoutingRequestStore
+// ----------------------------------------------------------------------------
+//
+CSIPRoutingRequestStore::~CSIPRoutingRequestStore ()
+    {
+	TSglQueIter<CSIPRoutingRequest> iter(iList);
+	for (CSIPRoutingRequest* request = iter++; request; request = iter++)
+		{
+		iList.Remove(*request);
+		delete request;
+    	}    
+    }
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::TransactionOwnerL
+// From MSIPRequestRouter
+// ----------------------------------------------------------------------------
+//
+TUint32 CSIPRoutingRequestStore::TransactionOwnerL(
+    CSIPRequest& aRequest,
+    TUint32 aIapId,
+    MSIPRequestRouterObserver& aObs)
+	{
+	CSIPRoutingRequest* request = CSIPRoutingRequest::NewLC(aIapId,aObs);
+	TUint32 requestId = iServerCore.RequestHandler().ChannelL(aRequest);
+	CleanupStack::Pop(request);
+	request->SetRequestId(requestId);
+	iList.AddLast(*request);
+	return requestId;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::Cancel
+// From MSIPRequestRouter
+// ----------------------------------------------------------------------------
+//   
+void CSIPRoutingRequestStore::Cancel(TUint32 aRequestId)
+	{
+	iServerCore.RequestHandler().Cancel(aRequestId);
+	RemoveAndDelete(aRequestId);
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::ClientFoundL
+// From MSIPRequestHandlerObserver	
+// ----------------------------------------------------------------------------
+// 	
+void CSIPRoutingRequestStore::ClientFoundL(TUint32 aRequestId, TUid aUid)
+	{
+	CSIPRoutingRequest* request = Find(aRequestId);
+	if (request)
+		{
+		TUint32 iapId = request->IapId();
+		MTransactionOwner* owner = iServerCore.FindOwner(iapId,aUid);
+		if (owner)
+			{
+			request->Observer().OwnerFoundL(aRequestId,owner);
+			}
+		else
+			{
+			request->Observer().ErrorOccurred(aRequestId,KErrNotFound);	
+			}
+		RemoveAndDelete(aRequestId);
+		}	
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::ClientNotFoundL
+// From MSIPRequestHandlerObserver	
+// ----------------------------------------------------------------------------
+//
+void CSIPRoutingRequestStore::ClientNotFoundL(TUint32 aRequestId,
+                                              CSIPResponse* aSIPResponse)
+	{
+	CSIPRoutingRequest* request = Find(aRequestId);
+	if (request)
+		{
+		request->Observer().OwnerNotFoundL(aRequestId,aSIPResponse);
+		RemoveAndDelete(aRequestId);
+		}
+	else
+		{
+		delete aSIPResponse;
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::ClientFoundL
+// From MSIPRequestHandlerObserver	
+// ----------------------------------------------------------------------------
+//
+void CSIPRoutingRequestStore::ErrorOccurred(TUint32 aRequestId, TInt aError)
+	{
+	CSIPRoutingRequest* request = Find(aRequestId);
+	if (request)
+		{
+		request->Observer().ErrorOccurred(aRequestId,aError);
+		RemoveAndDelete(aRequestId);		
+		}	
+	}
+	
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::Find
+// ----------------------------------------------------------------------------
+//	
+CSIPRoutingRequest* CSIPRoutingRequestStore::Find(TUint32 aRequestId)
+	{
+	TSglQueIter<CSIPRoutingRequest> iter(iList);
+	for (CSIPRoutingRequest* request = iter++; request; request = iter++)
+		{
+        if (request->RequestId() == aRequestId)
+            {
+            return request;
+            }
+		}
+	return NULL;
+	}
+
+// ----------------------------------------------------------------------------
+// CSIPRoutingRequestStore::RemoveAndDelete
+// ----------------------------------------------------------------------------
+//	
+void CSIPRoutingRequestStore::RemoveAndDelete(TUint32 aRequestId)
+	{
+	CSIPRoutingRequest* request = Find(aRequestId);
+	if (request)
+	    {
+		iList.Remove(*request);
+		delete request;		
+		}		
+	}