/*
 *  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 P2P_QUIC_QUICCONNECTIONHELPER_H_
#define 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 "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  // P2P_QUIC_QUICCONNECTIONHELPER_H_
