xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/qbone/qbone_control_stream.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // 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 "quiche/quic/core/quic_stream.h"
9 #include "quiche/quic/platform/api/quic_logging.h"
10 #include "quiche/quic/qbone/qbone_control.pb.h"
11 
12 namespace quic {
13 
14 class QboneSessionBase;
15 
16 class QUIC_EXPORT_PRIVATE QboneControlStreamBase : public QuicStream {
17  public:
18   explicit QboneControlStreamBase(QuicSession* session);
19   QboneControlStreamBase(quic::PendingStream* pending, QuicSession* session);
20 
21   void OnDataAvailable() override;
22 
23   void OnStreamReset(const QuicRstStreamFrame& frame) override;
24 
25  protected:
26   virtual void OnMessage(const std::string& data) = 0;
27   bool SendMessage(const proto2::Message& proto);
28 
29  private:
30   uint16_t pending_message_size_;
31   std::string buffer_;
32 };
33 
34 template <class T>
35 class QUIC_EXPORT_PRIVATE QboneControlHandler {
36  public:
~QboneControlHandler()37   virtual ~QboneControlHandler() {}
38 
39   virtual void OnControlRequest(const T& request) = 0;
40   virtual void OnControlError() = 0;
41 };
42 
43 template <class Incoming, class Outgoing>
44 class QUIC_EXPORT_PRIVATE QboneControlStream : public QboneControlStreamBase {
45  public:
46   using Handler = QboneControlHandler<Incoming>;
47 
QboneControlStream(QuicSession * session,Handler * handler)48   QboneControlStream(QuicSession* session, Handler* handler)
49       : QboneControlStreamBase(session), handler_(handler) {}
QboneControlStream(quic::PendingStream * pending,QuicSession * session,Handler * handler)50   QboneControlStream(quic::PendingStream* pending, QuicSession* session,
51                      Handler* handler)
52       : QboneControlStreamBase(pending, session), handler_(handler) {}
53 
SendRequest(const Outgoing & request)54   bool SendRequest(const Outgoing& request) { return SendMessage(request); }
55 
56  protected:
OnMessage(const std::string & data)57   void OnMessage(const std::string& data) override {
58     Incoming request;
59     if (!request.ParseFromString(data)) {
60       QUIC_LOG(ERROR) << "Failed to parse incoming request";
61       if (handler_ != nullptr) {
62         handler_->OnControlError();
63       }
64       return;
65     }
66     if (handler_ != nullptr) {
67       handler_->OnControlRequest(request);
68     }
69   }
70 
71  private:
72   Handler* handler_;
73 };
74 
75 using QboneServerControlStream =
76     QboneControlStream<QboneServerRequest, QboneClientRequest>;
77 using QboneClientControlStream =
78     QboneControlStream<QboneClientRequest, QboneServerRequest>;
79 
80 }  // namespace quic
81 
82 #endif  // QUICHE_QUIC_QBONE_QBONE_CONTROL_STREAM_H_
83