/*
 *  Copyright 2016 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 "p2p/quic/quicconnectionhelper.h"

namespace cricket {

QuicAlarm* QuicConnectionHelper::CreateAlarm(
    net::QuicAlarm::Delegate* delegate) {
  return new QuicAlarm(GetClock(), thread_,
                       net::QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
}

net::QuicArenaScopedPtr<net::QuicAlarm> QuicConnectionHelper::CreateAlarm(
    net::QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
    net::QuicConnectionArena* arena) {
  return net::QuicArenaScopedPtr<QuicAlarm>(
      new QuicAlarm(GetClock(), thread_, std::move(delegate)));
}

QuicAlarm::QuicAlarm(const net::QuicClock* clock,
                     rtc::Thread* thread,
                     net::QuicArenaScopedPtr<net::QuicAlarm::Delegate> delegate)
    : net::QuicAlarm(std::move(delegate)), clock_(clock), thread_(thread) {}

QuicAlarm::~QuicAlarm() {}

void QuicAlarm::OnMessage(rtc::Message* msg) {
  // The alarm may have been cancelled.
  if (!deadline().IsInitialized()) {
    return;
  }

  // The alarm may have been re-set to a later time.
  if (clock_->Now() < deadline()) {
    SetImpl();
    return;
  }

  Fire();
}

int64_t QuicAlarm::GetDelay() const {
  return deadline().Subtract(clock_->Now()).ToMilliseconds();
}

void QuicAlarm::SetImpl() {
  DCHECK(deadline().IsInitialized());
  CancelImpl();  // Unregister if already posted.

  int64_t delay_ms = GetDelay();
  if (delay_ms < 0) {
    delay_ms = 0;
  }
  thread_->PostDelayed(RTC_FROM_HERE, delay_ms, this);
}

void QuicAlarm::CancelImpl() {
  thread_->Clear(this);
}

QuicConnectionHelper::QuicConnectionHelper(rtc::Thread* thread)
    : thread_(thread) {}

QuicConnectionHelper::~QuicConnectionHelper() {}

const net::QuicClock* QuicConnectionHelper::GetClock() const {
  return &clock_;
}

net::QuicRandom* QuicConnectionHelper::GetRandomGenerator() {
  return net::QuicRandom::GetInstance();
}

net::QuicBufferAllocator* QuicConnectionHelper::GetBufferAllocator() {
  return &buffer_allocator_;
}

}  // namespace cricket
