Client.cpp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * Copyright (c) 2020, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Client.h"
  7. #include <LibCore/EventLoop.h>
  8. #include <LibCore/Socket.h>
  9. Client::Client(int id, NonnullOwnPtr<Core::TCPSocket> socket)
  10. : m_id(id)
  11. , m_socket(move(socket))
  12. {
  13. m_socket->on_ready_to_read = [this] {
  14. if (m_socket->is_eof())
  15. return;
  16. auto result = drain_socket();
  17. if (result.is_error()) {
  18. dbgln("Failed while trying to drain the socket: {}", result.error());
  19. Core::deferred_invoke([this, strong_this = NonnullRefPtr(*this)] { quit(); });
  20. }
  21. };
  22. }
  23. ErrorOr<void> Client::drain_socket()
  24. {
  25. NonnullRefPtr<Client> protect(*this);
  26. auto buffer = TRY(ByteBuffer::create_uninitialized(1024));
  27. while (TRY(m_socket->can_read_without_blocking())) {
  28. auto bytes_read = TRY(m_socket->read_some(buffer));
  29. dbgln("Read {} bytes.", bytes_read.size());
  30. if (m_socket->is_eof()) {
  31. Core::deferred_invoke([this, strong_this = NonnullRefPtr(*this)] { quit(); });
  32. break;
  33. }
  34. TRY(m_socket->write_until_depleted(bytes_read));
  35. }
  36. return {};
  37. }
  38. void Client::quit()
  39. {
  40. m_socket->close();
  41. if (on_exit)
  42. on_exit();
  43. }