assets.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. use dioxus_core::prelude::Callback;
  2. use rustc_hash::FxHashMap;
  3. use std::{cell::RefCell, rc::Rc};
  4. use wry::{http::Request, RequestAsyncResponder};
  5. /// A request for an asset within dioxus-desktop.
  6. pub type AssetRequest = Request<Vec<u8>>;
  7. pub struct AssetHandler {
  8. f: Callback<(AssetRequest, RequestAsyncResponder)>,
  9. }
  10. #[derive(Clone)]
  11. pub struct AssetHandlerRegistry {
  12. handlers: Rc<RefCell<FxHashMap<String, AssetHandler>>>,
  13. }
  14. impl AssetHandlerRegistry {
  15. pub fn new() -> Self {
  16. AssetHandlerRegistry {
  17. handlers: Default::default(),
  18. }
  19. }
  20. pub fn has_handler(&self, name: &str) -> bool {
  21. self.handlers.borrow().contains_key(name)
  22. }
  23. pub fn handle_request(
  24. &self,
  25. name: &str,
  26. request: AssetRequest,
  27. responder: RequestAsyncResponder,
  28. ) {
  29. if let Some(handler) = self.handlers.borrow().get(name) {
  30. // Avoid handler being already borrowed on android
  31. #[cfg(target_os = "android")]
  32. let _lock = crate::android_sync_lock::android_runtime_lock();
  33. // And run the handler in the scope of the component that created it
  34. handler.f.call((request, responder));
  35. }
  36. }
  37. pub fn register_handler(
  38. &self,
  39. name: String,
  40. f: Callback<(AssetRequest, RequestAsyncResponder)>,
  41. ) {
  42. self.handlers.borrow_mut().insert(name, AssetHandler { f });
  43. }
  44. pub fn remove_handler(&self, name: &str) -> Option<AssetHandler> {
  45. self.handlers.borrow_mut().remove(name)
  46. }
  47. }