realtimenetprots/sipfw/SIP/Refreshes/src/CSipRegisterRefresh.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Refreshes/src/CSipRegisterRefresh.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,270 @@
+// 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          : CSipRegisterRefresh.cpp
+// Part of       : SIPRefreshes
+// Version       : SIP/4.0 
+//
+
+
+
+#include "SipStackServerDefs.h"
+#include "MTransactionUser.h"
+#include "MRefreshOwner.h"
+#include "CSipRefreshMgr.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "sipcontactheader.h"
+#include "sipaddress.h"
+#include "sipcseqheader.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "SipLogs.h"
+#include "sipcallidheader.h"
+#include "sipuri.h"
+#include "siprouteheader.h"
+#include "siprecordrouteheader.h"
+#include "SipAssert.h"
+#include "CSipRegisterRefresh.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "CSIPResponseUtility.h"
+
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::NewLC
+// -----------------------------------------------------------------------------
+//
+CSipRegisterRefresh* CSipRegisterRefresh::NewLC(
+	MTransactionUser& aTU,
+    MTimerManager& aTimerMgr,
+    CSIPSec& aSIPSec,
+	CSipRefreshMgr& aRefreshMgr,
+	TRegistrationId aRegistrationId,
+	CSIPRequest* aRequest,
+    MRefreshOwner* aOwner,
+    MSIPSecUser& aSIPSecUser,
+	CURIContainer& aRemoteTarget)
+	{
+	__SIP_ASSERT_LEAVE (aOwner, KErrArgument);
+
+	CSipRegisterRefresh* self = 
+	    new(ELeave)CSipRegisterRefresh(aTU, aTimerMgr, aSIPSec, aRefreshMgr,
+	                                   aRegistrationId, aOwner, aSIPSecUser);
+
+	CleanupStack::PushL (self);
+	self->ConstructL(aRequest, aRemoteTarget);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::~CSipRegisterRefresh
+// -----------------------------------------------------------------------------
+//
+CSipRegisterRefresh::~CSipRegisterRefresh ()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::CSipRegisterRefresh
+// -----------------------------------------------------------------------------
+//
+CSipRegisterRefresh::CSipRegisterRefresh (MTransactionUser& aTU,
+                                          MTimerManager& aTimerMgr,
+                                          CSIPSec& aSIPSec,
+                                          CSipRefreshMgr& aRefreshMgr,
+                                          TRegistrationId aRegistrationId,
+                                          MRefreshOwner* aOwner,
+                                          MSIPSecUser& aSIPSecUser)
+ : CSipRefreshBase (aTU, aTimerMgr, aSIPSec, aRefreshMgr, 
+                    aRegistrationId, aOwner, aSIPSecUser)
+	{
+	iContactHeaderName = SIPStrings::StringF(SipStrConsts::EContactHeader);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::ConstructL (CSIPRequest* aRequest, 
+									  CURIContainer& aRemoteTarget)
+	{
+	__SIP_ASSERT_LEAVE (aRequest, KErrArgument);
+
+	__SIP_ASSERT_LEAVE (
+	    aRequest->Method() == SIPStrings::StringF(SipStrConsts::ERegister),
+	    KErrArgument);
+
+	CSIPContactHeader* contact = 
+	    static_cast<CSIPContactHeader*>(aRequest->Header(iContactHeaderName,0));
+
+	__SIP_ASSERT_LEAVE (contact, KErrArgument);
+	
+	CSipRefreshBase::BaseConstructL(aRemoteTarget,*aRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::SIPSecUser
+// From MTransactionOwner
+// -----------------------------------------------------------------------------
+//
+const MSIPSecUser* CSipRegisterRefresh::SIPSecUser() const
+    {
+    // In case of REGISTER, the refresh must not act as a middle man.
+    // This is to make the MSIPSecUser::TrustedUser() work correctly.
+    return &iSIPSecUser;
+    }
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::Forward2xxResponseToCallerL
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::Forward2xxResponseToCallerL (CSIPResponse* aResponse)
+	{
+	RefreshReceivedL(iCurrentTransactionId, aResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::SetExpirationTimeToRequestL 
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::SetExpirationTimeToRequestL (
+    CSIPRequest& aRequest,
+	TUint aExpirationTimeInSeconds)
+	{
+	CSIPContactHeader* contact = static_cast<CSIPContactHeader*>(
+        aRequest.Header(iContactHeaderName,0));
+
+	__SIP_ASSERT_LEAVE (contact, KErrArgument);	
+	
+	contact->SetExpiresParameterL(aExpirationTimeInSeconds);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::ExpirationTimeFromResponseContact
+// -----------------------------------------------------------------------------
+//
+TInt CSipRegisterRefresh::ExpirationTimeFromResponseContact (
+	CSIPResponse& aResponse)
+	{
+	TSglQueIter<CSIPHeaderBase> iter = 
+        iRequest->Headers(iContactHeaderName);
+	if (iter != 0)
+		{
+		CSIPHeaderBase* header = iter;
+		CSIPContactHeader* reqContact = static_cast<CSIPContactHeader*>(header);
+		
+		// search the contact header of the response which match to one 
+		// defined in the request
+		CSIPContactHeader* resContact = 
+		    CSIPResponseUtility::ContactHeader( *reqContact, aResponse );
+		
+		if ( resContact && resContact->ExpiresParameter() >= 0 )
+		    {
+		    return resContact->ExpiresParameter();
+		    }
+		}
+
+	return KErrNotFound;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::SetExpirationTimeToResponseL
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::SetExpirationTimeToResponseL(
+	CSIPResponse& aResponse, 
+	TUint         aExpirationTimeInSeconds)
+	{
+	TBool setExpiresInContact = EFalse;
+
+	if (aResponse.HasHeader(iContactHeaderName))
+		{
+		__SIP_ASSERT_LEAVE (
+		    iRequest->HasHeader(iContactHeaderName), KErrGeneral);
+		    
+		CSIPContactHeader* reqContact = 
+		    static_cast<CSIPContactHeader*>(
+		        iRequest->Header(iContactHeaderName,0));
+	
+	    CSIPContactHeader* resContact = 
+		    CSIPResponseUtility::ContactHeader( *reqContact, aResponse );
+		
+		if ( resContact )
+		    {
+		    resContact->SetExpiresParameterL(aExpirationTimeInSeconds);
+		    setExpiresInContact = ETrue;
+		    }
+		}
+
+	if (!setExpiresInContact)
+		{
+		SetExpireTimeToResponseExpiresHeaderL(aResponse, 
+			                                  aExpirationTimeInSeconds);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::ExpirationTimeFromRequestL
+// -----------------------------------------------------------------------------
+//
+TInt CSipRegisterRefresh::ExpirationTimeFromRequestL(CSIPRequest& /*aRequest*/)
+	{
+	return iOwner->RefreshDurationL();
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::ExpirationTimeFromResponse
+// -----------------------------------------------------------------------------
+//
+TInt CSipRegisterRefresh::ExpirationTimeFromResponse (CSIPResponse& aResponse)
+	{
+	TInt time = 0;
+	
+	time = ExpirationTimeFromResponseContact(aResponse);
+		
+	if(time == KErrNotFound) 
+		{
+		time = ExpireTimeFromResponseExpiresHeader(aResponse);
+		}
+
+	return time;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::CheckUpdateRequestExpiresValueL
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::CheckUpdateRequestExpiresValueL(
+    CSIPRequest& aRequest)
+	{
+	CSIPContactHeader* contact = static_cast<CSIPContactHeader*>(
+        aRequest.Header(iContactHeaderName,0));
+
+	__SIP_ASSERT_LEAVE (contact, KErrArgument);
+	}
+ 
+// -----------------------------------------------------------------------------
+// CSipRegisterRefresh::CheckTerminateRequestExpiresValueL
+// -----------------------------------------------------------------------------
+//
+void CSipRegisterRefresh::CheckTerminateRequestExpiresValueL(
+	CSIPRequest& aRequest)
+	{
+	CSIPContactHeader* contact = static_cast<CSIPContactHeader*>(
+        aRequest.Header(iContactHeaderName,0));
+
+	__SIP_ASSERT_LEAVE (contact, KErrGeneral);
+
+	contact->SetExpiresParameterL(0);
+	}