Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: remoting/protocol/message_decoder.cc

Issue 4779001: Added CompoundBuffer that will be used to store data in the encoding/decoding (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged CompoundBuffer with MultipleArrayInputStream Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/protocol/message_decoder.h" 5 #include "remoting/protocol/message_decoder.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "net/base/io_buffer.h" 8 #include "net/base/io_buffer.h"
9 #include "remoting/base/multiple_array_input_stream.h" 9 #include "remoting/base/compound_buffer.h"
10 #include "remoting/proto/internal.pb.h" 10 #include "remoting/proto/internal.pb.h"
11 #include "third_party/libjingle/source/talk/base/byteorder.h" 11 #include "third_party/libjingle/source/talk/base/byteorder.h"
12 12
13 namespace remoting { 13 namespace remoting {
14 14
15 MessageDecoder::MessageDecoder() 15 MessageDecoder::MessageDecoder()
16 : available_bytes_(0), 16 : available_bytes_(0),
17 next_payload_(0), 17 next_payload_(0),
18 next_payload_known_(false) { 18 next_payload_known_(false) {
19 } 19 }
20 20
21 MessageDecoder::~MessageDecoder() {} 21 MessageDecoder::~MessageDecoder() {}
22 22
23 void MessageDecoder::AddBuffer(scoped_refptr<net::IOBuffer> data, 23 void MessageDecoder::AddBuffer(scoped_refptr<net::IOBuffer> data,
24 int data_size) { 24 int data_size) {
25 buffer_list_.push_back(make_scoped_refptr( 25 buffer_list_.push_back(make_scoped_refptr(
26 new net::DrainableIOBuffer(data, data_size))); 26 new net::DrainableIOBuffer(data, data_size)));
27 available_bytes_ += data_size; 27 available_bytes_ += data_size;
28 } 28 }
29 29
30 MultipleArrayInputStream* MessageDecoder::CreateInputStreamFromData() { 30 CompoundBuffer* MessageDecoder::CreateInputStreamFromData() {
31 // Determine the payload size. If we already know it then skip this part. 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 32 // We may not have enough data to determine the payload size so use a
33 // utility function to find out. 33 // utility function to find out.
34 int next_payload = -1; 34 int next_payload = -1;
35 if (!next_payload_known_ && GetPayloadSize(&next_payload)) { 35 if (!next_payload_known_ && GetPayloadSize(&next_payload)) {
36 DCHECK_NE(-1, next_payload); 36 DCHECK_NE(-1, next_payload);
37 next_payload_ = next_payload; 37 next_payload_ = next_payload;
38 next_payload_known_ = true; 38 next_payload_known_ = true;
39 } 39 }
40 40
41 // If the next payload size is still not known or we don't have enough 41 // If the next payload size is still not known or we don't have enough
42 // data for parsing then exit. 42 // data for parsing then exit.
43 if (!next_payload_known_ || available_bytes_ < next_payload_) 43 if (!next_payload_known_ || available_bytes_ < next_payload_)
44 return NULL; 44 return NULL;
45 next_payload_known_ = false; 45 next_payload_known_ = false;
46 46
47 // The following loop gather buffers in |buffer_list_| that sum up to 47 // The following loop gather buffers in |buffer_list_| that sum up to
48 // |next_payload_| bytes. These buffers are added to |stream|. 48 // |next_payload_| bytes. These buffers are added to |stream|.
49 49
50 // Create a MultipleArrayInputStream for parsing. 50 // Create a CompoundBuffer for parsing.
51 // TODO(hclam): Avoid creating this object everytime. 51 // TODO(hclam): Avoid creating this object everytime.
52 MultipleArrayInputStream* stream = new MultipleArrayInputStream(); 52 CompoundBuffer* stream = new CompoundBuffer();
53 while (next_payload_ > 0 && !buffer_list_.empty()) { 53 while (next_payload_ > 0 && !buffer_list_.empty()) {
54 scoped_refptr<net::DrainableIOBuffer> buffer = buffer_list_.front(); 54 scoped_refptr<net::DrainableIOBuffer> buffer = buffer_list_.front();
55 int read_bytes = std::min(buffer->BytesRemaining(), next_payload_); 55 int read_bytes = std::min(buffer->BytesRemaining(), next_payload_);
56 56
57 // This call creates a new instance of DrainableIOBuffer internally.
58 // This will reference the same base pointer but maintain it's own 57 // This will reference the same base pointer but maintain it's own
59 // version of data pointer. 58 // version of data pointer.
60 stream->AddBuffer(buffer, read_bytes); 59 stream->Append(buffer, read_bytes);
61 60
62 // Adjust counters. 61 // Adjust counters.
63 buffer->DidConsume(read_bytes); 62 buffer->DidConsume(read_bytes);
64 next_payload_ -= read_bytes; 63 next_payload_ -= read_bytes;
65 available_bytes_ -= read_bytes; 64 available_bytes_ -= read_bytes;
66 65
67 // If the front buffer is fully read then remove it from the queue. 66 // If the front buffer is fully read then remove it from the queue.
68 if (!buffer->BytesRemaining()) 67 if (!buffer->BytesRemaining())
69 buffer_list_.pop_front(); 68 buffer_list_.pop_front();
70 } 69 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 if (!buffer->BytesRemaining()) { 103 if (!buffer->BytesRemaining()) {
105 buffer_list_.pop_front(); 104 buffer_list_.pop_front();
106 } 105 }
107 } 106 }
108 107
109 *size = talk_base::GetBE32(header.c_str()); 108 *size = talk_base::GetBE32(header.c_str());
110 return true; 109 return true;
111 } 110 }
112 111
113 } // namespace remoting 112 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698