[email protected] | 09ce892 | 2012-03-03 08:29:47 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
3 | // found in the LICENSE file. | ||||
4 | |||||
5 | #include "remoting/protocol/message_decoder.h" | ||||
6 | |||||
avi | 5a080f01 | 2015-12-22 23:15:43 | [diff] [blame] | 7 | #include <stdint.h> |
8 | |||||
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 9 | #include "base/logging.h" |
10 | #include "net/base/io_buffer.h" | ||||
[email protected] | b3c0340 | 2010-11-16 01:27:46 | [diff] [blame] | 11 | #include "remoting/base/compound_buffer.h" |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 12 | #include "remoting/proto/internal.pb.h" |
Henrik Kjellander | 5f427823 | 2017-06-30 09:24:47 | [diff] [blame] | 13 | #include "third_party/webrtc/rtc_base/byteorder.h" |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 14 | |
15 | namespace remoting { | ||||
[email protected] | 2c22968 | 2010-12-02 20:23:35 | [diff] [blame] | 16 | namespace protocol { |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 17 | |
18 | MessageDecoder::MessageDecoder() | ||||
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 19 | : next_payload_(0), |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 20 | next_payload_known_(false) { |
21 | } | ||||
22 | |||||
Chris Watkins | 6fe52aa | 2017-11-28 03:24:05 | [diff] [blame] | 23 | MessageDecoder::~MessageDecoder() = default; |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 24 | |
[email protected] | 051916e6 | 2011-01-14 21:58:01 | [diff] [blame] | 25 | void MessageDecoder::AddData(scoped_refptr<net::IOBuffer> data, |
26 | int data_size) { | ||||
[email protected] | f9d8a77 | 2013-06-01 04:33:17 | [diff] [blame] | 27 | buffer_.Append(data.get(), data_size); |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 28 | } |
29 | |||||
[email protected] | 6852d7d | 2011-01-22 02:34:56 | [diff] [blame] | 30 | CompoundBuffer* MessageDecoder::GetNextMessage() { |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 31 | // Determine the payload size. If we already know it then skip this part. |
32 | // We may not have enough data to determine the payload size so use a | ||||
33 | // utility function to find out. | ||||
34 | int next_payload = -1; | ||||
35 | if (!next_payload_known_ && GetPayloadSize(&next_payload)) { | ||||
36 | DCHECK_NE(-1, next_payload); | ||||
37 | next_payload_ = next_payload; | ||||
38 | next_payload_known_ = true; | ||||
39 | } | ||||
40 | |||||
41 | // If the next payload size is still not known or we don't have enough | ||||
42 | // data for parsing then exit. | ||||
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 43 | if (!next_payload_known_ || buffer_.total_bytes() < next_payload_) |
sergeyu | c5f104b | 2015-01-09 19:33:24 | [diff] [blame] | 44 | return nullptr; |
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 45 | |
[email protected] | 6852d7d | 2011-01-22 02:34:56 | [diff] [blame] | 46 | CompoundBuffer* message_buffer = new CompoundBuffer(); |
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 47 | message_buffer->CopyFrom(buffer_, 0, next_payload_); |
48 | message_buffer->Lock(); | ||||
49 | buffer_.CropFront(next_payload_); | ||||
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 50 | next_payload_known_ = false; |
51 | |||||
[email protected] | 6852d7d | 2011-01-22 02:34:56 | [diff] [blame] | 52 | return message_buffer; |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 53 | } |
54 | |||||
55 | bool MessageDecoder::GetPayloadSize(int* size) { | ||||
56 | // The header has a size of 4 bytes. | ||||
avi | 5a080f01 | 2015-12-22 23:15:43 | [diff] [blame] | 57 | const int kHeaderSize = sizeof(int32_t); |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 58 | |
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 59 | if (buffer_.total_bytes() < kHeaderSize) |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 60 | return false; |
61 | |||||
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 62 | CompoundBuffer header_buffer; |
63 | char header[kHeaderSize]; | ||||
64 | header_buffer.CopyFrom(buffer_, 0, kHeaderSize); | ||||
65 | header_buffer.CopyTo(header, kHeaderSize); | ||||
[email protected] | e758d4c | 2014-08-06 16:48:16 | [diff] [blame] | 66 | *size = rtc::GetBE32(header); |
[email protected] | e609bb9 | 2010-11-18 01:54:55 | [diff] [blame] | 67 | buffer_.CropFront(kHeaderSize); |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 68 | return true; |
69 | } | ||||
70 | |||||
[email protected] | 2c22968 | 2010-12-02 20:23:35 | [diff] [blame] | 71 | } // namespace protocol |
[email protected] | 4d10ede | 2010-10-28 18:43:37 | [diff] [blame] | 72 | } // namespace remoting |