rtp/srtpstack/src/srtpstreamout.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rtp/srtpstack/src/srtpstreamout.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,298 @@
+/*
+* Copyright (c) 2004 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:    Represents an SRTP stream.
+*
+*/
+
+
+
+
+// INCLUDES
+#include "srtpstreamout.h"
+#include "tsrtpstreamoutstatebase.h"
+#include "tsrtpstreamoutstateuninit.h"
+#include "tsrtpstreamoutstatenormal.h"
+#include "srtpsession.h"
+#include "srtpcryptohandler.h"
+#include "srtpcryptohandlersrtp.h"
+#include "srtpcryptohandlersrtcp.h"
+#include "srtputils.h"
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor. Used when stream uses default cryptographic context
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CSRTPStreamOut* CSRTPStreamOut::NewL( CSRTPSession& aSession, TUint aSSRC )
+    {
+    CSRTPStreamOut* self = new( ELeave )CSRTPStreamOut( aSession, aSSRC);
+    CleanupStack::PushL( self );    
+    self->ConstructL();
+    CleanupStack::Pop( self );        
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Used when stream uses its own cryptographic context
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CSRTPStreamOut* CSRTPStreamOut::NewL( CSRTPSession& aSession,
+                                       TUint aSSRC,
+                                       CSRTPCryptoContext* aCon,
+                                       MSRTPReKeyingObserver& aObs )
+    {
+    CSRTPStreamOut* self = new( ELeave )CSRTPStreamOut( aSession, aSSRC, 
+                                                      aCon, aObs);
+    CleanupStack::PushL( self );    
+    TRAPD( err, self->ConstructL() );
+    if ( err )
+        {
+        self->iStrmSpecificCrypto = EFalse; // Cannot take ownership
+        User::Leave( err );
+        }
+    CleanupStack::Pop( self );        
+    return self;
+    }	
+
+// ---------------------------------------------------------------------------
+// Used when crypto context will be set later to this stream
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CSRTPStreamOut* CSRTPStreamOut::NewL( CSRTPSession& aSession,
+                                       TUint aSSRC,
+                                       MSRTPReKeyingObserver& aObs )
+    {
+    CSRTPStreamOut* self = new( ELeave )CSRTPStreamOut( aSession, aSSRC, 
+                                                       aObs);
+         
+    return self;
+    }	
+
+// ---------------------------------------------------------------------------
+// CSRTPStreamOut::CSRTPStreamOut
+// 
+// ---------------------------------------------------------------------------
+//
+CSRTPStreamOut::CSRTPStreamOut( CSRTPSession& aSession,
+                                      TUint aSSRC)
+    :   CSRTPStream(aSession, aSSRC, EFalse),
+        iStates(MSRTPStreamOutContext::EMaxStates),
+        iCurrentRTPState(ESRTPStreamOutUninitialized),
+        iCurrentRTCPState(ESRTPStreamOutUninitialized)
+    {
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CSRTPStreamOut::CSRTPStreamOut
+// 
+// ---------------------------------------------------------------------------
+//
+CSRTPStreamOut::CSRTPStreamOut( CSRTPSession& aSession,
+                                      TUint aSSRC,
+                                      CSRTPCryptoContext* aCon,
+                                      MSRTPReKeyingObserver& aObs )
+    :   CSRTPStream(aSession, aSSRC, aCon, aObs,  EFalse),
+        iStates(MSRTPStreamOutContext::EMaxStates),
+        iCurrentRTPState(ESRTPStreamOutUninitialized),      
+        iCurrentRTCPState(ESRTPStreamOutUninitialized)    
+    {
+    
+    }
+    
+// ---------------------------------------------------------------------------
+// CSRTPStreamOut::CSRTPStreamOut
+// 
+// ---------------------------------------------------------------------------
+//
+CSRTPStreamOut::CSRTPStreamOut( CSRTPSession& aSession,
+                                      TUint aSSRC,
+                                      MSRTPReKeyingObserver& aObs )
+    :   CSRTPStream(aSession, aSSRC, aObs,  EFalse),
+        iStates(MSRTPStreamOutContext::EMaxStates),
+        iCurrentRTPState(ESRTPStreamOutUninitialized),      
+        iCurrentRTCPState(ESRTPStreamOutUninitialized)    
+    {
+    
+    }    
+	
+// -----------------------------------------------------------------------------
+// CSRTPStreamOut::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSRTPStreamOut::ConstructL()
+	{
+	CreateCryptoHandlerSRTPL();
+    CreateCryptoHandlerSRTCPL();
+    InitializeStatesL();
+	}
+
+// -----------------------------------------------------------------------------
+// CSRTPStreamOut::SetCryptoOutL()
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSRTPStreamOut::SetCryptoOutL(CSRTPCryptoContext* aCon)
+	{
+	//checking if there is one crytpocontext existed
+	//construct only when stream has its own cryto handler
+	if( !aCon)
+	    {
+	    User::Leave( KErrArgument );
+	    }
+	if (!iRekey )
+		{
+		delete iHandlerRTP; iHandlerRTP=NULL;    
+    	delete iHandlerRTCP;iHandlerRTCP=NULL; 
+    	delete iContext; iContext=NULL;
+		iContext= aCon;
+		iStrmSpecificCrypto= ETrue;
+    	iStates.Reset(); 
+    	//should create handler and initial state
+    	TRAPD( err, 
+    	    {
+    	    CreateCryptoHandlerSRTPL();
+        	CreateCryptoHandlerSRTCPL();
+        	InitializeStatesL();
+    	    } );
+    	if ( err )
+    	    {
+    	    iContext = NULL; // Cannot take ownership if leave occurs
+    	    User::Leave( err );
+    	    }
+    	ChangeRTPState(MSRTPStreamOutContext::ESRTPStreamOutUninitialized);
+    	ChangeRTCPState(MSRTPStreamOutContext::ESRTPStreamOutUninitialized);
+		}
+	}
+	
+// ---------------------------------------------------------------------------
+// CSRTPStreamOut::ReInitialOutStates
+// 
+// ---------------------------------------------------------------------------
+//
+void CSRTPStreamOut::UpdateCryptoAndStatesL()
+	{
+	if( !iStrmSpecificCrypto)
+		{
+		UpdateCryptoHandlerL();
+		iStates.Reset(); 
+		InitializeStatesL();
+		ChangeRTPState(MSRTPStreamOutContext::ESRTPStreamOutUninitialized);
+		ChangeRTCPState(MSRTPStreamOutContext::ESRTPStreamOutUninitialized);
+		}	
+	}
+// ---------------------------------------------------------------------------
+// HBufC8* CSRTPStreamOut::ProtectRtpL(
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CSRTPStreamOut::ProtectRtpL( const TDesC8& aPacket )
+    {    
+    if (IsContextSet())       
+    	return (CurrentRTPState().DoProtectRtpL(aPacket));
+    //it is using session crypto but the crypto handler is not been generated yet
+    //it is stream specific crypto but handler is not set yet	
+    User::Leave (KErrArgument);
+    return NULL;
+    }
+    
+// ---------------------------------------------------------------------------
+// HBufC8* CSRTPStreamOut::ProtectRtcpL(
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CSRTPStreamOut::ProtectRtcpL( const TDesC8& aPacket )
+    {
+    if (IsContextSet())
+    	return (CurrentRTCPState().DoProtectRtcpL(aPacket));
+    User::Leave (KErrArgument);
+    return NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSRTPStreamOut::InitializeStatesL
+// -----------------------------------------------------------------------------
+//	
+void CSRTPStreamOut::InitializeStatesL()
+    {
+	iStates.AppendL(TSRTPStreamOutStateUninit(*this, *iHandlerRTP, *iHandlerRTCP),
+					sizeof(TSRTPStreamOutStateUninit));
+	iStates.AppendL(TSRTPStreamOutStateNormal(*this, *iHandlerRTP, *iHandlerRTCP),
+					sizeof(TSRTPStreamOutStateNormal));
+    }
+
+// ---------------------------------------------------------------------------
+// CSRTPStreamOut::~CSRTPStreamOut
+// ---------------------------------------------------------------------------
+//
+CSRTPStreamOut::~CSRTPStreamOut( )
+    {
+    delete iHandlerRTP;   
+    delete iHandlerRTCP;
+    if (iStrmSpecificCrypto ) 
+    	{
+    	delete iContext; iContext=NULL;
+    	}  
+     
+	iStates.Reset();
+	iHandlerRTP=NULL;  
+	iHandlerRTCP=NULL; 
+	}    
+
+
+// -----------------------------------------------------------------------------
+// CSRTPStreamOut::ChangeRTPState
+// -----------------------------------------------------------------------------
+//      
+void CSRTPStreamOut::ChangeRTPState(MSRTPStreamOutContext::TContextOutState aNewState)
+    {
+    SRTP_DEBUG_TINT_VALUE( "CSRTPStreamOut::ChangeRTPState to new State", aNewState);
+     
+    iCurrentRTPState = aNewState;
+    }
+
+// -----------------------------------------------------------------------------
+// CSRTPStreamOut::ChangeRTCPState
+// -----------------------------------------------------------------------------
+//      
+void CSRTPStreamOut::ChangeRTCPState(TContextOutState aNewState)
+    {
+    iCurrentRTCPState = aNewState;
+    }
+
+// ----------------------------------------------------------------------------
+// CSRTPStreamOut::CurrentRTPState
+// ----------------------------------------------------------------------------
+//
+TSRTPStreamOutStateBase& CSRTPStreamOut::CurrentRTPState()
+	{
+	SRTP_DEBUG_TINT_VALUE( "CSRTPStreamOut::CurrentRTPState()", iCurrentRTPState);
+    SRTP_DEBUG_TINT_VALUE( "CSRTPStreamOut State count", iStates.Count() );    
+                
+    
+    return iStates.At(iCurrentRTPState);
+	}
+
+// ----------------------------------------------------------------------------
+// CSRTPStreamOut::CurrentRTCPState
+// ----------------------------------------------------------------------------
+//
+TSRTPStreamOutStateBase& CSRTPStreamOut::CurrentRTCPState()
+	{
+	SRTP_DEBUG_TINT_VALUE( "CSRTPStreamOut::CurrentRTCPState()", iCurrentRTCPState);
+    SRTP_DEBUG_TINT_VALUE( "CSRTPStreamOut State count", iStates.Count() );    
+                
+    return iStates.At(iCurrentRTCPState);
+	}