/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
#define WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_

#include "webrtc/test/channel_transport/udp_socket_wrapper.h"
#include "webrtc/test/channel_transport/udp_transport.h"

namespace webrtc {

class CriticalSectionWrapper;
class RWLockWrapper;

namespace test {

class UdpSocketManager;

class UdpTransportImpl : public UdpTransport
{
public:
    // A factory that returns a wrapped UDP socket or equivalent.
    class SocketFactoryInterface {
    public:
        virtual ~SocketFactoryInterface() {}
        virtual UdpSocketWrapper* CreateSocket(const int32_t id,
                                               UdpSocketManager* mgr,
                                               CallbackObj obj,
                                               IncomingSocketCallback cb,
                                               bool ipV6Enable,
                                               bool disableGQOS) = 0;
    };

    // Constructor, only called by UdpTransport::Create and tests.
    // The constructor takes ownership of the "maker".
    // The constructor does not take ownership of socket_manager.
    UdpTransportImpl(const int32_t id,
                     SocketFactoryInterface* maker,
                     UdpSocketManager* socket_manager);
    virtual ~UdpTransportImpl();

    // UdpTransport functions
    int32_t InitializeSendSockets(const char* ipAddr,
                                  const uint16_t rtpPort,
                                  const uint16_t rtcpPort = 0) override;
    int32_t InitializeReceiveSockets(UdpTransportData* const packetCallback,
                                     const uint16_t rtpPort,
                                     const char* ipAddr = NULL,
                                     const char* multicastIpAddr = NULL,
                                     const uint16_t rtcpPort = 0) override;
    int32_t InitializeSourcePorts(const uint16_t rtpPort,
                                  const uint16_t rtcpPort = 0) override;
    int32_t SourcePorts(uint16_t& rtpPort, uint16_t& rtcpPort) const override;
    int32_t ReceiveSocketInformation(
        char ipAddr[kIpAddressVersion6Length],
        uint16_t& rtpPort,
        uint16_t& rtcpPort,
        char multicastIpAddr[kIpAddressVersion6Length]) const override;
    int32_t SendSocketInformation(char ipAddr[kIpAddressVersion6Length],
                                  uint16_t& rtpPort,
                                  uint16_t& rtcpPort) const override;
    int32_t RemoteSocketInformation(char ipAddr[kIpAddressVersion6Length],
                                    uint16_t& rtpPort,
                                    uint16_t& rtcpPort) const override;
    int32_t SetQoS(const bool QoS,
                   const int32_t serviceType,
                   const uint32_t maxBitrate = 0,
                   const int32_t overrideDSCP = 0,
                   const bool audio = false) override;
    int32_t QoS(bool& QoS,
                int32_t& serviceType,
                int32_t& overrideDSCP) const override;
    int32_t SetToS(const int32_t DSCP,
                   const bool useSetSockOpt = false) override;
    int32_t ToS(int32_t& DSCP, bool& useSetSockOpt) const override;
    int32_t SetPCP(const int32_t PCP) override;
    int32_t PCP(int32_t& PCP) const override;
    int32_t EnableIpV6() override;
    bool IpV6Enabled() const override;
    int32_t SetFilterIP(
        const char filterIPAddress[kIpAddressVersion6Length]) override;
    int32_t FilterIP(
        char filterIPAddress[kIpAddressVersion6Length]) const override;
    int32_t SetFilterPorts(const uint16_t rtpFilterPort,
                           const uint16_t rtcpFilterPort) override;
    int32_t FilterPorts(uint16_t& rtpFilterPort,
                        uint16_t& rtcpFilterPort) const override;
    int32_t StartReceiving(const uint32_t numberOfSocketBuffers) override;
    int32_t StopReceiving() override;
    bool Receiving() const override;
    bool SendSocketsInitialized() const override;
    bool SourcePortsInitialized() const override;
    bool ReceiveSocketsInitialized() const override;
    int32_t SendRaw(const int8_t* data,
                    size_t length,
                    int32_t isRTCP,
                    uint16_t portnr = 0,
                    const char* ip = NULL) override;
    int32_t SendRTPPacketTo(const int8_t* data,
                            size_t length,
                            const SocketAddress& to) override;
    int32_t SendRTCPPacketTo(const int8_t* data,
                             size_t length,
                             const SocketAddress& to) override;
    int32_t SendRTPPacketTo(const int8_t* data,
                            size_t length,
                            uint16_t rtpPort) override;
    int32_t SendRTCPPacketTo(const int8_t* data,
                             size_t length,
                             uint16_t rtcpPort) override;
    // Transport functions
    bool SendRtp(const uint8_t* data,
                 size_t length,
                 const PacketOptions& packet_options) override;
    bool SendRtcp(const uint8_t* data, size_t length) override;

    // UdpTransport functions continue.
    int32_t SetSendIP(const char* ipaddr) override;
    int32_t SetSendPorts(const uint16_t rtpPort,
                         const uint16_t rtcpPort = 0) override;

    ErrorCode LastError() const override;

    int32_t IPAddressCached(const SocketAddress& address,
                            char* ip,
                            uint32_t& ipSize,
                            uint16_t& sourcePort) override;

    int32_t Id() const {return _id;}
protected:
    // IncomingSocketCallback signature functions for receiving callbacks from
    // UdpSocketWrapper.
    static void IncomingRTPCallback(CallbackObj obj,
                                    const int8_t* rtpPacket,
                                    size_t rtpPacketLength,
                                    const SocketAddress* from);
    static void IncomingRTCPCallback(CallbackObj obj,
                                     const int8_t* rtcpPacket,
                                     size_t rtcpPacketLength,
                                     const SocketAddress* from);

    void CloseSendSockets();
    void CloseReceiveSockets();

    // Update _remoteRTPAddr according to _destPort and _destIP
    void BuildRemoteRTPAddr();
    // Update _remoteRTCPAddr according to _destPortRTCP and _destIP
    void BuildRemoteRTCPAddr();

    void BuildSockaddrIn(uint16_t portnr, const char* ip,
                         SocketAddress& remoteAddr) const;

    ErrorCode BindLocalRTPSocket();
    ErrorCode BindLocalRTCPSocket();

    ErrorCode BindRTPSendSocket();
    ErrorCode BindRTCPSendSocket();

    void IncomingRTPFunction(const int8_t* rtpPacket,
                             size_t rtpPacketLength,
                             const SocketAddress* from);
    void IncomingRTCPFunction(const int8_t* rtcpPacket,
                              size_t rtcpPacketLength,
                              const SocketAddress* from);

    bool FilterIPAddress(const SocketAddress* fromAddress);

    bool SetSockOptUsed();

    int32_t EnableQoS(int32_t serviceType, bool audio,
                      uint32_t maxBitrate, int32_t overrideDSCP);

    int32_t DisableQoS();

private:
    void GetCachedAddress(char* ip, uint32_t& ipSize,
                          uint16_t& sourcePort);

    int32_t _id;
    SocketFactoryInterface* _socket_creator;
    // Protects the sockets from being re-configured while receiving packets.
    CriticalSectionWrapper* _crit;
    CriticalSectionWrapper* _critFilter;
    // _packetCallback's critical section.
    CriticalSectionWrapper* _critPacketCallback;
    UdpSocketManager* _mgr;
    ErrorCode _lastError;

    // Remote RTP and RTCP ports.
    uint16_t _destPort;
    uint16_t _destPortRTCP;

    // Local RTP and RTCP ports.
    uint16_t _localPort;
    uint16_t _localPortRTCP;

    // Local port number when the local port for receiving and local port number
    // for sending are not the same.
    uint16_t _srcPort;
    uint16_t _srcPortRTCP;

    // Remote port from which last received packet was sent.
    uint16_t _fromPort;
    uint16_t _fromPortRTCP;

    char _fromIP[kIpAddressVersion6Length];
    char _destIP[kIpAddressVersion6Length];
    char _localIP[kIpAddressVersion6Length];
    char _localMulticastIP[kIpAddressVersion6Length];

    UdpSocketWrapper* _ptrRtpSocket;
    UdpSocketWrapper* _ptrRtcpSocket;

    // Local port when the local port for receiving and local port for sending
    // are not the same.
    UdpSocketWrapper* _ptrSendRtpSocket;
    UdpSocketWrapper* _ptrSendRtcpSocket;

    SocketAddress _remoteRTPAddr;
    SocketAddress _remoteRTCPAddr;

    SocketAddress _localRTPAddr;
    SocketAddress _localRTCPAddr;

    int32_t _tos;
    bool _receiving;
    bool _useSetSockOpt;
    bool _qos;
    int32_t _pcp;
    bool _ipV6Enabled;
    int32_t _serviceType;
    int32_t _overrideDSCP;
    uint32_t _maxBitrate;

    // Cache used by GetCachedAddress(..).
    RWLockWrapper* _cachLock;
    SocketAddress _previousAddress;
    char _previousIP[kIpAddressVersion6Length];
    uint32_t _previousIPSize;
    uint16_t _previousSourcePort;

    SocketAddress _filterIPAddress;
    uint16_t _rtpFilterPort;
    uint16_t _rtcpFilterPort;

    UdpTransportData* _packetCallback;
};

}  // namespace test
}  // namespace webrtc

#endif  // WEBRTC_TEST_CHANNEL_TRANSPORT_UDP_TRANSPORT_IMPL_H_
