NetworkJob.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/Debug.h>
  8. #include <LibCore/NetworkJob.h>
  9. #include <LibCore/NetworkResponse.h>
  10. namespace Core {
  11. NetworkJob::NetworkJob(Stream& output_stream)
  12. : m_output_stream(output_stream)
  13. {
  14. }
  15. NetworkJob::~NetworkJob() = default;
  16. void NetworkJob::did_finish(NonnullRefPtr<NetworkResponse>&& response)
  17. {
  18. if (is_cancelled())
  19. return;
  20. // NOTE: We protect ourselves here, since the on_finish callback may otherwise
  21. // trigger destruction of this job somehow.
  22. NonnullRefPtr<NetworkJob> protector(*this);
  23. m_response = move(response);
  24. dbgln_if(NETWORKJOB_DEBUG, "{} job did_finish", *this);
  25. VERIFY(on_finish);
  26. on_finish(true);
  27. shutdown(ShutdownMode::DetachFromSocket);
  28. }
  29. void NetworkJob::did_fail(Error error)
  30. {
  31. if (is_cancelled())
  32. return;
  33. // NOTE: We protect ourselves here, since the on_finish callback may otherwise
  34. // trigger destruction of this job somehow.
  35. NonnullRefPtr<NetworkJob> protector(*this);
  36. m_error = error;
  37. dbgln_if(NETWORKJOB_DEBUG, "{}{{{:p}}} job did_fail! error: {} ({})", class_name(), this, (unsigned)error, to_string(error));
  38. VERIFY(on_finish);
  39. on_finish(false);
  40. shutdown(ShutdownMode::DetachFromSocket);
  41. }
  42. void NetworkJob::did_progress(Optional<u64> total_size, u64 downloaded)
  43. {
  44. if (is_cancelled())
  45. return;
  46. // NOTE: We protect ourselves here, since the callback may otherwise
  47. // trigger destruction of this job somehow.
  48. NonnullRefPtr<NetworkJob> protector(*this);
  49. if (on_progress)
  50. on_progress(total_size, downloaded);
  51. }
  52. char const* to_string(NetworkJob::Error error)
  53. {
  54. switch (error) {
  55. case NetworkJob::Error::ProtocolFailed:
  56. return "ProtocolFailed";
  57. case NetworkJob::Error::ConnectionFailed:
  58. return "ConnectionFailed";
  59. case NetworkJob::Error::TransmissionFailed:
  60. return "TransmissionFailed";
  61. case NetworkJob::Error::Cancelled:
  62. return "Cancelled";
  63. default:
  64. return "(Unknown error)";
  65. }
  66. }
  67. }