NetworkJob.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Function.h>
  8. #include <AK/Stream.h>
  9. #include <LibCore/Object.h>
  10. namespace Core {
  11. class NetworkJob : public Object {
  12. C_OBJECT_ABSTRACT(NetworkJob)
  13. public:
  14. enum class Error {
  15. None,
  16. ConnectionFailed,
  17. TransmissionFailed,
  18. ProtocolFailed,
  19. Cancelled,
  20. };
  21. virtual ~NetworkJob() override;
  22. // Could fire twice, after Headers and after Trailers!
  23. Function<void(const HashMap<String, String, CaseInsensitiveStringTraits>& response_headers, Optional<u32> response_code)> on_headers_received;
  24. Function<void(bool success)> on_finish;
  25. Function<void(Optional<u32>, u32)> on_progress;
  26. bool is_cancelled() const { return m_error == Error::Cancelled; }
  27. bool has_error() const { return m_error != Error::None; }
  28. Error error() const { return m_error; }
  29. NetworkResponse* response() { return m_response.ptr(); }
  30. const NetworkResponse* response() const { return m_response.ptr(); }
  31. virtual void start() = 0;
  32. virtual void shutdown() = 0;
  33. void cancel()
  34. {
  35. shutdown();
  36. m_error = Error::Cancelled;
  37. }
  38. protected:
  39. NetworkJob(OutputStream&);
  40. void did_finish(NonnullRefPtr<NetworkResponse>&&);
  41. void did_fail(Error);
  42. void did_progress(Optional<u32> total_size, u32 downloaded);
  43. size_t do_write(ReadonlyBytes bytes) { return m_output_stream.write(bytes); }
  44. private:
  45. RefPtr<NetworkResponse> m_response;
  46. OutputStream& m_output_stream;
  47. Error m_error { Error::None };
  48. };
  49. const char* to_string(NetworkJob::Error);
  50. }
  51. template<>
  52. struct AK::Formatter<Core::NetworkJob> : Formatter<Core::Object> {
  53. };