--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ipappprotocols_plat/srtp_api/inc/srtpstreamin.h Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,252 @@
+/*
+* 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 receiver (incoming) SRTP stream.
+*
+*/
+
+
+
+
+#ifndef __SRTP_STREAM_IN_H__
+#define __SRTP_STREAM_IN_H__
+
+// INCLUDES
+#include <e32def.h>
+#include "srtpstream.h"
+#include "msrtpstreamincontext.h"
+
+// FORWARD DECLARATIONS
+class CSRTPSession;
+class CSRTPCryptoContext;
+class MSRTPReKeyingObserver;
+class TSRTPStreamInStateBase;
+
+/**
+* Represents an SRTP stream.
+*/
+class CSRTPStreamIn : public CSRTPStream,
+ public MSRTPStreamInContext
+ {
+ public:
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will use the SRTP session's default
+ * cryptographic context.
+ * @param aSession The session containing the cryptographic
+ * context for this object.
+ * @param aSSRC The synchronization source ID of the RTP stream
+ * that corresponds to this object.
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession,
+ TUint aSSRC);
+
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will have its own cryptographic
+ * context.
+ * @param aSession The session containing the cryptographic
+ * context for this object.
+ * @param aSSRC The synchronization source ID of the RTP stream
+ * that corresponds to this object.
+ * @param aCon The cryptographic context, ownership is transfered.
+ * @param aObs The callback object
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession,
+ TUint aSSRC,
+ CSRTPCryptoContext* aCon,
+ MSRTPReKeyingObserver& aObs );
+
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will use the SRTP session's default
+ * cryptographic context and "late binding" is to be used, that is,
+ * no SSRC is provided.
+ * @param aSession The session containing the cryptographic
+ * context for this object.
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession);
+
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will have its own cryptographic
+ * context and "late binding" is to be used, that is,
+ * no SSRC is provided.
+ * @param aSession The session containing the cryptographic
+ * context for this object.
+ * @param aCon The cryptographic context, ownership is transfered.
+ * @param aObs The callback object
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession,
+ CSRTPCryptoContext* aCon,
+ MSRTPReKeyingObserver& aObs );
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will have its own cryptographic
+ * context and this cryptographic context will be set later.
+ * Note that if the crypto context is not been set, the encoded packets
+ * will not be handled.
+ * @param aSession The session which includes the streams.
+ * @param aSSRC The synchronization source ID of the RTP stream
+ * that corresponds to this object.
+ * @param aObs The callback object
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession,
+ TUint aSSRC,
+ MSRTPReKeyingObserver& aObs );
+
+ /**
+ * Two-phased constructor.
+ * Use this function if the stream will have its own cryptographic
+ * context and "late binding" is to be used, that is,
+ * no SSRC is provided.Stream own cryptocontext will be set later.
+ * Note that if the crypto context is not been set, the encoded packets
+ * will not be handled.
+ * @param aSession The session which includes the streams.
+ * @param aObs The callback object
+ * @leave KErrNone if success, system-wide error code otherwise
+ */
+ IMPORT_C static CSRTPStreamIn* NewL( CSRTPSession& aSession,
+ MSRTPReKeyingObserver& aObs );
+
+ /**
+ * Unprotect an SRTP packet.
+ * The settings for the protection are fetched from the appropriate
+ * cryptographic context. If the operation fails, the function leaves
+ * with a system error code.
+ * @param aPacket The SRTP packet to process.
+ * @leave KErrNone if success, system-wide error code otherwise
+ * @return An RTP packet.
+ */
+ IMPORT_C HBufC8* UnprotectSrtpL( const TDesC8& aPacket );
+
+ /**
+ * Unprotect an SRTCP packet.
+ * The settings for the protection are fetched from the appropriate
+ * cryptographic context. If the operation fails, the function leaves
+ * with a system error code.
+ * @param aPacket The SRTCP packet to process.
+ * @leave KErrNone if success, system-wide error code otherwise
+ * @return An RTCP packet.
+ */
+ IMPORT_C HBufC8* UnprotectSrtcpL( const TDesC8& aPacket );
+
+ /**
+ * Set/Update CryptoContext for InStream
+ * Setting cryptographic context must be done to enable encode/decode packets.
+ * During offer/Answer, offerer do not know which crypto context is
+ * chosen by answerer. CryptoContext then can be set after getting response
+ * from answerer. If crypto context has not been set, no packets in secure
+ * session will be handled.
+ * Updating stream specific crypto Context
+ * Note that to update crypto context, ROC will not be re-intialed to zero but
+ * the states and number of receiving packets will be reset. This can be
+ * use only when keys lifetime has not expired.
+ * Crypto context ownershíp is transfered.
+ * @param aCon aCryyptoContext which wants be used, ownership is transfered.
+ * @leave KErrNone if success, system-wide error code otherwise
+ * @return void
+ */
+ IMPORT_C void SetCryptoInL(CSRTPCryptoContext* aCon);
+
+ /**
+ * Destructor
+ * Note that crypto context will be deleted if stream has it's own cryptocontext
+ */
+ ~CSRTPStreamIn( );
+
+ /**
+ * Delete the existed crypto context and re-initial the states
+ * @param None
+ * @leave KErrNone if success, system-wide error code otherwise
+ * @return void
+ */
+ void UpdateCryptoAndStatesL();
+
+
+ private: //methods
+ CSRTPStreamIn (CSRTPSession& aSession,
+ TUint aSSRC);
+
+ CSRTPStreamIn (CSRTPSession& aSession,
+ TUint aSSRC,
+ CSRTPCryptoContext* aCon,
+ MSRTPReKeyingObserver& aObs );
+
+ CSRTPStreamIn (CSRTPSession& aSession,
+ TUint aSSRC,
+ MSRTPReKeyingObserver& aObs );
+
+ CSRTPStreamIn (CSRTPSession& aSession);
+
+ CSRTPStreamIn (CSRTPSession& aSession,
+ CSRTPCryptoContext* aCon,
+ MSRTPReKeyingObserver& aObs );
+ CSRTPStreamIn (CSRTPSession& aSession,
+ MSRTPReKeyingObserver& aObs );
+
+ void ConstructL();
+
+ /**
+ * Create states defined in TSRTPStreamInStateBase
+ * @leave KErrNone if success, system-wide error code otherwise
+ * @return void.
+ */
+ void InitializeStatesL();
+
+ private:
+ TSRTPStreamInStateBase& CurrentRTPState();
+
+ TSRTPStreamInStateBase& CurrentRTCPState();
+
+ private: //from MSRTPStreamInContext
+
+ /*
+ * Change state of the current incoming stream (for RTP)
+ * @return void.
+ */
+ void ChangeRTPState(MSRTPStreamInContext::TContextInState aNewState);
+
+ /*
+ * Change state of the current incoming stream (for RTCP)
+ * @return void.
+ */
+ void ChangeRTCPState(MSRTPStreamInContext::TContextInState aNewState);
+
+ protected:
+ /*
+ states for CSRTPStreamIn
+ */
+ CArrayVarFlat<TSRTPStreamInStateBase> iStates;
+ /*
+ the same stream can handle RTP and RTCP packets,
+ these can have different states
+ */
+ MSRTPStreamInContext::TContextInState iCurrentRTPState;
+ MSRTPStreamInContext::TContextInState iCurrentRTCPState;
+
+ private:
+ friend class CSRTPSession;
+ #ifdef EUNIT_TESTING
+ friend class UT_CSRTPStreamIn;
+ friend class UT_CSRTPSession;
+ #endif
+ };
+
+#endif // __SRTP_STREAM_IN_H__
+