// 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_DECODER_H_ #define REMOTING_PROTOCOL_MESSAGE_DECODER_H_ #include #include #include "base/memory/ref_counted.h" #include "net/base/io_buffer.h" #include "remoting/base/compound_buffer.h" #if defined(USE_SYSTEM_PROTOBUF) #include #else #include "third_party/protobuf/src/google/protobuf/message_lite.h" #endif namespace remoting { namespace protocol { // MessageDecoder uses CompoundBuffer to split the data received from // the network into separate messages. Each message is expected to be // decoded in the stream as follows: // +--------------+--------------+ // | message_size | message_data | // +--------------+--------------+ // // Here, message_size is 4-byte integer that represents size of // message_data in bytes. message_data - content of the message. class MessageDecoder { public: MessageDecoder(); virtual ~MessageDecoder(); // Add next chunk of data. MessageDecoder retains |data| until all // its bytes are consumed. void AddData(scoped_refptr data, int data_size); // Returns next message from the stream. Ownership of the result is // passed to the caller. Returns nullptr if there are no complete // messages yet, otherwise returns a buffer that contains one // message. CompoundBuffer* GetNextMessage(); private: // Retrieves the read payload size of the current protocol buffer via |size|. // Returns false and leaves |size| unmodified, if we do not have enough data // to retrieve the current size. bool GetPayloadSize(int* size); CompoundBuffer buffer_; // |next_payload_| stores the size of the next payload if known. // |next_payload_known_| is true if the size of the next payload is known. // After one payload is read this is reset to false. int next_payload_; bool next_payload_known_; }; } // namespace protocol } // namespace remoting #endif // REMOTING_PROTOCOL_MESSAGE_DECODER_H_