// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_
#define QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_

#include "quiche/quic/core/quic_stream.h"
#include "quiche/quic/platform/api/quic_logging.h"
#include "quiche/quic/qbone/qbone_control.pb.h"

namespace quic {

class QboneSessionBase;

class QUIC_EXPORT_PRIVATE QboneControlStreamBase : public QuicStream {
 public:
  explicit QboneControlStreamBase(QuicSession* session);
  QboneControlStreamBase(quic::PendingStream* pending, QuicSession* session);

  void OnDataAvailable() override;

  void OnStreamReset(const QuicRstStreamFrame& frame) override;

 protected:
  virtual void OnMessage(const std::string& data) = 0;
  bool SendMessage(const proto2::Message& proto);

 private:
  uint16_t pending_message_size_;
  std::string buffer_;
};

template <class T>
class QUIC_EXPORT_PRIVATE QboneControlHandler {
 public:
  virtual ~QboneControlHandler() {}

  virtual void OnControlRequest(const T& request) = 0;
  virtual void OnControlError() = 0;
};

template <class Incoming, class Outgoing>
class QUIC_EXPORT_PRIVATE QboneControlStream : public QboneControlStreamBase {
 public:
  using Handler = QboneControlHandler<Incoming>;

  QboneControlStream(QuicSession* session, Handler* handler)
      : QboneControlStreamBase(session), handler_(handler) {}
  QboneControlStream(quic::PendingStream* pending, QuicSession* session,
                     Handler* handler)
      : QboneControlStreamBase(pending, session), handler_(handler) {}

  bool SendRequest(const Outgoing& request) { return SendMessage(request); }

 protected:
  void OnMessage(const std::string& data) override {
    Incoming request;
    if (!request.ParseFromString(data)) {
      QUIC_LOG(ERROR) << "Failed to parse incoming request";
      if (handler_ != nullptr) {
        handler_->OnControlError();
      }
      return;
    }
    if (handler_ != nullptr) {
      handler_->OnControlRequest(request);
    }
  }

 private:
  Handler* handler_;
};

using QboneServerControlStream =
    QboneControlStream<QboneServerRequest, QboneClientRequest>;
using QboneClientControlStream =
    QboneControlStream<QboneClientRequest, QboneServerRequest>;

}  // namespace quic

#endif  // QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_
