mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-03-10 06:41:10 +03:00
224 lines
5.7 KiB
Rust
224 lines
5.7 KiB
Rust
/*! Sciter Object Model (SOM passport), native C interface.
|
|
|
|
See https://sciter.com/native-code-exposure-to-script/
|
|
and https://sciter.com/developers/for-native-gui-programmers/sciter-object-model/.
|
|
|
|
*/
|
|
|
|
#![allow(non_snake_case, non_camel_case_types)]
|
|
#![allow(dead_code)]
|
|
|
|
use capi::sctypes::*;
|
|
use capi::scvalue::VALUE;
|
|
|
|
/// An atom value that uniquely identifies the name being registered.
|
|
pub type som_atom_t = u64;
|
|
|
|
|
|
/// `som_asset_t` is a structure that a custom native object must be derived from.
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub struct som_asset_t {
|
|
pub(crate) isa: &'static som_asset_class_t,
|
|
}
|
|
|
|
impl som_asset_t {
|
|
pub(crate) fn get_passport(&self) -> *const som_passport_t {
|
|
(self.isa.get_passport)(self as *const _ as *mut _)
|
|
}
|
|
}
|
|
|
|
/// Is a pack of 4 pointers to functions that define the life time of an asset.
|
|
#[repr(C)]
|
|
#[derive(Debug)]
|
|
pub(crate) struct som_asset_class_t {
|
|
/// Increments the reference count for an interface on an object.
|
|
pub add_ref: extern "C" fn(thing: *mut som_asset_t) -> i32,
|
|
|
|
/// Decrements the reference count for an interface on an object.
|
|
pub release: extern "C" fn(thing: *mut som_asset_t) -> i32,
|
|
|
|
/// Retrieves a pointer to a supported interface of an object.
|
|
pub get_interface: extern "C" fn(thing: *mut som_asset_t, name: LPCSTR, out: *mut *mut som_asset_t) -> bool,
|
|
|
|
/// Retrieves a pointer to the passport declaration of an object.
|
|
pub get_passport: extern "C" fn(thing: *mut som_asset_t) -> *const som_passport_t,
|
|
}
|
|
|
|
|
|
/// Defines properties and methods of an asset.
|
|
#[repr(C)]
|
|
pub struct som_passport_t {
|
|
/// Flags of an asset, see [`som_passport_flags`](enum.som_passport_flags.html).
|
|
pub flags: u64,
|
|
|
|
/// The name of the class (asset type).
|
|
pub name: som_atom_t,
|
|
|
|
/// Properties: `asset.prop`.
|
|
///
|
|
/// Must be a pointer to an array of structures:
|
|
///
|
|
/// ```rust,no_run
|
|
/// # use sciter::om::*;
|
|
/// let mut pst = Box::new(som_passport_t::default());
|
|
///
|
|
/// type ObjectProps = [som_property_def_t; 2];
|
|
/// let mut props = Box::new(ObjectProps::default());
|
|
///
|
|
/// let mut prop1 = &mut props[0];
|
|
/// prop1.name = atom("age");
|
|
///
|
|
/// let mut prop2 = &mut props[1];
|
|
/// prop2.name = atom("name");
|
|
///
|
|
/// pst.n_properties = 2;
|
|
/// pst.properties = Box::into_raw(props) as *const _;
|
|
/// ```
|
|
|
|
pub properties: *const som_property_def_t,
|
|
|
|
/// Properties count.
|
|
pub n_properties: usize,
|
|
|
|
/// Methods: `asset.func()`
|
|
///
|
|
/// Must be a pointer to an array of structures,
|
|
/// see [`properties`](struct.som_passport_t.html#structfield.properties) for an example.
|
|
pub methods: *const som_method_def_t,
|
|
|
|
/// Methods count.
|
|
pub n_methods: usize,
|
|
|
|
/// Index access: `var item = asset[key]`.
|
|
pub item_getter: Option<som_item_getter_t>,
|
|
|
|
/// Index access: `asset[key] = item`.
|
|
pub item_setter: Option<som_item_setter_t>,
|
|
|
|
/// Enumeration: `for(var item in asset)`.
|
|
pub item_next: Option<som_item_next_t>,
|
|
|
|
/// Property access interceptor: `var val = asset.prop`.
|
|
pub prop_getter: Option<som_any_prop_getter_t>,
|
|
|
|
/// Property set interceptor: `asset.prop = val`.
|
|
pub prop_setter: Option<som_any_prop_setter_t>,
|
|
}
|
|
|
|
/// Empty passport.
|
|
impl Default for som_passport_t {
|
|
fn default() -> Self {
|
|
use std::ptr;
|
|
Self {
|
|
flags: 0,
|
|
name: 0,
|
|
|
|
prop_getter: None,
|
|
prop_setter: None,
|
|
|
|
item_getter: None,
|
|
item_setter: None,
|
|
item_next: None,
|
|
|
|
properties: ptr::null(),
|
|
n_properties: 0,
|
|
|
|
methods: ptr::null(),
|
|
n_methods: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/// [`som_passport_t`](struct.som_passport_t.html#structfield.flags) flags.
|
|
#[repr(u64)]
|
|
#[derive(Debug, PartialOrd, PartialEq)]
|
|
pub enum som_passport_flags {
|
|
/// Not extendable.
|
|
SEALED = 0,
|
|
|
|
/// Extendable.
|
|
///
|
|
/// An asset may have new properties added by script.
|
|
EXTENDABLE = 1,
|
|
}
|
|
|
|
|
|
/// Property of an asset.
|
|
#[repr(C)]
|
|
pub struct som_property_def_t {
|
|
pub reserved: LPVOID,
|
|
|
|
/// Property name.
|
|
pub name: som_atom_t,
|
|
|
|
/// Property getter: `var val = asset.prop`.
|
|
pub getter: Option<som_prop_getter_t>,
|
|
|
|
/// Property setter: `asset.prop = val`.
|
|
pub setter: Option<som_prop_setter_t>,
|
|
}
|
|
|
|
/// Empty property.
|
|
impl Default for som_property_def_t {
|
|
fn default() -> Self {
|
|
Self {
|
|
reserved: std::ptr::null_mut(),
|
|
name: 0,
|
|
getter: None,
|
|
setter: None,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Method of an asset.
|
|
#[repr(C)]
|
|
pub struct som_method_def_t {
|
|
pub reserved: LPVOID,
|
|
|
|
/// Method name.
|
|
pub name: som_atom_t,
|
|
|
|
/// Parameters count.
|
|
///
|
|
/// The actual arguments count can be lesser then specified here:
|
|
///
|
|
/// ```tiscript,ignore
|
|
/// function asset.func(a,b,c); // native asset method accepts 3 parameters
|
|
///
|
|
/// asset.func("one"); // call with only one parameter.
|
|
/// ```
|
|
pub params: usize,
|
|
|
|
/// Method body.
|
|
pub func: Option<som_method_t>,
|
|
}
|
|
|
|
/// Empty method.
|
|
impl Default for som_method_def_t {
|
|
fn default() -> Self {
|
|
Self {
|
|
reserved: std::ptr::null_mut(),
|
|
name: 0,
|
|
params: 0,
|
|
func: None,
|
|
}
|
|
}
|
|
}
|
|
|
|
type som_dispose_t = extern "C" fn(thing: *mut som_asset_t);
|
|
|
|
type som_prop_getter_t = extern "C" fn(thing: *mut som_asset_t, p_value: &mut VALUE) -> BOOL;
|
|
type som_prop_setter_t = extern "C" fn(thing: *mut som_asset_t, p_value: &VALUE) -> BOOL;
|
|
|
|
type som_any_prop_getter_t = extern "C" fn(thing: *mut som_asset_t, propSymbol: som_atom_t, p_value: &mut VALUE) -> BOOL;
|
|
type som_any_prop_setter_t = extern "C" fn(thing: *mut som_asset_t, propSymbol: som_atom_t, p_value: &VALUE) -> BOOL;
|
|
|
|
type som_item_getter_t = extern "C" fn(thing: *mut som_asset_t, p_key: &VALUE, p_value: &mut VALUE) -> BOOL;
|
|
type som_item_setter_t = extern "C" fn(thing: *mut som_asset_t, p_key: &VALUE, p_value: &VALUE) -> BOOL;
|
|
|
|
type som_item_next_t = extern "C" fn(thing: *mut som_asset_t, p_idx: &mut VALUE, p_value: &mut VALUE) -> BOOL;
|
|
|
|
type som_method_t = extern "C" fn(thing: *mut som_asset_t, argc: u32, argv: *const VALUE, p_result: &mut VALUE) -> BOOL;
|