blob: 85f8deee0e8a3925108d94131a106aa93c9cddbf [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
22 protected:
23 virtual void OnMessage(const string& data) = 0;
24 bool SendMessage(const proto2::Message& proto);
25
26 private:
27 uint16_t pending_message_size_;
28 string buffer_;
29};
30
31template <class T>
32class QUIC_EXPORT_PRIVATE QboneControlHandler {
33 public:
34 virtual ~QboneControlHandler() { }
35
36 virtual void OnControlRequest(const T& request) = 0;
37 virtual void OnControlError() = 0;
38};
39
40template <class Incoming, class Outgoing>
41class QUIC_EXPORT_PRIVATE QboneControlStream : public QboneControlStreamBase {
42 public:
43 using Handler = QboneControlHandler<Incoming>;
44
45 QboneControlStream(QuicSession* session, Handler* handler)
46 : QboneControlStreamBase(session), handler_(handler) {}
47
48 bool SendRequest(const Outgoing& request) { return SendMessage(request); }
49
50 protected:
51 void OnMessage(const string& data) override {
52 Incoming request;
53 if (!request.ParseFromString(data)) {
54 QUIC_LOG(ERROR) << "Failed to parse incoming request";
55 if (handler_ != nullptr) {
56 handler_->OnControlError();
57 }
58 return;
59 }
60 if (handler_ != nullptr) {
61 handler_->OnControlRequest(request);
62 }
63 }
64
65 private:
66 Handler* handler_;
67};
68
69using QboneServerControlStream =
70 QboneControlStream<QboneServerRequest, QboneClientRequest>;
71using QboneClientControlStream =
72 QboneControlStream<QboneClientRequest, QboneServerRequest>;
73
74} // namespace quic
75
76#endif // QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_