rtp/rtpstack/inc/rtpmanager.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:57:13 +0300
branchRCL_3
changeset 56 2c7192069824
parent 44 0dcb073356a5
permissions -rw-r--r--
Revision: 201038 Kit: 201041

/*
* Copyright (c) 2004-2005 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:    
*
*/




#ifndef __RTPMANAGER_H
#define __RTPMANAGER_H

#include <commdbconnpref.h>
#include <es_enum.h>
#include <rtpdef.h>
#include <rtpheader.h>
#include <extendedconnpref.h>
#include <connpref.h>
#include "rtpsession.h"
#include "rtpsdes.h"
#include "localaddrresolver.h"
#include "rtpmanagerdef.h"
#include "rtpasignuniqueid.h"
#include "srtpsession.h"
#include "rtpsessionsrtp.h"

/**
*  Container of all rtp sessions. 
*
*  @lib RtpService.dll
*/
class CRtpManager : public CBase,
    				public MRtpAsignUniqueID
    {
    #if defined( _DEBUG ) && defined( RTP_UNIT_TEST )
    // Friend class used for testing
        friend class CRtpUtRtpManager;
    #endif
    public: // Data types
        enum TCreateStreamType
            {
            ECreateRecvStream = 0,
            ECreateTranStream,
            ECreateTranStreamExt
            };

    public:
        static CRtpManager* NewL( MRtpErrNotify& aErrNotify );
        ~CRtpManager();

        TInt OpenL( const TRtpSdesParams& aSdesInfo, 
                    const TDesC* aRtpPacketDll, 
                    RSocketServ* aSocketServPtr,
                    RConnection* aRConnPtr );

        /**
        * Open and initialize the CRtpAPI object synchronously.
        * @param TInt aIapId - [input] IAP ID. If -1, no IAP selection dialog
        *   will pop up. Instead, the default IAP will be used.
        * @return TInt - KErrNone if successful; system wide error code
        *   otherwise
        */
        TInt StartConnection( TInt aIapId );

        /**
        * Open and initialize the CRtpAPI object in asynchronous mode
        * @param TRequestStatus& aStatus - [output] On completion, will contain
        *   a status code: KErrNone if successful; system wide error code
        *   otherwise.
        * @param TInt aIapId - [input] IAP ID. If -1, no IAP selection dialog
        *   will pop up. Instead, the default IAP will be used.
        * @return TInt - KErrNone if successful; system wide error code
        *   otherwise
        */
        TInt StartConnection( TRequestStatus& aStatus, TInt aIapId );

        /**
        * Cancels asynchoronous start of connection
        * Any open requests will be completed with KErrCancel.
        * @return None
        */
        void CancelStart(); 

        void Close( void );

        void SetLocalSdes( const TRtpSdesParams& aSdesInfo );

        TInetAddr& GetLocalIPAddressL();

        TRtpId CreateSessionL( const TCreateSessionParams& aSessionParams,
                               TUint& aPort,
                               TBool aEnableRtcp,
                               const TRtcpParams* aRtcpParams );
                               
		TRtpId CreateSessionL( const TCreateSessionParams& aSessionParams,
                               TUint& aPort,
                               TBool aEnableRtcp,
                               const TRtcpParams* aRtcpParams,
                               CSRTPSession& aSRTPSession );
        TInt StartSession( TRtpId aSessionId );

        void CloseSession( TRtpId aSessionId );

        TInt SetRemoteAddress( TRtpId aSessionId, TInetAddr& aRemoteAddr );
        TInt SetRemoteRtcpAddress( TRtpId aSessionId, TInetAddr& aRemoteAddr );

        /**
        * Does the actual work of creating a stream. Used by the other
        * stream creation methods.
        * @return ID of the created stream, or KNullId if not successful
        */
        TRtpId CreateStreamL( TRtpId aSessionId,
                              const TCreateStreamType aStreamType,
                              TRtpPayloadType aPayloadType,
                              TRtpSSRC& aSSRC );

        TRtpId CreateReceiveStreamL( TRtpId aSessionId, const TRcvStreamParams& aParams );
        TRtpId CreateTransmitStreamL( TRtpId aSessionId, const TTranStreamParams& aParams, 
                                      TRtpSSRC& aSSRC );

        TRtpId CreateTransmitStreamExtL( TRtpId aSessionId, const TTranStreamParams& aParams, 
                                         const TRtpSSRC aSSRC );

        void CloseStream( TRtpId aStreamId );

        TInt RegisterRtpObserver( TRtpId aSessionId, MRtpObserver& aObserver );

        void UnregisterRtpObserver( TRtpId aSessionId );

        TInt SetNonRTPDataObserver( TRtpId aSessionId, 
                                    MNonRTPDataObserver* aNonRTPDataObserver );
        
        TInt SendRtpPacket( TRtpId aTranStreamId, 
                            const TRtpSendHeader& aHeaderInfo, 
                            const TDesC8& aPayloadData );

        TInt SendRtpPacket( TRtpId aTranStreamId,
                            const TRtpSendHeader& aHeaderInfo,
                            const TDesC8& aPayloadData,
                            TRequestStatus& aStatus );

        TInt SendRtpPacket( TRtpId aTranStreamId,
                            TRtpSequence aSequenceNum,
                            const TRtpSendHeader& aHeaderInfo,
                            const TDesC8& aPayloadData,
                            TRequestStatus& aStatus );

        void SendDataL( TRtpId aSessionId,
                       TBool aUseRTPSocket,
                       const TDesC8& aData,
                       TRequestStatus& aStatus );

        void CancelSend( TRtpId aSessionId );

        TInt RegisterRtcpObserver( TRtpId aSessionId, MRtcpObserver& aObserver );

        void UnregisterRtcpObserver( TRtpId aSessionId );

        TInt SendRtcpByePacketL( TRtpId aTranStreamId, const TDesC8& aReason );

        TInt SendRtcpAppPacketL( TRtpId aTranStreamId, const TRtcpApp& aApp );

        /**
        * Send an RTCP RR packet for a Reception stream.
        * @param TRtpId aRcvStreamId - [input] Reception stream ID
        * @return TInt - KErrNone if successful; system wide error code otherwise
        */
        TInt SendRtcpRrPacketL( TRtpId aRcvStreamId );
        
        /**
        * Send an RTCP SR packet for a Transmit stream.
        * @param TRtpId aTranStreamId - [input] Transmit stream ID
        * @return TInt - KErrNone if successful; system wide error code otherwise
        */
        TInt SendRtcpSrPacketL( TRtpId aTranStreamId );

        /**
        * Suspend RTCP sending on/off, calculations will continue. 
        * @param TRtpId aSessionId - [input] RTP Session ID
        * @param TBool aAutoSending - [input] Auto sending flag. 
        *							  ETrue:  RTCP sending will be scheduled normally
        *							  EFalse: RTCP sending will be suspended
        * @return TInt - KErrNone if successful; KErrNotFound if invalid session id;
        *				 KErrNotSupported if RTCP disabled;  system wide error code otherwise				
        */
        TInt SuspendRtcpSending( TRtpId aSessionId, TBool aAutoSending );
        
		/**
        * Gets the status of automatic RTCP sending.
        * @param TRtpId aSessionId - [input] RTP Session ID
        * @param TBool aAutoSending - [output] ETrue: RTCP atuo sending is on 
        *				  					   EFalse: RTCP auto sending is off
 		* @return TInt - KErrNone if successful; KErrNotFound if invalid session id;
        *				 KErrNotSupported if RTCP disabled;  system wide error code otherwise
        */
        TInt IsRtcpSendingSuspended( TRtpId aSessionId, TBool& aAutoSending );

        TRtpId GetSessionId( TRtpId aStreamId );

        RSocket* GetRtpSocket( TRtpId aSessionId );

        RSocket* GetRtcpSocket( TRtpId aSessionId );

        TInt GetStreamStatistics( TRtpId aStreamId, TRtpPeerStat& aStat );

        TUint32 GetSamplingRate( TUint8 aPayloadType );

        TInt SetSamplingRate( TUint8 aPayloadType, TUint32 aSampleRate );

        TInt SetRtcpParameters( TRtpId aSessionId, const TRtcpParams& aRtcpParams );

    private:
        CRtpManager( MRtpErrNotify& aErrNotify );
        void ConstructL( void );
        CRtpSession* GetSession( TRtpId aSessionId );

        TRtpId AssignUniqueID();
        TInt AddRtpObject( TArrayStore aArrayID );
        TInt FindRtpObject( const TRtpId aMagicKey, TUint& aSessionAddress );
        TInt RemoveRtpObject( const TRtpId aMagicKey, const TObjectType aObjectType );
        void RemoveRtpAllObjects();
    
        /*
        * Opens the socket server and the connection
        * @return KErrNone if successful, system error code otherwise
        */
        TInt PrepareConnection( TConnPrefList& aPrefs, TInt aIapId );

        /*
        * @return Internet Access Point ID of iConn
        */
        TInt GetIapId( TUint32& aIapId );
        
        TInt AddStreamToSession(TRtpId aSessionId, TRtpId aStreamId);

        void CheckSdesCName();
        
    private:   // data
        TBool iStandardRtp;
        TBool iEnableRtcp;
        RLibrary iLibrary;

        RSocketServ iSocketServ;
        RConnection iConn;
        RSocketServ* iSocketServPtr;  // Don't use until future
        RConnection* iConnPtr;    // Don't use until future
        TBool iConnected;
		TInt iIapId;

        TInetAddr iLocalAddr;

        CRtpSDES* iDefaultSdes;

        TRtpId iNumOfObjects;   // count of session and participants IDs assigned
        CArrayFixFlat<TArrayStore>* iSessionArray;   //keep track of all RTP session;

        TUint32 iProfileRTPTimeRates[KRtpMaxPayloadTypes];

        MRtpErrNotify& iErrNotify;

        TConnPrefList iPrefs;
        TExtendedConnPref iPreferences;
        
    private:    
    #ifdef EUNIT_TESTING
	  friend class UT_CRtpAPI;
	  friend class UT_CRtpManager;
	#endif     	    
        
    };

#endif    // __RTPMANAGER_H

// End of File