diff -r 000000000000 -r 307788aac0a8 rtp/srtpstack/src/srtpstreamin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rtp/srtpstack/src/srtpstreamin.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,425 @@ +/* +* 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 "msrtpstreamincontext.h" +#include "srtpstreamin.h" +#include "tsrtpstreaminstatebase.h" +#include "tsrtpstreaminstateuninit.h" +#include "tsrtpstreaminstatelatebind.h" +#include "tsrtpstreaminstatenormal.h" +#include "srtpsession.h" +#include "srtpcryptohandler.h" +#include "srtpcryptohandlersrtp.h" +#include "srtpcryptohandlersrtcp.h" +#include "srtputils.h" + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses default cryptographic context +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession, + TUint aSSRC) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( aSession, aSSRC); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses its own cryptographic context +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession, + TUint aSSRC, + CSRTPCryptoContext* aCon, + MSRTPReKeyingObserver& aObs ) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( 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; + } + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses default cryptographic context +// and "late binding". No SSRC is provided by the user. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( aSession); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses its own cryptographic context +// and "late binding". No SSRC is provided by the user. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession, + CSRTPCryptoContext* aCon, + MSRTPReKeyingObserver& aObs ) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( aSession, + 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; + } + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses its own cryptographic context +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession, + TUint aSSRC, + MSRTPReKeyingObserver& aObs ) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( aSession, aSSRC,aObs); + return self; + } + +// --------------------------------------------------------------------------- +// Constructor. Used when stream uses its own cryptographic context +// and "late binding". No SSRC is provided by the user. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CSRTPStreamIn* CSRTPStreamIn::NewL( CSRTPSession& aSession, + MSRTPReKeyingObserver& aObs ) + { + CSRTPStreamIn* self = new( ELeave )CSRTPStreamIn( aSession, aObs); + return self; + } +// ----------------------------------------------------------------------------- +// CSRTPStreamIn::ConstructL +// ----------------------------------------------------------------------------- +// +void CSRTPStreamIn::ConstructL() + { + CreateCryptoHandlerSRTPL(); + CreateCryptoHandlerSRTCPL(); + InitializeStatesL(); + } + +// ----------------------------------------------------------------------------- +// CSRTPStreamIn::SetCryptoInL() +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSRTPStreamIn::SetCryptoInL(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 ); + } + + if (SSRC()) + { + ChangeRTPState(MSRTPStreamInContext::ESRTPStreamInUninitialized); + ChangeRTCPState(MSRTPStreamInContext::ESRTPStreamInUninitialized); + } + else + { + ChangeRTPState(MSRTPStreamInContext::ESRTPStreamInLateBinding); + ChangeRTCPState(MSRTPStreamInContext::ESRTPStreamInLateBinding); + } + } + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::ReInitialInStates +// +// --------------------------------------------------------------------------- +// +void CSRTPStreamIn::UpdateCryptoAndStatesL() + { + if( !iStrmSpecificCrypto) + { + UpdateCryptoHandlerL(); + iStates.Reset(); + InitializeStatesL(); + if (SSRC()) + { + ChangeRTPState(MSRTPStreamInContext::ESRTPStreamInUninitialized); + ChangeRTCPState(MSRTPStreamInContext::ESRTPStreamInUninitialized); + } + else + { + ChangeRTPState(MSRTPStreamInContext::ESRTPStreamInLateBinding); + ChangeRTCPState(MSRTPStreamInContext::ESRTPStreamInLateBinding); + } + } + } +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession, + TUint aSSRC) + : CSRTPStream(aSession, aSSRC, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInUninitialized), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInUninitialized) + + { + + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::~CSRTPStreamIn +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::~CSRTPStreamIn( ) + { + delete iHandlerRTP; + delete iHandlerRTCP; + if (iStrmSpecificCrypto ) + { + delete iContext; iContext=NULL; + } + iStates.Reset(); + iHandlerRTP=NULL; + iHandlerRTCP=NULL; + } +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession, + TUint aSSRC, + CSRTPCryptoContext* aCon, + MSRTPReKeyingObserver& aObs ) + : CSRTPStream(aSession, aSSRC, aCon, aObs, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInUninitialized), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInUninitialized) + + { + + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession, + TUint aSSRC, + MSRTPReKeyingObserver& aObs ) + : CSRTPStream(aSession, aSSRC, aObs, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInUninitialized), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInUninitialized) + + { + + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession) + : CSRTPStream(aSession, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInLateBinding), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInLateBinding) + + { + + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession, + CSRTPCryptoContext* aCon, + MSRTPReKeyingObserver& aObs ) + : CSRTPStream(aSession, aCon, aObs, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInLateBinding), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInLateBinding) + + { + + } + +// --------------------------------------------------------------------------- +// CSRTPStreamIn::CSRTPStreamIn +// +// --------------------------------------------------------------------------- +// +CSRTPStreamIn::CSRTPStreamIn( CSRTPSession& aSession, + MSRTPReKeyingObserver& aObs ) + : CSRTPStream(aSession, aObs, ETrue), + iStates(MSRTPStreamInContext::EMaxStates), + iCurrentRTPState(MSRTPStreamInContext::ESRTPStreamInLateBinding), + iCurrentRTCPState(MSRTPStreamInContext::ESRTPStreamInLateBinding) + + { + + } + + +// --------------------------------------------------------------------------- +// HBufC8* CSRTPStreamIn::UnprotectSrtpL() +// +// --------------------------------------------------------------------------- +// +EXPORT_C HBufC8* CSRTPStreamIn::UnprotectSrtpL( const TDesC8& aPacket ) + { + SRTP_DEBUG_DETAIL( "CSRTPStreamIn::UnprotectSrtpL Entry" ); + + if ( IsContextSet() ) + { + SRTP_DEBUG_DETAIL( "CSRTPStreamIn::UnprotectSrtpL Exit" ); + return (CurrentRTPState().DoUnprotectSrtpL(aPacket) ); + } + SRTP_DEBUG_DETAIL( "CSRTPStreamIn::UnprotectSrtpL Exit" ); + + User::Leave (KErrArgument); + return NULL; + } + +// --------------------------------------------------------------------------- +// HBufC8* CSRTPStreamIn::UnprotectSrtcpL() +// +// --------------------------------------------------------------------------- +// +EXPORT_C HBufC8* CSRTPStreamIn::UnprotectSrtcpL( const TDesC8& aPacket ) + { + if (IsContextSet()) + return (CurrentRTCPState().DoUnprotectSrtcpL(aPacket)); + User::Leave (KErrArgument); + return NULL; + } + + +// ----------------------------------------------------------------------------- +// CSRTPStreamIn::InitializeStatesL +// ----------------------------------------------------------------------------- +// +void CSRTPStreamIn::InitializeStatesL() + { + iStates.AppendL(TSRTPStreamInStateUninit(*this, *iHandlerRTP, *iHandlerRTCP), + sizeof(TSRTPStreamInStateUninit)); + iStates.AppendL(TSRTPStreamInStateLateBind(*this, *iHandlerRTP, *iHandlerRTCP), + sizeof(TSRTPStreamInStateLateBind)); + iStates.AppendL(TSRTPStreamInStateNormal(*this, *iHandlerRTP, *iHandlerRTCP), + sizeof(TSRTPStreamInStateNormal)); + } + +// ----------------------------------------------------------------------------- +// CSRTPStreamIn::ChangeRTPState +// ----------------------------------------------------------------------------- +// +void CSRTPStreamIn::ChangeRTPState(MSRTPStreamInContext::TContextInState aNewState) + { + SRTP_DEBUG_TINT_VALUE( "CSRTPStreamIn::ChangeRTPState", aNewState); + + iCurrentRTPState = aNewState; + } + +// ----------------------------------------------------------------------------- +// CSRTPStreamIn::ChangeRTCPState +// ----------------------------------------------------------------------------- +// +void CSRTPStreamIn::ChangeRTCPState(MSRTPStreamInContext::TContextInState aNewState) + { + iCurrentRTCPState = aNewState; + } + +// ---------------------------------------------------------------------------- +// CSRTPStreamIn::CurrentRTPState +// ---------------------------------------------------------------------------- +// +TSRTPStreamInStateBase& CSRTPStreamIn::CurrentRTPState() + { + SRTP_DEBUG_TINT_VALUE( "CSRTPStreamIN::CurrentRTPState()", iCurrentRTPState); + SRTP_DEBUG_TINT_VALUE( "CSRTPStreamIN::RTP State Count", iStates.Count() ); + + return iStates.At(iCurrentRTPState); + } + +// ---------------------------------------------------------------------------- +// CSRTPStreamIn::CurrentRTCPState +// ---------------------------------------------------------------------------- +// +TSRTPStreamInStateBase& CSRTPStreamIn::CurrentRTCPState() + { + SRTP_DEBUG_TINT_VALUE( "CSRTPStreamIN::CurrentRTCPState()", iCurrentRTPState ); + SRTP_DEBUG_TINT_VALUE( "CSRTPStreamIN::RTCP State Count", iStates.Count() ); + + return iStates.At(iCurrentRTCPState); + } +