123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // 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.
- #include "remoting/base/socket_reader.h"
- #include "base/bind.h"
- #include "base/compiler_specific.h"
- #include "base/location.h"
- #include "base/task/single_thread_task_runner.h"
- #include "base/threading/thread_task_runner_handle.h"
- #include "net/base/io_buffer.h"
- #include "net/base/net_errors.h"
- #include "net/socket/socket.h"
- namespace remoting {
- namespace {
- int kReadBufferSize = 4096;
- } // namespace
- SocketReader::SocketReader() : socket_(nullptr) {}
- SocketReader::~SocketReader() = default;
- void SocketReader::Init(net::Socket* socket,
- ReadResultCallback read_result_callback) {
- DCHECK(socket);
- DCHECK(!socket_);
- socket_ = socket;
- read_result_callback_ = std::move(read_result_callback);
- DoRead();
- }
- void SocketReader::DoRead() {
- while (true) {
- read_buffer_ = base::MakeRefCounted<net::IOBuffer>(kReadBufferSize);
- int result = socket_->Read(
- read_buffer_.get(), kReadBufferSize,
- base::BindOnce(&SocketReader::OnRead, weak_factory_.GetWeakPtr()));
- HandleReadResult(result);
- if (result <= 0)
- break;
- }
- }
- void SocketReader::OnRead(int result) {
- HandleReadResult(result);
- if (result > 0)
- DoRead();
- }
- void SocketReader::HandleReadResult(int result) {
- if (result != net::ERR_IO_PENDING) {
- if (result < 0)
- read_buffer_.reset();
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::BindOnce(&SocketReader::CallCallback, weak_factory_.GetWeakPtr(),
- read_buffer_, result));
- }
- }
- void SocketReader::CallCallback(scoped_refptr<net::IOBuffer> data, int result) {
- std::move(read_result_callback_).Run(data, result);
- }
- } // namespace remoting
|