realtimenetprots/sipfw/SIP/Refreshes/src/CSipAnyRefresh.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Refreshes/src/CSipAnyRefresh.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,220 @@
+// 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          : CSipAnyRefresh.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 "sipexpiresheader.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "SipLogs.h"
+#include "sipcallidheader.h"
+#include "sipuri.h"
+#include "siprouteheader.h"
+#include "siprecordrouteheader.h"
+#include "CSipAnyRefresh.h"
+#include "SipAssert.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::NewLC
+// -----------------------------------------------------------------------------
+//
+CSipAnyRefresh* CSipAnyRefresh::NewLC (MTransactionUser& aTU,
+                                       MTimerManager& aTimerMgr,
+                                       CSIPSec& aSIPSec,
+                                       CSipRefreshMgr& aRefreshMgr,
+                                       TRegistrationId aRegistrationId,
+                                       CSIPRequest* aRequest,
+                                       MRefreshOwner* aOwner,
+                                       MSIPSecUser& aSIPSecUser,
+                                       CURIContainer& aRemoteTarget,
+                                       TBool aPassAllResponsesToOwner)
+	{
+	__SIP_ASSERT_LEAVE (aOwner, KErrArgument);
+
+	CSipAnyRefresh* self = new(ELeave)CSipAnyRefresh(aTU, aTimerMgr, aSIPSec,
+	                                                 aRefreshMgr, 
+	                                                 aRegistrationId, aOwner,
+													 aSIPSecUser,
+													 aPassAllResponsesToOwner);
+	CleanupStack::PushL (self);
+	self->ConstructL(aRequest, aRemoteTarget);
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::~CSipAnyRefresh
+// -----------------------------------------------------------------------------
+//
+CSipAnyRefresh::~CSipAnyRefresh ()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::CSipAnyRefresh
+// -----------------------------------------------------------------------------
+//
+CSipAnyRefresh::CSipAnyRefresh (MTransactionUser& aTU,
+                                MTimerManager&    aTimerMgr,
+                                CSIPSec&          aSIPSec,
+				                CSipRefreshMgr&   aRefreshMgr,
+				                TRegistrationId   aRegistrationId,
+                                MRefreshOwner*    aOwner,
+                                MSIPSecUser&      aSIPSecUser,
+								TBool             aPassAllResponsesToOwner)
+ : CSipRefreshBase (aTU, aTimerMgr, aSIPSec, aRefreshMgr, 
+                    aRegistrationId, aOwner, aSIPSecUser),
+   iPassAllResponsesToOwner (aPassAllResponsesToOwner)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::ConstructL (CSIPRequest* aRequest,
+                                 CURIContainer& aRemoteTarget)
+	{
+	__SIP_ASSERT_LEAVE (aRequest, KErrArgument);
+
+	__SIP_ASSERT_LEAVE (
+	    aRequest->Method() != SIPStrings::StringF(SipStrConsts::ERegister),
+	    KErrArgument);
+
+	CSIPExpiresHeader* expires = static_cast<CSIPExpiresHeader*>(
+        aRequest->Header(SIPStrings::StringF(SipStrConsts::EExpiresHeader),0));
+
+	__SIP_ASSERT_LEAVE (expires, KErrArgument);
+
+	__SIP_ASSERT_LEAVE (expires->Value() > 0, KErrArgument);
+	
+	CSipRefreshBase::BaseConstructL(aRemoteTarget,*aRequest);
+	}
+
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::Forward2xxResponseToCallerL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::Forward2xxResponseToCallerL (CSIPResponse* aResponse)
+	{
+	if (iFirstRequest || iPassAllResponsesToOwner) 
+		{
+		RefreshReceivedL(iCurrentTransactionId, aResponse);
+		}
+    else
+		{
+		delete aResponse;
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::SetExpirationTimeToRequestL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::SetExpirationTimeToRequestL(CSIPRequest& aRequest,
+                                                 TUint aExpirationTimeInSeconds)
+	{
+	CSIPExpiresHeader* expires = static_cast<CSIPExpiresHeader*>(
+        aRequest.Header(SIPStrings::StringF(SipStrConsts::EExpiresHeader),0));	
+	
+	__SIP_ASSERT_LEAVE (expires, KErrArgument);
+
+	expires->SetValue(aExpirationTimeInSeconds);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::SetExpirationTimeToResponseL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::SetExpirationTimeToResponseL(CSIPResponse& 
+												  aResponse, 
+		                                          TUint         
+										   	      aExpirationTimeInSeconds)
+	{
+	SetExpireTimeToResponseExpiresHeaderL(aResponse, aExpirationTimeInSeconds);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::ExpirationTimeFromRequestL
+// -----------------------------------------------------------------------------
+//
+TInt CSipAnyRefresh::ExpirationTimeFromRequestL (CSIPRequest& aRequest)
+	{
+	CSIPExpiresHeader* expires = static_cast<CSIPExpiresHeader*>(
+        aRequest.Header(SIPStrings::StringF(SipStrConsts::EExpiresHeader),0));	
+	
+	__SIP_ASSERT_RETURN_VALUE (expires, KErrNotFound);
+	
+	return (expires->Value());
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::ExpirationTimeFromResponse
+// -----------------------------------------------------------------------------
+//
+TInt CSipAnyRefresh::ExpirationTimeFromResponse (CSIPResponse& aResponse)
+	{
+	return ExpireTimeFromResponseExpiresHeader(aResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::CheckUpdateRequestExpiresValueL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::CheckUpdateRequestExpiresValueL(CSIPRequest& aRequest)
+	{
+	// do not check expires header value after this, the refresh will be 
+	// terminated when error happens or receive any final response.
+	CSIPExpiresHeader* expires = static_cast<CSIPExpiresHeader*>(
+        aRequest.Header(SIPStrings::StringF(SipStrConsts::EExpiresHeader),0));	
+	
+	__SIP_ASSERT_LEAVE (expires, KErrArgument);
+	}
+
+// -----------------------------------------------------------------------------
+// CSipAnyRefresh::CheckTerminateRequestExpiresValueL
+// -----------------------------------------------------------------------------
+//
+void CSipAnyRefresh::CheckTerminateRequestExpiresValueL(CSIPRequest& aRequest)
+	{
+	CSIPExpiresHeader* expires = static_cast<CSIPExpiresHeader*>(
+        aRequest.Header(SIPStrings::StringF(SipStrConsts::EExpiresHeader),0));	
+	if (expires)
+		{
+		expires->SetValue(0);
+		}
+	else
+		{
+		expires = new(ELeave)CSIPExpiresHeader(0);
+		CleanupStack::PushL(expires);
+		aRequest.AddHeaderL(expires);
+		CleanupStack::Pop(expires);
+		}
+	}