1
0

feat: update program and cdylib exposed interface

This commit is contained in:
2026-05-27 10:38:45 +08:00
parent 18a55272a3
commit 2c811503a2
4 changed files with 174 additions and 75 deletions

View File

@@ -191,10 +191,11 @@ static PROGRAM_POOL: LazyLock<RwLock<ObjectPool<Program>>> =
static EXT_STATUS_POOL: LazyLock<RwLock<ObjectPool<wfassoc::highlevel::ProgramExtStatus>>> =
LazyLock::new(|| RwLock::new(ObjectPool::new()));
static ICON_RC_POOL: LazyLock<RwLock<ObjectPool<wfassoc::win32::concept::IconRc>>> =
LazyLock::new(|| RwLock::new(ObjectPool::new()));
static SELF_EXT_STATUS_POOL: LazyLock<
RwLock<ObjectPool<wfassoc::highlevel::ProgramSelfExtStatus>>,
> = LazyLock::new(|| RwLock::new(ObjectPool::new()));
static EXT_POOL: LazyLock<RwLock<ObjectPool<wfassoc::win32::concept::Ext>>> =
static ICON_RC_POOL: LazyLock<RwLock<ObjectPool<wfassoc::win32::concept::IconRc>>> =
LazyLock::new(|| RwLock::new(ObjectPool::new()));
// endregion
@@ -218,8 +219,8 @@ pub extern "C" fn WFStartup() -> bool {
let _pool = pull_writer!(SCHEMA_POOL)?;
let _pool = pull_writer!(PROGRAM_POOL)?;
let _pool = pull_writer!(EXT_STATUS_POOL)?;
let _pool = pull_writer!(SELF_EXT_STATUS_POOL)?;
let _pool = pull_writer!(ICON_RC_POOL)?;
let _pool = pull_writer!(EXT_POOL)?;
Ok(())
})
}
@@ -234,9 +235,9 @@ pub extern "C" fn WFShutdown() -> bool {
pool.clear();
let mut pool = pull_writer!(EXT_STATUS_POOL)?;
pool.clear();
let mut pool = pull_writer!(ICON_RC_POOL)?;
let mut pool = pull_writer!(SELF_EXT_STATUS_POOL)?;
pool.clear();
let mut pool = pull_writer!(EXT_POOL)?;
let mut pool = pull_writer!(ICON_RC_POOL)?;
pool.clear();
Ok(())
})
@@ -539,23 +540,6 @@ pub extern "C" fn WFProgramExtsLen(
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFProgramGetExt(
in_program: in_param_ty!(Token),
in_index: in_param_ty!(usize),
out_ext: out_param_ty!(Token),
) -> bool {
cffi_wrapper!(|in_program: Token, in_index: usize| -> (out_ext: Token) {
let mut pool = pull_writer!(PROGRAM_POOL)?;
let program = pool.get_mut(in_program)?;
let ext = program.get_ext(in_index)?;
let mut pool = pull_writer!(EXT_POOL)?;
let token = pool.allocate(ext.clone())?;
Ok(token)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFProgramFindExt(
in_program: in_param_ty!(Token),
@@ -575,6 +559,23 @@ pub extern "C" fn WFProgramFindExt(
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFProgramResolveExt(
in_program: in_param_ty!(Token),
in_index: in_param_ty!(usize),
out_self_ext_status: out_param_ty!(Token),
) -> bool {
cffi_wrapper!(|in_program: Token, in_index: usize| -> (out_self_ext_status: Token) {
let mut pool = pull_writer!(PROGRAM_POOL)?;
let program = pool.get_mut(in_program)?;
let self_ext_status = program.resolve_ext(in_index)?;
let mut pool = pull_writer!(SELF_EXT_STATUS_POOL)?;
let token = pool.allocate(self_ext_status)?;
Ok(token)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFProgramRegister(
in_program: in_param_ty!(Token),
@@ -716,6 +717,77 @@ pub extern "C" fn WFExtStatusGetIcon(
// endregion
// region: Self Extension Status
#[unsafe(no_mangle)]
pub extern "C" fn WFSelfExtStatusDestroy(in_self_ext_status: in_param_ty!(Token)) -> bool {
cffi_wrapper!(|in_self_ext_status: Token| {
let mut pool = pull_writer!(SELF_EXT_STATUS_POOL)?;
Ok(pool.free(in_self_ext_status)?)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFSelfExtStatusGetName(
in_self_ext_status: in_param_ty!(Token),
out_name: out_param_ty!(CStyleString),
) -> bool {
cffi_wrapper!(|in_self_ext_status: Token| -> (out_name: CStyleString) {
let pool = pull_reader!(SELF_EXT_STATUS_POOL)?;
let self_ext_status = pool.get(in_self_ext_status)?;
cstr_ffi::set_ffi_string(self_ext_status.get_name())?;
Ok(cstr_ffi::get_ffi_string())
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFSelfExtStatusGetIcon(
in_self_ext_status: in_param_ty!(Token),
out_icon: out_param_ty!(HICON),
) -> bool {
cffi_wrapper!(|in_self_ext_status: Token| -> (out_icon: HICON) {
let pool = pull_reader!(SELF_EXT_STATUS_POOL)?;
let self_ext_status = pool.get(in_self_ext_status)?;
let icon = match self_ext_status.get_icon() {
Some(icon) => icon.get_icon(),
None => ffi_types::INVALID_HICON,
};
Ok(icon)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFSelfExtStatusGetExt(
in_self_ext_status: in_param_ty!(Token),
out_inner: out_param_ty!(CStyleString),
) -> bool {
cffi_wrapper!(|in_self_ext_status: Token| -> (out_inner: CStyleString) {
let pool = pull_reader!(SELF_EXT_STATUS_POOL)?;
let self_ext_status = pool.get(in_self_ext_status)?;
cstr_ffi::set_ffi_string(self_ext_status.get_ext())?;
Ok(cstr_ffi::get_ffi_string())
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFSelfExtStatusGetDottedExt(
in_self_ext_status: in_param_ty!(Token),
out_inner: out_param_ty!(CStyleString),
) -> bool {
cffi_wrapper!(|in_self_ext_status: Token| -> (out_inner: CStyleString) {
let pool = pull_reader!(SELF_EXT_STATUS_POOL)?;
let self_ext_status = pool.get(in_self_ext_status)?;
cstr_ffi::set_ffi_string(self_ext_status.get_dotted_ext().as_str())?;
Ok(cstr_ffi::get_ffi_string())
})
}
// endregion
// region: Icon Resource
#[unsafe(no_mangle)]
@@ -740,41 +812,3 @@ pub extern "C" fn WFIconRcGetIcon(
}
// endregion
// region: File Extension
#[unsafe(no_mangle)]
pub extern "C" fn WFExtDestroy(in_ext: in_param_ty!(Token)) -> bool {
cffi_wrapper!(|in_ext: Token| {
let mut pool = pull_writer!(EXT_POOL)?;
Ok(pool.free(in_ext)?)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFExtGetInner(
in_ext: in_param_ty!(Token),
out_inner: out_param_ty!(CStyleString),
) -> bool {
cffi_wrapper!(|in_ext: Token| -> (out_inner: CStyleString) {
let pool = pull_reader!(EXT_POOL)?;
let ext = pool.get(in_ext)?;
cstr_ffi::set_ffi_string(ext.inner())?;
Ok(cstr_ffi::get_ffi_string())
})
}
#[unsafe(no_mangle)]
pub extern "C" fn WFExtGetDottedInner(
in_ext: in_param_ty!(Token),
out_inner: out_param_ty!(CStyleString),
) -> bool {
cffi_wrapper!(|in_ext: Token| -> (out_inner: CStyleString) {
let pool = pull_reader!(EXT_POOL)?;
let ext = pool.get(in_ext)?;
cstr_ffi::set_ffi_string(&ext.dotted_inner())?;
Ok(cstr_ffi::get_ffi_string())
})
}
// endregion