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