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>>> =
|
static PROGRAM_POOL: LazyLock<RwLock<ObjectPool<Program>>> =
|
||||||
LazyLock::new(|| RwLock::new(ObjectPool::new()));
|
LazyLock::new(|| RwLock::new(ObjectPool::new()));
|
||||||
|
|
||||||
|
static EXT_STATUE_POOL: LazyLock<RwLock<ObjectPool<wfassoc::highlevel::ProgramExtStatus>>> =
|
||||||
|
LazyLock::new(|| RwLock::new(ObjectPool::new()));
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region: Exposed Types
|
// region: Exposed Types
|
||||||
@@ -241,6 +244,7 @@ pub extern "C" fn WFStartup() -> bool {
|
|||||||
cffi_wrapper!(|| {
|
cffi_wrapper!(|| {
|
||||||
let _pool = pull_writer!(SCHEMA_POOL)?;
|
let _pool = pull_writer!(SCHEMA_POOL)?;
|
||||||
let _pool = pull_writer!(PROGRAM_POOL)?;
|
let _pool = pull_writer!(PROGRAM_POOL)?;
|
||||||
|
let _pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -253,6 +257,8 @@ pub extern "C" fn WFShutdown() -> bool {
|
|||||||
pool.clear();
|
pool.clear();
|
||||||
let mut pool = pull_writer!(PROGRAM_POOL)?;
|
let mut pool = pull_writer!(PROGRAM_POOL)?;
|
||||||
pool.clear();
|
pool.clear();
|
||||||
|
let mut pool = pull_writer!(EXT_STATUE_POOL)?;
|
||||||
|
pool.clear();
|
||||||
Ok(())
|
Ok(())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -527,8 +533,8 @@ pub extern "C" fn WFProgramIsRegistered(
|
|||||||
out_is_registered: out_param_ty!(bool),
|
out_is_registered: out_param_ty!(bool),
|
||||||
) -> bool {
|
) -> bool {
|
||||||
cffi_wrapper!(|in_program: Token, in_scope: u32| -> (out_is_registered: bool) {
|
cffi_wrapper!(|in_program: Token, in_scope: u32| -> (out_is_registered: bool) {
|
||||||
let mut pool = pull_writer!(PROGRAM_POOL)?;
|
let pool = pull_reader!(PROGRAM_POOL)?;
|
||||||
let program = pool.get_mut(in_program)?;
|
let program = pool.get(in_program)?;
|
||||||
let scope = resolve_enum!(Scope, in_scope)?;
|
let scope = resolve_enum!(Scope, in_scope)?;
|
||||||
Ok(program.is_registered(scope.into())?)
|
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
|
// 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
|
// endregion
|
||||||
|
|
||||||
// region: String Resource
|
// region: String Resource
|
||||||
|
|||||||
Reference in New Issue
Block a user