| // Copyright 2020 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 REMOTING_BASE_PROTOBUF_HTTP_STREAM_PARSER_H_ |
| #define REMOTING_BASE_PROTOBUF_HTTP_STREAM_PARSER_H_ |
| |
| #include "base/callback.h" |
| #include "base/memory/scoped_refptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/strings/string_piece_forward.h" |
| |
| namespace google { |
| namespace protobuf { |
| namespace io { |
| class CodedInputStream; |
| } // namespace io |
| } // namespace protobuf |
| } // namespace google |
| |
| namespace net { |
| class GrowableIOBuffer; |
| } // namespace net |
| |
| namespace remoting { |
| |
| class ProtobufHttpStatus; |
| |
| // Class to parse incoming stream data wrapped with a StreamBody protobuf |
| // message. |
| class ProtobufHttpStreamParser final { |
| public: |
| using MessageCallback = base::RepeatingCallback<void(const std::string&)>; |
| using StreamClosedCallback = |
| base::OnceCallback<void(const ProtobufHttpStatus&)>; |
| |
| ProtobufHttpStreamParser(const MessageCallback& message_callback, |
| StreamClosedCallback stream_closed_callback); |
| ~ProtobufHttpStreamParser(); |
| |
| ProtobufHttpStreamParser(const ProtobufHttpStreamParser&) = delete; |
| ProtobufHttpStreamParser& operator=(const ProtobufHttpStreamParser&) = delete; |
| |
| // Appends the stream data (which should be the partial or full serialized |
| // StreamBody) and runs callbacks if there is something decodable. |
| void Append(base::StringPiece data); |
| |
| // Indicates whether the parser has pending data that needs more input to |
| // complete a StreamBody message. |
| bool HasPendingData() const; |
| |
| private: |
| void ParseStreamIfAvailable(); |
| bool ParseOneField(google::protobuf::io::CodedInputStream* input_stream); |
| |
| MessageCallback message_callback_; |
| StreamClosedCallback stream_closed_callback_; |
| scoped_refptr<net::GrowableIOBuffer> read_buffer_; |
| |
| base::WeakPtrFactory<ProtobufHttpStreamParser> weak_factory_{this}; |
| }; |
| |
| } // namespace remoting |
| |
| #endif // REMOTING_BASE_PROTOBUF_HTTP_STREAM_PARSER_H_ |