From 5c182bb4d38e4a2dcc06f315ca8e6bbf16aa89db Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Mon, 11 May 2026 14:24:28 +0800 Subject: [PATCH] feat: add all schema functions in cdylib project --- wfassoc-cdylib/src/lib.rs | 207 ++++++++++++++++++++++++++++-- wfassoc-cdylib/src/object_pool.rs | 4 + 2 files changed, 199 insertions(+), 12 deletions(-) diff --git a/wfassoc-cdylib/src/lib.rs b/wfassoc-cdylib/src/lib.rs index 1386485..0b9529a 100644 --- a/wfassoc-cdylib/src/lib.rs +++ b/wfassoc-cdylib/src/lib.rs @@ -155,7 +155,7 @@ macro_rules! cffi_wrapper { }}; // Case without output parameter and no input parameters - ($inner_body:block) => {{ + (|| $inner_body:block) => {{ fn inner() -> Result<()> $inner_body match inner() { @@ -179,14 +179,24 @@ macro_rules! cffi_wrapper { #[unsafe(no_mangle)] pub extern "C" fn WFStartup() -> bool { - // TODO: Initialize all pool by fetching writer from them - true + // Initialize all pool by fetching writer from them + cffi_wrapper!(|| { + let _pool = pull_writer!(SCHEMA_POOL)?; + let _pool = pull_writer!(PROGRAM_POOL)?; + Ok(()) + }) } #[unsafe(no_mangle)] pub extern "C" fn WFShutdown() -> bool { - // TODO: Free all pool stored objects - true + // Free all pool stored objects + cffi_wrapper!(|| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + pool.clear(); + let mut pool = pull_writer!(PROGRAM_POOL)?; + pool.clear(); + Ok(()) + }) } #[unsafe(no_mangle)] @@ -228,17 +238,167 @@ pub extern "C" fn WFSchemaSetIdentifier( } #[unsafe(no_mangle)] -pub extern "C" fn WFSchemaIntoProgram( +pub extern "C" fn WFSchemaSetPath( in_schema: in_param_ty!(Token), - out_program: out_param_ty!(Token), + in_value: in_param_ty!(CStyleString), ) -> bool { - cffi_wrapper!(|in_schema: Token| -> (out_program: Token) { + cffi_wrapper!(|in_schema: Token, in_value: CStyleString| { let mut pool = pull_writer!(SCHEMA_POOL)?; - let schema = pool.pop(in_schema)?; + let schema = pool.get_mut(in_schema)?; + schema.set_path(cstr_ffi::parse_ffi_string(in_value)?); + Ok(()) + }) +} - let mut pool = pull_writer!(PROGRAM_POOL)?; - let program = schema.into_program()?; - Ok(pool.allocate(program)?) +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaSetClsid( + in_schema: in_param_ty!(Token), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!(|in_schema: Token, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + schema.set_clsid(cstr_ffi::parse_ffi_string(in_value)?); + Ok(()) + }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaSetName( + in_schema: in_param_ty!(Token), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!(|in_schema: Token, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + + let name = if in_value.is_null() { + None + } else { + Some(cstr_ffi::parse_ffi_string(in_value)?) + }; + schema.set_name(name); + Ok(()) + }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaSetIcon( + in_schema: in_param_ty!(Token), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!(|in_schema: Token, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + + let icon = if in_value.is_null() { + None + } else { + Some(cstr_ffi::parse_ffi_string(in_value)?) + }; + schema.set_icon(icon); + Ok(()) + }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaSetBehavior( + in_schema: in_param_ty!(Token), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!(|in_schema: Token, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + + let behavior = if in_value.is_null() { + None + } else { + Some(cstr_ffi::parse_ffi_string(in_value)?) + }; + schema.set_behavior(behavior); + Ok(()) + }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaAddStr( + in_schema: in_param_ty!(Token), + in_name: in_param_ty!(CStyleString), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!( + |in_schema: Token, in_name: CStyleString, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + schema.add_str( + cstr_ffi::parse_ffi_string(in_name)?, + cstr_ffi::parse_ffi_string(in_value)?, + )?; + Ok(()) + } + ) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaAddIcon( + in_schema: in_param_ty!(Token), + in_name: in_param_ty!(CStyleString), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!( + |in_schema: Token, in_name: CStyleString, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + schema.add_icon( + cstr_ffi::parse_ffi_string(in_name)?, + cstr_ffi::parse_ffi_string(in_value)?, + )?; + Ok(()) + } + ) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaAddBehavior( + in_schema: in_param_ty!(Token), + in_name: in_param_ty!(CStyleString), + in_value: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!( + |in_schema: Token, in_name: CStyleString, in_value: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + schema.add_behavior( + cstr_ffi::parse_ffi_string(in_name)?, + cstr_ffi::parse_ffi_string(in_value)?, + )?; + Ok(()) + } + ) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFSchemaAddExt( + in_schema: in_param_ty!(Token), + in_ext: in_param_ty!(CStyleString), + in_ext_name: in_param_ty!(CStyleString), + in_ext_icon: in_param_ty!(CStyleString), + in_ext_behavior: in_param_ty!(CStyleString), +) -> bool { + cffi_wrapper!(|in_schema: Token, + in_ext: CStyleString, + in_ext_name: CStyleString, + in_ext_icon: CStyleString, + in_ext_behavior: CStyleString| { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.get_mut(in_schema)?; + schema.add_ext( + cstr_ffi::parse_ffi_string(in_ext)?, + cstr_ffi::parse_ffi_string(in_ext_name)?, + cstr_ffi::parse_ffi_string(in_ext_icon)?, + cstr_ffi::parse_ffi_string(in_ext_behavior)?, + )?; + Ok(()) }) } @@ -257,6 +417,29 @@ pub extern "C" fn WFSchemaDestroy(in_schema: in_param_ty!(Token)) -> bool { static PROGRAM_POOL: LazyLock>> = LazyLock::new(|| RwLock::new(ObjectPool::new())); +#[unsafe(no_mangle)] +pub extern "C" fn WFProgramCreate( + in_schema: in_param_ty!(Token), + out_program: out_param_ty!(Token), +) -> bool { + cffi_wrapper!(|in_schema: Token| -> (out_program: Token) { + let mut pool = pull_writer!(SCHEMA_POOL)?; + let schema = pool.pop(in_schema)?; + + let mut pool = pull_writer!(PROGRAM_POOL)?; + let program = Program::new(schema)?; + Ok(pool.allocate(program)?) + }) +} + +#[unsafe(no_mangle)] +pub extern "C" fn WFProgramDestroy(in_program: in_param_ty!(Token)) -> bool { + cffi_wrapper!(|in_program: Token| { + let mut pool = pull_writer!(PROGRAM_POOL)?; + Ok(pool.free(in_program)?) + }) +} + // endregion // endregion diff --git a/wfassoc-cdylib/src/object_pool.rs b/wfassoc-cdylib/src/object_pool.rs index 60fe641..2b17ff8 100644 --- a/wfassoc-cdylib/src/object_pool.rs +++ b/wfassoc-cdylib/src/object_pool.rs @@ -49,6 +49,10 @@ impl ObjectPool { Ok(()) } + pub fn clear(&mut self) -> () { + self.objs.clear(); + } + pub fn pop(&mut self, token: Token) -> Result { match self.objs.remove(Self::token_to_key(token)) { Some(obj) => Ok(obj),