/*
 *  Copyright (c) 2013 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.
 */

#include "webrtc/call/transport_adapter.h"

#include "webrtc/base/checks.h"

namespace webrtc {
namespace internal {

TransportAdapter::TransportAdapter(newapi::Transport* transport)
    : transport_(transport), enabled_(0) {
  RTC_DCHECK(nullptr != transport);
}

int TransportAdapter::SendPacket(const void* packet, size_t length) {
  if (enabled_.Value() == 0)
    return false;

  bool success = transport_->SendRtp(static_cast<const uint8_t*>(packet),
                                     length);
  return success ? static_cast<int>(length) : -1;
}

int TransportAdapter::SendRTCPPacket(const void* packet, size_t length) {
  if (enabled_.Value() == 0)
    return false;

  bool success = transport_->SendRtcp(static_cast<const uint8_t*>(packet),
                                      length);
  return success ? static_cast<int>(length) : -1;
}

void TransportAdapter::Enable() {
  // If this exchange fails it means enabled_ was already true, no need to
  // check result and iterate.
  enabled_.CompareExchange(1, 0);
}

void TransportAdapter::Disable() { enabled_.CompareExchange(0, 1); }

}  // namespace internal
}  // namespace webrtc
