| Index: remoting/host/setup/native_messaging_reader.cc
|
| diff --git a/remoting/host/setup/native_messaging_reader.cc b/remoting/host/setup/native_messaging_reader.cc
|
| deleted file mode 100644
|
| index 71516533f1b033bcac708cda0948dcb44d187fc9..0000000000000000000000000000000000000000
|
| --- a/remoting/host/setup/native_messaging_reader.cc
|
| +++ /dev/null
|
| @@ -1,167 +0,0 @@
|
| -// Copyright 2013 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/host/setup/native_messaging_reader.h"
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/json/json_reader.h"
|
| -#include "base/location.h"
|
| -#include "base/sequenced_task_runner.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/thread_task_runner_handle.h"
|
| -#include "base/threading/sequenced_worker_pool.h"
|
| -#include "base/values.h"
|
| -#include "net/base/file_stream.h"
|
| -
|
| -namespace {
|
| -
|
| -// uint32 is specified in the protocol as the type for the message header.
|
| -typedef uint32 MessageLengthType;
|
| -
|
| -const int kMessageHeaderSize = sizeof(MessageLengthType);
|
| -
|
| -// Limit the size of received messages, to avoid excessive memory-allocation in
|
| -// this process, and potential overflow issues when casting to a signed 32-bit
|
| -// int.
|
| -const MessageLengthType kMaximumMessageSize = 1024 * 1024;
|
| -
|
| -} // namespace
|
| -
|
| -namespace remoting {
|
| -
|
| -class NativeMessagingReader::Core {
|
| - public:
|
| - Core(base::PlatformFile handle,
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
|
| - scoped_refptr<base::SequencedTaskRunner> read_task_runner,
|
| - base::WeakPtr<NativeMessagingReader> reader_);
|
| - ~Core();
|
| -
|
| - // Reads a message from the Native Messaging client and passes it to
|
| - // |message_callback_| on the originating thread. Called on the reader thread.
|
| - void ReadMessage();
|
| -
|
| - private:
|
| - // Notify the reader's EOF callback when an error occurs or EOF is reached.
|
| - void NotifyEof();
|
| -
|
| - net::FileStream read_stream_;
|
| -
|
| - base::WeakPtr<NativeMessagingReader> reader_;
|
| -
|
| - // Used to post the caller-supplied reader callbacks on the caller thread.
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_;
|
| -
|
| - // Used to DCHECK that the reader code executes on the correct thread.
|
| - scoped_refptr<base::SequencedTaskRunner> read_task_runner_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Core);
|
| -};
|
| -
|
| -NativeMessagingReader::Core::Core(
|
| - base::PlatformFile handle,
|
| - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner,
|
| - scoped_refptr<base::SequencedTaskRunner> read_task_runner,
|
| - base::WeakPtr<NativeMessagingReader> reader)
|
| - : read_stream_(handle, base::PLATFORM_FILE_READ, NULL),
|
| - reader_(reader),
|
| - caller_task_runner_(caller_task_runner),
|
| - read_task_runner_(read_task_runner) {
|
| -}
|
| -
|
| -NativeMessagingReader::Core::~Core() {}
|
| -
|
| -void NativeMessagingReader::Core::ReadMessage() {
|
| - DCHECK(read_task_runner_->RunsTasksOnCurrentThread());
|
| -
|
| - // Keep reading messages until the stream is closed or an error occurs.
|
| - while (true) {
|
| - MessageLengthType message_length;
|
| - int read_result = read_stream_.ReadUntilComplete(
|
| - reinterpret_cast<char*>(&message_length), kMessageHeaderSize);
|
| - if (read_result != kMessageHeaderSize) {
|
| - // 0 means EOF which is normal and should not be logged as an error.
|
| - if (read_result != 0) {
|
| - LOG(ERROR) << "Failed to read message header, read returned "
|
| - << read_result;
|
| - }
|
| - NotifyEof();
|
| - return;
|
| - }
|
| -
|
| - if (message_length > kMaximumMessageSize) {
|
| - LOG(ERROR) << "Message size too large: " << message_length;
|
| - NotifyEof();
|
| - return;
|
| - }
|
| -
|
| - std::string message_json(message_length, '\0');
|
| - read_result = read_stream_.ReadUntilComplete(string_as_array(&message_json),
|
| - message_length);
|
| - if (read_result != static_cast<int>(message_length)) {
|
| - LOG(ERROR) << "Failed to read message body, read returned "
|
| - << read_result;
|
| - NotifyEof();
|
| - return;
|
| - }
|
| -
|
| - scoped_ptr<base::Value> message(base::JSONReader::Read(message_json));
|
| - if (!message) {
|
| - LOG(ERROR) << "Failed to parse JSON message: " << message;
|
| - NotifyEof();
|
| - return;
|
| - }
|
| -
|
| - // Notify callback of new message.
|
| - caller_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&NativeMessagingReader::InvokeMessageCallback,
|
| - reader_, base::Passed(&message)));
|
| - }
|
| -}
|
| -
|
| -void NativeMessagingReader::Core::NotifyEof() {
|
| - DCHECK(read_task_runner_->RunsTasksOnCurrentThread());
|
| - caller_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&NativeMessagingReader::InvokeEofCallback, reader_));
|
| -}
|
| -
|
| -NativeMessagingReader::NativeMessagingReader(base::PlatformFile handle)
|
| - : reader_thread_("Reader"),
|
| - weak_factory_(this) {
|
| - reader_thread_.Start();
|
| - read_task_runner_ = reader_thread_.message_loop_proxy();
|
| - core_.reset(new Core(handle, base::ThreadTaskRunnerHandle::Get(),
|
| - read_task_runner_, weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -NativeMessagingReader::~NativeMessagingReader() {
|
| - read_task_runner_->DeleteSoon(FROM_HERE, core_.release());
|
| -}
|
| -
|
| -void NativeMessagingReader::Start(MessageCallback message_callback,
|
| - base::Closure eof_callback) {
|
| - message_callback_ = message_callback;
|
| - eof_callback_ = eof_callback;
|
| -
|
| - // base::Unretained is safe since |core_| is only deleted via the
|
| - // DeleteSoon task which is posted from this class's dtor.
|
| - read_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&NativeMessagingReader::Core::ReadMessage,
|
| - base::Unretained(core_.get())));
|
| -}
|
| -
|
| -void NativeMessagingReader::InvokeMessageCallback(
|
| - scoped_ptr<base::Value> message) {
|
| - message_callback_.Run(message.Pass());
|
| -}
|
| -
|
| -void NativeMessagingReader::InvokeEofCallback() {
|
| - eof_callback_.Run();
|
| -}
|
| -
|
| -} // namespace remoting
|
|
|