/****************************************************************************
 *
 *  Copyright (C) 2000-2001 RealNetworks, Inc. All rights reserved.
 *
 *  This program is free software.  It may be distributed under the terms
 *  in the file LICENSE, found in the top level of the source distribution.
 *
 */

#include "proxytran.h"
#include "string.h"
#include "tlist.h"

// the session header my contain sessionID and timeout
class CSessionHdr
{
private:
    CSessionHdr( void );

public:
    CSessionHdr( const CString & strSession );
    ~CSessionHdr( void );

    CString &GetSessionID( void );
    void  SetSessionID( CString & strSessionID );
    CString &GetSessionHdrString( void );

private:
    CString m_strSessionID;
    CString m_strTimeout;
    CString m_strSessionHdr;
};

class CProxyDataTunnel
{ 
public:
    CProxyDataTunnel( void );
    ~CProxyDataTunnel( void );

    void            AddRef( void );
    UINT            Release( void );
                    
                    
    bool            Init( int nPorts );
    bool            Init( CRtspProtocol * pClientProt, CRtspProtocol * pServerProt,
                         int nChannels, UINT16 clientChannel, UINT16 serverChannel );
                    
    void            SetupTunnel( void );
    bool            IsSetup( void );

    void            SetClientAddr( const CInetAddr& addr );
    void            SetServerAddr( const CInetAddr& addr );

    UINT16          GetClientPort( void );
    void            SetClientPort( UINT16 clientPort );

    UINT16          GetServerPort( void ); 
    void            SetServerPort( UINT16 serverPort ); 

    UINT16          GetProxyToClientPort( void ); 
    UINT16          GetProxyToServerPort( void );

    void            SetProxyToClientPort( UINT16 proxyToClientPort ); 
    void            SetProxyToServerPort( UINT16 proxyToServerPort );

protected:
    bool                m_bSetup;
    UINT                m_refCount;
    bool                m_bInterleaved;

    UINT16              m_clientPort;
    UINT16              m_serverPort;
    UINT16              m_proxyToClientPort;
    UINT16              m_proxyToServerPort;
                        
    CInetAddr           m_addrClient;
    CInetAddr           m_addrServer;

    CProxyTransport     m_clientSideTran;
    CProxyTransport     m_serverSideTran;
};

typedef TDoubleList<CProxyDataTunnel*> CProxyDataTunnelList;

class CRtspProxySession
{
public:
    CRtspProxySession( void );
    ~CRtspProxySession( void );

    const CString&     GetServerSessionID( void ) const;
    const CString&     GetClientSessionID( void ) const;
    const CString&     GetSetupCSeq( void ) const;
    const CString&     GetHost( void ) const;

    void        SetSetupCSeq( CString strSetupCSeq );
    void        SetSessionID( const CString& strSessionID, const CString& strHost, UINT16 sessionIndex );

    void    AddTunnel( CProxyDataTunnel * pTunnel );
    void    ReleaseAllTunnels( void );
    CProxyDataTunnel * FindTunnelByClientPort( UINT16 clientPort );
    CProxyDataTunnel * FindTunnelByProxyPort( UINT16 proxyToServerPort );

protected:
    CString             m_serverSessionID;
    CString             m_clientSessionID;
    CString             m_strHost;
    CString             m_setupCSeq;
    CProxyDataTunnelList   m_listTunnel;
};

typedef TDoubleList<CRtspProxySession*> CRtspProxySessionList;


syntax highlighted by Code2HTML, v. 0.9.1