/*
 *  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.
 */

#ifndef WEBRTC_P2P_QUIC_QUICCONNECTIONHELPER_H_
#define WEBRTC_P2P_QUIC_QUICCONNECTIONHELPER_H_

#include "net/quic/crypto/quic_random.h"
#include "net/quic/quic_alarm.h"
#include "net/quic/quic_clock.h"
#include "net/quic/quic_connection.h"
#include "net/quic/quic_simple_buffer_allocator.h"
#include "webrtc/rtc_base/thread.h"

namespace cricket {

// An alarm which will go off at a scheduled time, and execute the |OnAlarm|
// method of the delegate.
class QuicAlarm : public net::QuicAlarm, public rtc::MessageHandler {
 public:
  QuicAlarm(const net::QuicClock* clock,
            rtc::Thread* thread,
            net::QuicArenaScopedPtr<net::QuicAlarm::Delegate> delegate);

  ~QuicAlarm() override;

  // rtc::MessageHandler override.
  void OnMessage(rtc::Message* msg) override;

  // Helper method to get the delay in ms for posting task.
  int64_t GetDelay() const;

 protected:
  // net::QuicAlarm overrides.
  void SetImpl() override;
  void CancelImpl() override;

 private:
  const net::QuicClock* clock_;
  rtc::Thread* thread_;
};

// Helper methods for QuicConnection timing and random number generation.
class QuicConnectionHelper : public net::QuicConnectionHelperInterface {
 public:
  explicit QuicConnectionHelper(rtc::Thread* thread);
  ~QuicConnectionHelper() override;

  // QuicConnectionHelperInterface overrides.
  const net::QuicClock* GetClock() const override;
  net::QuicRandom* GetRandomGenerator() override;
  QuicAlarm* CreateAlarm(net::QuicAlarm::Delegate* delegate) override;
  net::QuicArenaScopedPtr<net::QuicAlarm> CreateAlarm(
      net::QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
      net::QuicConnectionArena* arena) override;
  net::QuicBufferAllocator* GetBufferAllocator() override;

 private:
  net::QuicClock clock_;
  net::SimpleBufferAllocator buffer_allocator_;
  rtc::Thread* thread_;
};

}  // namespace cricket

#endif  // WEBRTC_P2P_QUIC_QUICCONNECTIONHELPER_H_
