realtimenetprots/sipfw/SIP/Registration/src/csipunregistering.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Registration/src/csipunregistering.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,156 @@
+// 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          : csipunregistering.cpp
+// Part of       : SIP Registration
+// Version       : SIP/4.0 
+//
+
+
+
+#include "csipunregistering.h"
+#include "CSIPRegistrar.h"
+#include "SipAssert.h"
+#include "sipcontactheader.h"
+#include "sipresponse.h"
+#include "MRegistrationOwner.h"
+#include "siprequest.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPUnregistering* CSIPUnregistering::NewL(MRegistrationContext& aRegistration)
+	{
+	CSIPUnregistering* self = CSIPUnregistering::NewLC(aRegistration);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::NewLC
+// -----------------------------------------------------------------------------
+//
+CSIPUnregistering* CSIPUnregistering::NewLC(MRegistrationContext& aRegistration)
+	{
+	CSIPUnregistering* self = new (ELeave) CSIPUnregistering(aRegistration);
+	CleanupStack::PushL(self);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::NewLC
+// -----------------------------------------------------------------------------
+//
+void CSIPUnregistering::SetNeighbourStates(
+	CSIPRegistrationState* aUnregistered)
+	{
+	__SIP_ASSERT_RETURN(aUnregistered, KErrArgument);
+
+	iUnregistered = aUnregistered;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::~CSIPUnregistering
+// -----------------------------------------------------------------------------
+//
+CSIPUnregistering::~CSIPUnregistering()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::UnregisterL
+// -----------------------------------------------------------------------------
+//	
+void CSIPUnregistering::UnregisterL(TTransactionId& aTransactionId,
+					                CSIPRequest*    aRequest)
+	{
+	__SIP_ASSERT_LEAVE(aRequest, KErrArgument);	
+
+	CSIPContactHeader* contact = static_cast<CSIPContactHeader*>(
+		aRequest->Header(SIPStrings::StringF(SipStrConsts::EContactHeader),0));
+
+	__SIP_ASSERT_LEAVE(contact->ExpiresParameter() == 0, KErrArgument);
+
+	// registrar must not be NULL after registering succeed.
+	__SIP_ASSERT_LEAVE(iRegistration.Registrar(), KErrGeneral);
+
+	// copy CallId and CSeq header from binding's registrar to request.
+	iRegistration.Registrar()->FillCallIdAndCSeqL(*aRequest);
+	// update registration expires parameter from aRequest Contact header
+	iRegistration.SetExpiresValueL(*aRequest);
+	// copy To and From header from registration binding to request
+	iRegistration.FillToFromL(*aRequest);
+
+	iRegistration.UnregisterL(aTransactionId, aRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::ReceiveL
+// -----------------------------------------------------------------------------
+//	
+void CSIPUnregistering::ReceiveL(TTransactionId aTransactionId,
+		                         CSIPResponse*  aResponse)
+	{
+	__SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+	// the expires parameter value must be 0, other wise panic in debug
+	// mode, leaves in release mode.
+	__SIP_ASSERT_LEAVE(iRegistration.Contact().ExpiresParameter() == 0, 
+		KErrGeneral);
+
+	if (aResponse->Type() == CSIPResponse::E1XX)
+		{
+		// pass provisional response to owner. 
+		PassResponseToOwnerL(aResponse, aTransactionId,
+			iRegistration.RegistrationId());
+		}
+	else 
+		{
+        // any final response (response code start from 200-)
+		// will terminate the binding. so this function is 
+		// called in order to remove the binding. 
+		iRegistration.ReceivedErrorResponseL();
+		PassResponseToOwnerL(aResponse, aTransactionId,
+			iRegistration.RegistrationId());
+		iRegistration.SelfDetach(ETrue);
+		iRegistration.ChangeState(iUnregistered);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::TransactionEnded
+// -----------------------------------------------------------------------------
+//
+TInt CSIPUnregistering::TransactionEnded(TTransactionId aTransactionId, 
+		                                 TInt           aReason)
+	{
+	if (aReason != KErrNone)
+		{
+		iRegistration.ChangeState(iUnregistered);
+		}
+	// pass error to owner.
+	return (PassErrorToOwner(aReason, aTransactionId, 
+		iRegistration.RegistrationId()));	
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPUnregistering::CSIPUnregistering
+// -----------------------------------------------------------------------------
+//
+CSIPUnregistering::CSIPUnregistering(MRegistrationContext& aRegistration)
+	: CSIPRegistrationState (aRegistration)
+	{
+	}