dmsdk/
dmresource.rs

1//! Custom resource registering module.
2#![allow(missing_docs)]
3
4use crate::ffi::dmResource;
5use std::ffi::CString;
6
7pub use ctor::ctor;
8use libc::c_void;
9
10pub type TypeCreatorDesc = dmResource::TypeCreatorDesc;
11pub type Factory = dmResource::HFactory;
12pub type ResourceTypeRegisterContext = dmResource::ResourceTypeRegisterContext;
13pub type ResourcePreloadParams = dmResource::ResourcePreloadParams;
14pub type ResourceCreateParams = dmResource::ResourceCreateParams;
15pub type ResourcePostCreateParams = dmResource::ResourcePostCreateParams;
16pub type ResourceDestroyParams = dmResource::ResourceDestroyParams;
17pub type ResourceRecreateParams = dmResource::ResourceRecreateParams;
18
19pub type ResourceTypeRegister = unsafe extern "C" fn(ctx: *mut ResourceTypeRegisterContext) -> i32;
20pub type ResourceTypeDeregister =
21    unsafe extern "C" fn(ctx: *mut dmResource::ResourceTypeRegisterContext) -> i32;
22pub type ResourcePreload = unsafe extern "C" fn(params: *const ResourcePreloadParams) -> i32;
23pub type ResourceCreate = unsafe extern "C" fn(params: *const ResourceCreateParams) -> i32;
24pub type ResourcePostCreate = unsafe extern "C" fn(params: *const ResourcePostCreateParams) -> i32;
25pub type ResourceDestroy = unsafe extern "C" fn(params: *const ResourceDestroyParams) -> i32;
26pub type ResourceRecreate = unsafe extern "C" fn(params: *const ResourceRecreateParams) -> i32;
27
28#[macro_export]
29macro_rules! register_resource_type {
30    ($symbol:ident, $suffix:expr, $register_fn:expr, $deregister_fn:expr) => {
31        paste! {
32            static mut [<$symbol _TYPE_CREATOR_DESC>]: dmresource::TypeCreatorDesc = dmresource::TypeCreatorDesc {
33                _bindgen_opaque_blob: [0u64; 4],
34            };
35
36            #[no_mangle]
37            #[dmextension::ctor]
38            unsafe fn $symbol() {
39                dmresource::_register_type_creator_desc(
40                    &mut [<$symbol _TYPE_CREATOR_DESC>],
41                    $suffix,
42                    $register_fn,
43                    $deregister_fn,
44                );
45            }
46        }
47    };
48}
49
50pub fn _register_type_creator_desc(
51    desc: &mut TypeCreatorDesc,
52    suffix: &str,
53    register_fn: ResourceTypeRegister,
54    deregister_fn: Option<ResourceTypeDeregister>,
55) {
56    let suffix = CString::new(suffix).unwrap();
57    unsafe {
58        dmResource::RegisterTypeCreatorDesc(
59            desc,
60            4,
61            suffix.as_ptr(),
62            Some(register_fn),
63            deregister_fn,
64        );
65    }
66}
67
68/// # Safety
69///
70/// This functions is safe as long as `extension` and `context` are valid pointers.
71#[allow(clippy::too_many_arguments)]
72pub unsafe fn register_type(
73    factory: Factory,
74    extension: *const i8,
75    context: *mut c_void,
76    preload_fn: Option<ResourcePreload>,
77    create_fn: Option<ResourceCreate>,
78    post_create_fn: Option<ResourcePostCreate>,
79    destroy_fn: Option<ResourceDestroy>,
80    recreate_fn: Option<ResourceRecreate>,
81) -> i32 {
82    dmResource::RegisterType(
83        factory,
84        extension,
85        context,
86        preload_fn,
87        create_fn,
88        post_create_fn,
89        destroy_fn,
90        recreate_fn,
91    )
92}