realtimenetprots/sipfw/SIP/SIPSec/IpSecPlugin/src/CStateInUse.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/SIPSec/IpSecPlugin/src/CStateInUse.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,177 @@
+// Copyright (c) 2006-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          : CStateInUse.cpp
+// Part of       : SIPSec, IpSec Plugin
+// Version       : SIP/5.0
+//
+
+
+
+#include "sipsecurityverifyheader.h"
+#include "sipsecurityclientheader.h"
+#include "siprequest.h"
+#include "TSIPTransportParams.h"
+#include "CSipSecAgreeRecord.h"
+#include "MIpSecAgreeContextParams.h"
+#include "CStateInUse.h"	
+#include "MIpSecMechanismParams.h"
+#include "CleanupResetAndDestroy.h"
+
+// ----------------------------------------------------------------------------
+// CInUse::CInUse
+// ----------------------------------------------------------------------------
+//
+CInUse::CInUse()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CInUse::State
+// ----------------------------------------------------------------------------
+//
+CState::TSecAgreeRecordState CInUse::State()
+	{
+	return EInUse;
+	}
+
+// ----------------------------------------------------------------------------
+// CInUse::TimerExpiredL
+// ----------------------------------------------------------------------------
+//
+void CInUse::TimerExpiredL( CSipSecAgreeRecord& aRec,
+							TTimerId /* aTimerId */,
+							TAny* /* aTimerParam */ )
+	{
+	DeleteSasL( aRec );
+	}
+
+// ----------------------------------------------------------------------------
+// CInUse::RegisterL
+// ----------------------------------------------------------------------------
+//			
+void CInUse::RegisterL( CSipSecAgreeRecord& aRec,
+						CSIPRequest& aRequest,
+						TSIPTransportParams& aTransportParams,
+						const TDesC8& aOutboundProxy )
+	{
+    // If other record is already in temporal state, this record is not used
+    // for registration
+	if ( aRec.iParams.HasRecordInState( ETemporal ) )
+		{	
+		return;
+		}
+	
+	// Create temporary sec client headers
+    RPointerArray<CSIPSecurityHeaderBase> clientHdrs;
+    
+    CleanupResetAndDestroyPushL( clientHdrs );
+    
+    for ( TInt i = 0; i < aRec.iSecClientHeaders.Count(); i++ )
+        {
+        CSIPSecurityClientHeader* header = 
+            static_cast<CSIPSecurityClientHeader*>( 
+                aRec.iSecClientHeaders[ i ]->CloneL() );
+        CleanupStack::PushL( header );
+        clientHdrs.AppendL( header );
+        CleanupStack::Pop( header );
+        }
+    
+	aRec.iParams.MechParams().UpdateSecCliL( clientHdrs );	
+	
+	// Copy updated sec client headers to the request
+	CSipSecAgreeRecord::CopyHeadersToMessageL( clientHdrs, aRequest, ETrue );
+
+	// Temporary client headers are not needed anymore 
+	CleanupStack::PopAndDestroy( 1 ); // clientHdrs
+
+    // Use still existing SAs
+	aTransportParams.SetTransportId( aRec.iTransportParams.TransportId() );
+
+	// Make sure that SigComp usage is not disabled
+    aTransportParams.SetIgnoreCompartmentId( EFalse );
+
+	// Add port_ps to next hop address
+	aRec.UpdateNextHopPort( aRequest, aOutboundProxy );
+	}
+
+// ----------------------------------------------------------------------------
+// CInUse::ReguestL
+// ----------------------------------------------------------------------------
+//
+void CInUse::ReguestL( CSipSecAgreeRecord& aRec,
+					   CSIPRequest& aRequest,
+					   TSIPTransportParams& aTransportParams,
+					   const TDesC8& aOutboundProxy )
+	{
+	// Set transport id for outgoing request so that protected transports
+	// are used
+	aTransportParams.SetTransportId( aRec.iTransportParams.TransportId() );
+
+	// Make sure that SigComp usage is not disabled
+    aTransportParams.SetIgnoreCompartmentId( EFalse );
+    
+	// Add port_ps to next hop address
+	aRec.UpdateNextHopPort( aRequest, aOutboundProxy );
+	}	      
+
+// ----------------------------------------------------------------------------
+// CInUse::Resp2xxL
+// ----------------------------------------------------------------------------
+//		
+void CInUse::Resp2xxL( CSipSecAgreeRecord& aRec, CSIPResponse& aResponse )
+	{
+	// Check whether 200 OK was received directly for re-registration
+	if ( aRec.iParams.HasOnlyOneRecord() )
+	    {
+	    UpdateExpirationTimeL( aRec, aResponse );
+	    }
+	else
+	    {
+	    // There are now two SA records, the second record was created when a
+	    // 401 was received earlier. The new record enters "in use" state when
+	    // it gets the 2xx and this record, which already is "in use" enters
+	    // "old" state.
+    	aRec.NextState( EOld );
+	    }
+	}
+
+// ----------------------------------------------------------------------------
+// CInUse::ProcessSecVerifyL
+// ----------------------------------------------------------------------------
+// 	
+void CInUse::ProcessSecVerifyL( 
+    CSipSecAgreeRecord& aRec,
+	RPointerArray<CSIPSecurityVerifyHeader>& aSecurityVerify )
+    {
+    // If two records exist but more recent is not yet in "temporal" state,
+    // old sec verify hdrs should be used
+    if ( !aRec.iParams.HasOnlyOneRecord() &&
+         !aRec.iParams.HasRecordInState( ETemporal ) )
+        {
+	    aSecurityVerify.ResetAndDestroy();
+	    RPointerArray<CSIPSecurityHeaderBase>& secVerifys = 
+			aRec.SecurityHeaders( EFalse );
+	    for ( TInt i = 0; i < secVerifys.Count(); i++ )
+	        {
+	        CSIPSecurityVerifyHeader* secHdr = 
+	            static_cast<CSIPSecurityVerifyHeader*>(
+					secVerifys[ i ]->CloneL() );
+	        CleanupStack::PushL( secHdr );
+	        aSecurityVerify.AppendL( secHdr );
+	        CleanupStack::Pop( secHdr );
+	        }
+		}
+    }
+
+// End of File