NetworkJob.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. void NetworkJob::did_finish(NonnullRefPtr<NetworkResponse>&& response)
  16. {
  17. if (is_cancelled())
  18. return;
  19. // NOTE: We protect ourselves here, since the on_finish callback may otherwise
  20. // trigger destruction of this job somehow.
  21. NonnullRefPtr<NetworkJob> protector(*this);
  22. m_response = move(response);
  23. dbgln_if(NETWORKJOB_DEBUG, "{} job did_finish", *this);
  24. VERIFY(on_finish);
  25. on_finish(true);
  26. shutdown(ShutdownMode::DetachFromSocket);
  27. }
  28. void NetworkJob::did_fail(Error error)
  29. {
  30. if (is_cancelled())
  31. return;
  32. // NOTE: We protect ourselves here, since the on_finish callback may otherwise
  33. // trigger destruction of this job somehow.
  34. NonnullRefPtr<NetworkJob> protector(*this);
  35. m_error = error;
  36. dbgln_if(NETWORKJOB_DEBUG, "{}{{{:p}}} job did_fail! error: {} ({})", class_name(), this, (unsigned)error, to_string(error));
  37. VERIFY(on_finish);
  38. on_finish(false);
  39. shutdown(ShutdownMode::DetachFromSocket);
  40. }
  41. void NetworkJob::did_progress(Optional<u64> total_size, u64 downloaded)
  42. {
  43. if (is_cancelled())
  44. return;
  45. // NOTE: We protect ourselves here, since the callback may otherwise
  46. // trigger destruction of this job somehow.
  47. NonnullRefPtr<NetworkJob> protector(*this);
  48. if (on_progress)
  49. on_progress(total_size, downloaded);
  50. }
  51. char const* to_string(NetworkJob::Error error)
  52. {
  53. switch (error) {
  54. case NetworkJob::Error::ProtocolFailed:
  55. return "ProtocolFailed";
  56. case NetworkJob::Error::ConnectionFailed:
  57. return "ConnectionFailed";
  58. case NetworkJob::Error::TransmissionFailed:
  59. return "TransmissionFailed";
  60. case NetworkJob::Error::Cancelled:
  61. return "Cancelled";
  62. default:
  63. return "(Unknown error)";
  64. }
  65. }
  66. }