ResourceLoader.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <LibCore/CFile.h>
  2. #include <LibCore/CHttpJob.h>
  3. #include <LibCore/CHttpRequest.h>
  4. #include <LibCore/CNetworkResponse.h>
  5. #include <LibHTML/ResourceLoader.h>
  6. ResourceLoader& ResourceLoader::the()
  7. {
  8. static ResourceLoader* s_the;
  9. if (!s_the)
  10. s_the = &ResourceLoader::construct().leak_ref();
  11. return *s_the;
  12. }
  13. void ResourceLoader::load(const URL& url, Function<void(const ByteBuffer&)> callback)
  14. {
  15. if (url.protocol() == "file") {
  16. auto f = CFile::construct();
  17. f->set_filename(url.path());
  18. if (!f->open(CIODevice::OpenMode::ReadOnly)) {
  19. dbg() << "ResourceLoader::load: Error: " << f->error_string();
  20. callback({});
  21. return;
  22. }
  23. auto data = f->read_all();
  24. deferred_invoke([data = move(data), callback = move(callback)](auto&) {
  25. callback(data);
  26. });
  27. return;
  28. }
  29. if (url.protocol() == "http") {
  30. CHttpRequest request;
  31. request.set_url(url);
  32. request.set_method(CHttpRequest::Method::GET);
  33. auto job = request.schedule();
  34. ++m_pending_loads;
  35. if (on_load_counter_change)
  36. on_load_counter_change();
  37. job->on_finish = [this, job, callback = move(callback)](bool success) {
  38. --m_pending_loads;
  39. if (on_load_counter_change)
  40. on_load_counter_change();
  41. if (!success) {
  42. dbg() << "HTTP job failed!";
  43. ASSERT_NOT_REACHED();
  44. }
  45. auto* response = job->response();
  46. ASSERT(response);
  47. callback(response->payload());
  48. };
  49. return;
  50. }
  51. dbg() << "Unimplemented protocol: " << url.protocol();
  52. ASSERT_NOT_REACHED();
  53. }