socket_reader.cc 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/base/socket_reader.h"
  5. #include "base/bind.h"
  6. #include "base/compiler_specific.h"
  7. #include "base/location.h"
  8. #include "base/task/single_thread_task_runner.h"
  9. #include "base/threading/thread_task_runner_handle.h"
  10. #include "net/base/io_buffer.h"
  11. #include "net/base/net_errors.h"
  12. #include "net/socket/socket.h"
  13. namespace remoting {
  14. namespace {
  15. int kReadBufferSize = 4096;
  16. } // namespace
  17. SocketReader::SocketReader() : socket_(nullptr) {}
  18. SocketReader::~SocketReader() = default;
  19. void SocketReader::Init(net::Socket* socket,
  20. ReadResultCallback read_result_callback) {
  21. DCHECK(socket);
  22. DCHECK(!socket_);
  23. socket_ = socket;
  24. read_result_callback_ = std::move(read_result_callback);
  25. DoRead();
  26. }
  27. void SocketReader::DoRead() {
  28. while (true) {
  29. read_buffer_ = base::MakeRefCounted<net::IOBuffer>(kReadBufferSize);
  30. int result = socket_->Read(
  31. read_buffer_.get(), kReadBufferSize,
  32. base::BindOnce(&SocketReader::OnRead, weak_factory_.GetWeakPtr()));
  33. HandleReadResult(result);
  34. if (result <= 0)
  35. break;
  36. }
  37. }
  38. void SocketReader::OnRead(int result) {
  39. HandleReadResult(result);
  40. if (result > 0)
  41. DoRead();
  42. }
  43. void SocketReader::HandleReadResult(int result) {
  44. if (result != net::ERR_IO_PENDING) {
  45. if (result < 0)
  46. read_buffer_.reset();
  47. base::ThreadTaskRunnerHandle::Get()->PostTask(
  48. FROM_HERE,
  49. base::BindOnce(&SocketReader::CallCallback, weak_factory_.GetWeakPtr(),
  50. read_buffer_, result));
  51. }
  52. }
  53. void SocketReader::CallCallback(scoped_refptr<net::IOBuffer> data, int result) {
  54. std::move(read_result_callback_).Run(data, result);
  55. }
  56. } // namespace remoting