Index: remoting/protocol/messages_decoder.cc |
diff --git a/remoting/protocol/messages_decoder.cc b/remoting/protocol/messages_decoder.cc |
deleted file mode 100644 |
index 73e9ea4dd7d2b9ec72418bae983432f124d4d779..0000000000000000000000000000000000000000 |
--- a/remoting/protocol/messages_decoder.cc |
+++ /dev/null |
@@ -1,154 +0,0 @@ |
-// Copyright (c) 2010 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. |
- |
-#include "remoting/protocol/messages_decoder.h" |
- |
-#include "base/logging.h" |
-#include "net/base/io_buffer.h" |
-#include "remoting/base/multiple_array_input_stream.h" |
-#include "talk/base/byteorder.h" |
- |
-namespace remoting { |
- |
-MessagesDecoder::MessagesDecoder() |
- : last_read_position_(0), |
- available_bytes_(0), |
- next_payload_(0), |
- next_payload_known_(false) { |
-} |
- |
-MessagesDecoder::~MessagesDecoder() {} |
- |
-void MessagesDecoder::ParseClientMessages(scoped_refptr<net::IOBuffer> data, |
- int data_size, |
- ClientMessageList* messages) { |
- ParseMessages<ChromotingClientMessage>(data, data_size, messages); |
-} |
- |
-void MessagesDecoder::ParseHostMessages(scoped_refptr<net::IOBuffer> data, |
- int data_size, |
- HostMessageList* messages) { |
- ParseMessages<ChromotingHostMessage>(data, data_size, messages); |
-} |
- |
-MessagesDecoder::DataChunk::DataChunk(net::IOBuffer* data, size_t data_size) |
- : data(data), |
- data_size(data_size) { |
-} |
- |
-MessagesDecoder::DataChunk::~DataChunk() {} |
- |
-template <typename T> |
-void MessagesDecoder::ParseMessages(scoped_refptr<net::IOBuffer> data, |
- int data_size, |
- std::list<T*>* messages) { |
- // If this is the first data in the processing queue, then set the |
- // last read position to 0. |
- if (data_list_.empty()) |
- last_read_position_ = 0; |
- |
- // First enqueue the data received. |
- data_list_.push_back(DataChunk(data, data_size)); |
- available_bytes_ += data_size; |
- |
- // Then try to parse one message until we can't parse anymore. |
- T* message; |
- while (ParseOneMessage<T>(&message)) { |
- messages->push_back(message); |
- } |
-} |
- |
-template <typename T> |
-bool MessagesDecoder::ParseOneMessage(T** message) { |
- // Determine the payload size. If we already know it, then skip this |
- // part. |
- // We have the value set to -1 for checking later. |
- int next_payload = -1; |
- if (!next_payload_known_ && GetPayloadSize(&next_payload)) { |
- DCHECK_NE(-1, next_payload); |
- next_payload_ = next_payload; |
- next_payload_known_ = true; |
- } |
- |
- // If the next payload size is still not known or we don't have enough |
- // data for parsing then exit. |
- if (!next_payload_known_ || available_bytes_ < next_payload_) |
- return false; |
- next_payload_known_ = false; |
- |
- // Create a MultipleArrayInputStream for parsing. |
- MultipleArrayInputStream stream; |
- std::vector<scoped_refptr<net::IOBuffer> > buffers; |
- while (next_payload_ > 0 && !data_list_.empty()) { |
- DataChunk* buffer = &(data_list_.front()); |
- size_t read_bytes = std::min(buffer->data_size - last_read_position_, |
- next_payload_); |
- |
- buffers.push_back(buffer->data); |
- stream.AddBuffer(buffer->data->data() + last_read_position_, read_bytes); |
- |
- // Adjust counters. |
- last_read_position_ += read_bytes; |
- next_payload_ -= read_bytes; |
- available_bytes_ -= read_bytes; |
- |
- // If the front buffer is fully read, remove it from the queue. |
- if (buffer->data_size == last_read_position_) { |
- data_list_.pop_front(); |
- last_read_position_ = 0; |
- } |
- } |
- DCHECK_EQ(0UL, next_payload_); |
- |
- // And finally it is parsing. |
- *message = new T(); |
- bool ret = (*message)->ParseFromZeroCopyStream(&stream); |
- if (!ret) { |
- LOG(ERROR) << "Received invalid message."; |
- delete *message; |
- } |
- return ret; |
-} |
- |
-bool MessagesDecoder::GetPayloadSize(int* size) { |
- // The header has a size of 4 bytes. |
- const size_t kHeaderSize = sizeof(int32); |
- |
- if (available_bytes_ < kHeaderSize) |
- return false; |
- |
- std::string header; |
- while (header.length() < kHeaderSize && !data_list_.empty()) { |
- DataChunk* buffer = &(data_list_.front()); |
- |
- // Find out how many bytes we need and how many bytes are available in this |
- // buffer. |
- int needed_bytes = kHeaderSize - header.length(); |
- int available_bytes = buffer->data_size - last_read_position_; |
- |
- // Then append the required bytes into the header and advance the last |
- // read position. |
- int read_bytes = std::min(needed_bytes, available_bytes); |
- header.append( |
- reinterpret_cast<char*>(buffer->data->data()) + last_read_position_, |
- read_bytes); |
- last_read_position_ += read_bytes; |
- available_bytes_ -= read_bytes; |
- |
- // If the buffer is depleted then remove it from the queue. |
- if (last_read_position_ == buffer->data_size) { |
- last_read_position_ = 0; |
- data_list_.pop_front(); |
- } |
- } |
- |
- if (header.length() == kHeaderSize) { |
- *size = talk_base::GetBE32(header.c_str()); |
- return true; |
- } |
- NOTREACHED() << "Unable to extract payload size"; |
- return false; |
-} |
- |
-} // namespace remoting |