/*
 *  Copyright (c) 2011 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_VOICE_ENGINE_VOE_NETWORK_IMPL_H
#define WEBRTC_VOICE_ENGINE_VOE_NETWORK_IMPL_H

#include "voe_network.h"

#include "ref_count.h"
#include "shared_data.h"


namespace webrtc
{

class VoENetworkImpl: public virtual voe::SharedData,
                      public VoENetwork,
                      public voe::RefCount
{
public:
    virtual int Release();

    virtual int RegisterExternalTransport(int channel, Transport& transport);

    virtual int DeRegisterExternalTransport(int channel);

    virtual int ReceivedRTPPacket(int channel,
                                  const void* data,
                                  unsigned int length);

    virtual int ReceivedRTCPPacket(int channel,
                                   const void* data,
                                   unsigned int length);

    virtual int GetSourceInfo(int channel,
                              int& rtpPort,
                              int& rtcpPort,
                              char ipAddr[64]);

    virtual int GetLocalIP(char ipAddr[64], bool ipv6 = false);

    virtual int EnableIPv6(int channel);

    virtual bool IPv6IsEnabled(int channel);

    virtual int SetSourceFilter(int channel,
                                int rtpPort,
                                int rtcpPort,
                                const char ipAddr[64] = 0);

    virtual int GetSourceFilter(int channel,
                                int& rtpPort,
                                int& rtcpPort,
                                char ipAddr[64]);

    virtual int SetSendTOS(int channel,
                           int DSCP,
                           int priority = -1,
                           bool useSetSockopt = false);

    virtual int GetSendTOS(int channel,
                           int& DSCP,
                           int& priority,
                           bool& useSetSockopt);

    virtual int SetSendGQoS(int channel,
                            bool enable,
                            int serviceType,
                            int overrideDSCP);

    virtual int GetSendGQoS(int channel,
                            bool& enabled,
                            int& serviceType,
                            int& overrideDSCP);

    virtual int SetPacketTimeoutNotification(int channel,
                                             bool enable,
                                             int timeoutSeconds = 2);

    virtual int GetPacketTimeoutNotification(int channel,
                                             bool& enabled,
                                             int& timeoutSeconds);

    virtual int RegisterDeadOrAliveObserver(int channel,
                                            VoEConnectionObserver& observer);

    virtual int DeRegisterDeadOrAliveObserver(int channel);

    virtual int SetPeriodicDeadOrAliveStatus(int channel,
                                             bool enable,
                                             int sampleTimeSeconds = 2);

    virtual int GetPeriodicDeadOrAliveStatus(int channel,
                                             bool& enabled,
                                             int& sampleTimeSeconds);

    virtual int SendUDPPacket(int channel,
                              const void* data,
                              unsigned int length,
                              int& transmittedBytes,
                              bool useRtcpSocket = false);

protected:
    VoENetworkImpl();
    virtual ~VoENetworkImpl();
};

} // namespace webrtc

#endif  // WEBRTC_VOICE_ENGINE_VOE_NETWORK_IMPL_H
