1#![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#[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}