feat: add ext status for cdylib
This commit is contained in:
@@ -191,6 +191,9 @@ static SCHEMA_POOL: LazyLock<RwLock<ObjectPool<Schema>>> =
|
||||
static PROGRAM_POOL: LazyLock<RwLock<ObjectPool<Program>>> =
|
||||
LazyLock::new(|| RwLock::new(ObjectPool::new()));
|
||||
|
||||
static EXT_STATUE_POOL: LazyLock<RwLock<ObjectPool<wfassoc::highlevel::ProgramExtStatus>>> =
|
||||
LazyLock::new(|| RwLock::new(ObjectPool::new()));
|
||||
|
||||
// endregion
|
||||
|
||||
// region: Exposed Types
|
||||
@@ -241,6 +244,7 @@ pub extern "C" fn WFStartup() -> bool {
|
||||
cffi_wrapper!(|| {
|
||||
let _pool = pull_writer!(SCHEMA_POOL)?;
|
||||
let _pool = pull_writer!(PROGRAM_POOL)?;
|
||||
let _pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
@@ -253,6 +257,8 @@ pub extern "C" fn WFShutdown() -> bool {
|
||||
pool.clear();
|
||||
let mut pool = pull_writer!(PROGRAM_POOL)?;
|
||||
pool.clear();
|
||||
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||
pool.clear();
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
@@ -527,8 +533,8 @@ pub extern "C" fn WFProgramIsRegistered(
|
||||
out_is_registered: out_param_ty!(bool),
|
||||
) -> bool {
|
||||
cffi_wrapper!(|in_program: Token, in_scope: u32| -> (out_is_registered: bool) {
|
||||
let mut pool = pull_writer!(PROGRAM_POOL)?;
|
||||
let program = pool.get_mut(in_program)?;
|
||||
let pool = pull_reader!(PROGRAM_POOL)?;
|
||||
let program = pool.get(in_program)?;
|
||||
let scope = resolve_enum!(Scope, in_scope)?;
|
||||
Ok(program.is_registered(scope.into())?)
|
||||
})
|
||||
@@ -564,6 +570,53 @@ pub extern "C" fn WFProgramUnlinkExt(
|
||||
})
|
||||
}
|
||||
|
||||
// endregion
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn WFProgramQueryExt(
|
||||
in_program: in_param_ty!(Token),
|
||||
in_view: in_param_ty!(u32),
|
||||
in_index: in_param_ty!(usize),
|
||||
out_ext_status: out_param_ty!(Token),
|
||||
) -> bool {
|
||||
cffi_wrapper!(|in_program: Token, in_view: u32, in_index: usize| -> (out_ext_status: Token) {
|
||||
let pool = pull_reader!(PROGRAM_POOL)?;
|
||||
let program = pool.get(in_program)?;
|
||||
let view = resolve_enum!(View, in_view)?;
|
||||
|
||||
let ext_status = program.query_ext(view.into(), in_index)?;
|
||||
todo!();
|
||||
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||
Ok(pool.allocate(ext_status)?)
|
||||
})
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn WFExtStatusDestroy(in_ext_status: in_param_ty!(Token)) -> bool {
|
||||
cffi_wrapper!(|in_ext_status: Token| {
|
||||
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||
Ok(pool.free(in_ext_status)?)
|
||||
})
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn WFExtStatuGetName(in_ext_status: in_param_ty!(Token), out_name: out_param_ty!(CStyleString)) -> bool {
|
||||
cffi_wrapper!(|in_ext_status: Token| -> (out_name: CStyleString) {
|
||||
let pool = pull_reader!(EXT_STATUE_POOL)?;
|
||||
let ext_status = pool.get(in_ext_status)?;
|
||||
|
||||
cstr_ffi::set_ffi_string(ext_status.get_name())?;
|
||||
Ok(cstr_ffi::get_ffi_string())
|
||||
})
|
||||
}
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
pub extern "C" fn WFExtStatuGetIcon(in_ext_status: in_param_ty!(Token), out_icon: out_param_ty!(HICON)) -> bool {
|
||||
cffi_wrapper!(|in_ext_status: Token| -> (out_icon: HICON) {
|
||||
let pool = pull_reader!(EXT_STATUE_POOL)?;
|
||||
let ext_status = pool.get(in_ext_status)?;
|
||||
Ok(ext_status.get_icon())
|
||||
})
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
@@ -575,6 +575,18 @@ impl Drop for IconRc {
|
||||
}
|
||||
}
|
||||
|
||||
// SAFETY:
|
||||
// Win32 HICON can be safely moved between different threads naturally.
|
||||
unsafe impl Send for IconRc {}
|
||||
|
||||
// SAFETY:
|
||||
// When multiple threads calling this struct, there is no conflict between them,
|
||||
// because this struct only provide HICON itself.
|
||||
//
|
||||
// However, the caller should ensure that all calls using this HICON
|
||||
// follow Win32 thread model.
|
||||
unsafe impl Sync for IconRc {}
|
||||
|
||||
// endregion
|
||||
|
||||
// region: String Resource
|
||||
|
||||
Reference in New Issue
Block a user