| // Copyright (c) 2012 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_PROTOCOL_MESSAGE_READER_H_ |
| #define REMOTING_PROTOCOL_MESSAGE_READER_H_ |
| |
| #include <memory> |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/sequence_checker.h" |
| #include "remoting/base/compound_buffer.h" |
| #include "remoting/protocol/message_decoder.h" |
| |
| namespace net { |
| class IOBuffer; |
| } // namespace net |
| |
| namespace remoting { |
| namespace protocol { |
| |
| class P2PStreamSocket; |
| |
| // MessageReader reads data from the socket asynchronously and calls |
| // callback for each message it receives. It stops calling the |
| // callback as soon as the socket is closed, so the socket should |
| // always be closed before the callback handler is destroyed. |
| // |
| // In order to throttle the stream, MessageReader doesn't try to read |
| // new data from the socket until all previously received messages are |
| // processed by the receiver (|done_task| is called for each message). |
| // It is still possible that the MessageReceivedCallback is called |
| // twice (so that there is more than one outstanding message), |
| // e.g. when we the sender sends multiple messages in one TCP packet. |
| class MessageReader { |
| public: |
| typedef base::Callback<void(std::unique_ptr<CompoundBuffer> message)> |
| MessageReceivedCallback; |
| typedef base::Callback<void(int)> ReadFailedCallback; |
| |
| MessageReader(); |
| virtual ~MessageReader(); |
| |
| // Starts reading from |socket|. |
| void StartReading(P2PStreamSocket* socket, |
| const MessageReceivedCallback& message_received_callback, |
| const ReadFailedCallback& read_failed_callback); |
| |
| private: |
| void DoRead(); |
| void OnRead(int result); |
| void HandleReadResult(int result, bool* read_succeeded); |
| void OnDataReceived(net::IOBuffer* data, int data_size); |
| void RunCallback(std::unique_ptr<CompoundBuffer> message); |
| |
| ReadFailedCallback read_failed_callback_; |
| |
| P2PStreamSocket* socket_ = nullptr; |
| |
| // Set to true, when we have a socket read pending, and expecting |
| // OnRead() to be called when new data is received. |
| bool read_pending_ = false; |
| |
| bool closed_ = false; |
| scoped_refptr<net::IOBuffer> read_buffer_; |
| |
| MessageDecoder message_decoder_; |
| |
| // Callback is called when a message is received. |
| MessageReceivedCallback message_received_callback_; |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| |
| base::WeakPtrFactory<MessageReader> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MessageReader); |
| }; |
| |
| } // namespace protocol |
| } // namespace remoting |
| |
| #endif // REMOTING_PROTOCOL_MESSAGE_READER_H_ |