blob: 10da82cfcf13133005b2cf3e7795438cf92608a1 [file] [log] [blame]
wubf975eac2019-08-19 19:41:01 -07001// Copyright (c) 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_
6#define QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_
7
8#include "net/third_party/quiche/src/quic/core/quic_stream.h"
dmcardlec7679cd2020-01-06 08:34:22 -08009#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
wubf975eac2019-08-19 19:41:01 -070010#include "net/third_party/quiche/src/quic/qbone/qbone_control.pb.h"
11
12namespace quic {
13
14class QboneSessionBase;
15
16class QUIC_EXPORT_PRIVATE QboneControlStreamBase : public QuicStream {
17 public:
18 explicit QboneControlStreamBase(QuicSession* session);
19
20 void OnDataAvailable() override;
21
renjietang546c7142020-03-05 14:12:10 -080022 void OnStreamReset(const QuicRstStreamFrame& frame) override;
23
wubf975eac2019-08-19 19:41:01 -070024 protected:
QUICHE teamb80d7c32020-02-23 23:44:20 -080025 virtual void OnMessage(const std::string& data) = 0;
wubf975eac2019-08-19 19:41:01 -070026 bool SendMessage(const proto2::Message& proto);
27
28 private:
29 uint16_t pending_message_size_;
QUICHE teamb80d7c32020-02-23 23:44:20 -080030 std::string buffer_;
wubf975eac2019-08-19 19:41:01 -070031};
32
33template <class T>
34class QUIC_EXPORT_PRIVATE QboneControlHandler {
35 public:
36 virtual ~QboneControlHandler() { }
37
38 virtual void OnControlRequest(const T& request) = 0;
39 virtual void OnControlError() = 0;
40};
41
42template <class Incoming, class Outgoing>
43class QUIC_EXPORT_PRIVATE QboneControlStream : public QboneControlStreamBase {
44 public:
45 using Handler = QboneControlHandler<Incoming>;
46
47 QboneControlStream(QuicSession* session, Handler* handler)
48 : QboneControlStreamBase(session), handler_(handler) {}
49
50 bool SendRequest(const Outgoing& request) { return SendMessage(request); }
51
52 protected:
QUICHE teamb80d7c32020-02-23 23:44:20 -080053 void OnMessage(const std::string& data) override {
wubf975eac2019-08-19 19:41:01 -070054 Incoming request;
55 if (!request.ParseFromString(data)) {
56 QUIC_LOG(ERROR) << "Failed to parse incoming request";
57 if (handler_ != nullptr) {
58 handler_->OnControlError();
59 }
60 return;
61 }
62 if (handler_ != nullptr) {
63 handler_->OnControlRequest(request);
64 }
65 }
66
67 private:
68 Handler* handler_;
69};
70
71using QboneServerControlStream =
72 QboneControlStream<QboneServerRequest, QboneClientRequest>;
73using QboneClientControlStream =
74 QboneControlStream<QboneClientRequest, QboneServerRequest>;
75
76} // namespace quic
77
78#endif // QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_