realtimenetprots/sipfw/SIP/Registration/src/csipregistered.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Registration/src/csipregistered.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,203 @@
+// 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          : csipregistered.cpp
+// Part of       : SIP Registration
+// Version       : SIP/4.0 
+//
+
+
+
+#include "csipregistered.h"
+#include "csip423responsereceived.h"
+#include "SipAssert.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "sipminexpiresheader.h"
+#include "CSIPResponseUtility.h"
+#include "MRegistrationOwner.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "siperr.h"
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPRegistered* CSIPRegistered::NewL(MRegistrationContext& aRegistration)
+	{
+	CSIPRegistered* self = CSIPRegistered::NewLC(aRegistration);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::NewLC
+// -----------------------------------------------------------------------------
+//	
+CSIPRegistered* CSIPRegistered::NewLC(MRegistrationContext& aRegistration)
+	{
+	CSIPRegistered* self = new (ELeave) CSIPRegistered(aRegistration);
+	CleanupStack::PushL(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CSIPRegistered::SetNeighbourStates(
+	CSIPRegistrationState* aUpdating,
+	CSIPRegistrationState* aUnregistering,
+	CSIPRegistrationState* aUnregistered,
+	CSIPRegistrationState* aResponse423Received)
+	{
+	__SIP_ASSERT_RETURN(aUpdating, KErrArgument);
+    __SIP_ASSERT_RETURN(aUnregistering, KErrArgument);
+	__SIP_ASSERT_RETURN(aUnregistered, KErrArgument);
+	__SIP_ASSERT_RETURN(aResponse423Received, KErrArgument);
+
+   	iUpdating = aUpdating;
+    iUnregistering = aUnregistering;
+    iUnregistered = aUnregistered;
+	iResponse423Received = aResponse423Received; 
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::~CSIPRegistered
+// -----------------------------------------------------------------------------
+//	
+CSIPRegistered::~CSIPRegistered()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::UpdateL
+// -----------------------------------------------------------------------------
+//		
+void CSIPRegistered::UpdateL(TTransactionId& aTransactionId,
+				             CSIPRequest*    aRequest)
+	{
+	__SIP_ASSERT_LEAVE(aRequest, KErrArgument);
+
+	iRegistration.ChangeState(iUpdating);
+	iRegistration.CurrentState().UpdateL(aTransactionId, aRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::UnregisterL
+// -----------------------------------------------------------------------------
+//		
+void CSIPRegistered::UnregisterL(TTransactionId& aTransactionId,
+					             CSIPRequest*    aRequest)
+	{
+	__SIP_ASSERT_LEAVE(aRequest, KErrArgument);
+
+	iRegistration.ChangeState(iUnregistering);
+	iRegistration.CurrentState().UnregisterL(aTransactionId, aRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::ReceiveL
+//
+// this function is called when subsequent refresh response is received
+// -----------------------------------------------------------------------------
+//		
+void CSIPRegistered::ReceiveL(TTransactionId aTransactionId,
+		                      CSIPResponse*  aResponse)
+	{
+	__SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+
+	if (aResponse->Type() == CSIPResponse::E2XX) // 200-299
+		{
+		if (!iRegistration.ServiceRouteOk(*aResponse))
+			{
+			iRegistration.ReceivedErrorResponseL();
+			User::LeaveIfError(
+			    PassErrorToOwner(KErrSIPTransportFailure,aTransactionId,
+			                     iRegistration.RegistrationId()));
+			delete aResponse;
+			iRegistration.SelfDetach(ETrue);
+			iRegistration.ChangeState(iUnregistered);
+			return;
+			}
+		iRegistration.SetRouteHeaderFromResponseL(*aResponse);
+		iRegistration.Received2XXResponseL(*aResponse,aTransactionId);
+		if (iRegistration.Request())
+			{
+			iRegistration.Request()->DeleteHeaders(
+				SIPStrings::StringF(SipStrConsts::ERouteHeader));
+			}
+
+		// don't forward subsequent 2xx response to owner
+	    delete aResponse; 
+		}
+	else if (aResponse->IsErrorResponse()) // 300-
+		{
+        const RStringF KMinExpiresHeaderName = 
+            SIPStrings::StringF(SipStrConsts::EMinExpiresHeader);		
+		
+		if (aResponse->ResponseCode() == K423Response &&
+			aResponse->HasHeader(KMinExpiresHeaderName))
+			{
+			iRegistration.Received423ResponseL(*aResponse);
+			iRegistration.ChangeState(iResponse423Received);	
+			static_cast<CSIP423ResponseReceived*>(iResponse423Received)->
+				SetUpdate(ETrue);
+			iRegistration.CurrentState().RegisterL(
+			    aTransactionId,iRegistration.Request(),NULL);
+			delete aResponse;
+			}
+		// this happens when error response received from subsequent register.
+		else
+			{
+			// ReceivedErrorResponseL, remove binding 
+			iRegistration.ReceivedErrorResponseL();
+			// pass response to owner
+			PassResponseToOwnerL(aResponse, aTransactionId, 
+				iRegistration.RegistrationId());
+			iRegistration.SelfDetach(ETrue);
+			iRegistration.ChangeState(iUnregistered);
+			}
+		}
+	else // is provisional response 100-199
+		{
+		// do not forward subsequent 1xx response to owner
+		delete aResponse; 
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::TransactionEnded
+// -----------------------------------------------------------------------------
+//		
+TInt CSIPRegistered::TransactionEnded(TTransactionId aTransactionId, 
+		                              TInt           aReason)
+	{
+	if (aReason != KErrNone)
+		{
+		iRegistration.ChangeState(iUnregistered);
+		}
+	// pass error to owner.
+	return (PassErrorToOwner(aReason, aTransactionId, 
+		iRegistration.RegistrationId()));	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPRegistered::CSIPRegistered
+// -----------------------------------------------------------------------------
+//	
+CSIPRegistered::CSIPRegistered(MRegistrationContext& aRegistration)
+	: CSIPRegistrationState (aRegistration) 
+	{
+	}