2023-04-10 16:54:50 +08:00
|
|
|
use std::ffi::c_char;
|
|
|
|
|
2023-04-14 01:53:34 +08:00
|
|
|
use crate::{
|
|
|
|
flutter::{FlutterHandler, SESSIONS},
|
|
|
|
plugins::PLUGIN_REGISTRAR,
|
|
|
|
ui_session_interface::Session,
|
|
|
|
};
|
2023-04-08 17:46:47 +08:00
|
|
|
|
2023-04-08 18:17:13 +08:00
|
|
|
// API provided by RustDesk.
|
2023-04-10 16:54:50 +08:00
|
|
|
pub type LoadPluginFunc = fn(*const c_char) -> i32;
|
|
|
|
pub type UnloadPluginFunc = fn(*const c_char) -> i32;
|
2023-04-14 01:53:34 +08:00
|
|
|
pub type AddSessionFunc = fn(session: Session<FlutterHandler>) -> bool;
|
|
|
|
pub type RemoveSessionFunc = fn(session_id: &String) -> bool;
|
|
|
|
pub type AddSessionHookFunc = fn(session_id: String, key: String, hook: SessionHook) -> bool;
|
|
|
|
pub type RemoveSessionHookFunc = fn(session_id: String, key: &String) -> bool;
|
|
|
|
|
|
|
|
/// Hooks for session.
|
|
|
|
#[repr(usize)]
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub enum SessionHook {
|
|
|
|
OnSessionRgba(fn(&Session<FlutterHandler>, Vec<i8>) -> Vec<i8>) = 1,
|
|
|
|
}
|
2023-04-08 17:46:47 +08:00
|
|
|
|
2023-04-08 18:17:13 +08:00
|
|
|
#[repr(C)]
|
2023-04-08 17:46:47 +08:00
|
|
|
pub struct RustDeskApiTable {
|
2023-04-14 01:53:34 +08:00
|
|
|
pub(crate) load_plugin: LoadPluginFunc,
|
2023-04-13 02:06:42 +08:00
|
|
|
pub(crate) unload_plugin: UnloadPluginFunc,
|
2023-04-14 01:53:34 +08:00
|
|
|
pub add_session: AddSessionFunc,
|
|
|
|
pub remove_session: RemoveSessionFunc,
|
|
|
|
pub add_session_hook: AddSessionHookFunc,
|
|
|
|
pub remove_session_hook: RemoveSessionHookFunc,
|
2023-04-08 17:46:47 +08:00
|
|
|
}
|
|
|
|
|
2023-04-10 16:54:50 +08:00
|
|
|
fn load_plugin(path: *const c_char) -> i32 {
|
2023-04-08 17:46:47 +08:00
|
|
|
PLUGIN_REGISTRAR.load_plugin(path)
|
|
|
|
}
|
|
|
|
|
2023-04-10 16:54:50 +08:00
|
|
|
fn unload_plugin(path: *const c_char) -> i32 {
|
2023-04-08 17:46:47 +08:00
|
|
|
PLUGIN_REGISTRAR.unload_plugin(path)
|
|
|
|
}
|
|
|
|
|
2023-04-14 01:53:34 +08:00
|
|
|
fn add_session(session: Session<FlutterHandler>) -> bool {
|
|
|
|
let mut sessions = SESSIONS.write().unwrap();
|
|
|
|
if sessions.contains_key(&session.id) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
let _ = sessions.insert(session.id.to_owned(), session);
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
fn remove_session(session_id: &String) -> bool {
|
|
|
|
let mut sessions = SESSIONS.write().unwrap();
|
|
|
|
if !sessions.contains_key(session_id) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
let _ = sessions.remove(session_id);
|
|
|
|
true
|
|
|
|
}
|
|
|
|
|
|
|
|
fn add_session_hook(session_id: String, key: String, hook: SessionHook) -> bool {
|
|
|
|
let sessions = SESSIONS.read().unwrap();
|
|
|
|
if let Some(session) = sessions.get(&session_id) {
|
|
|
|
return session.add_session_hook(key, hook);
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
|
|
|
|
|
|
|
fn remove_session_hook(session_id: String, key: &String) -> bool {
|
|
|
|
let sessions = SESSIONS.read().unwrap();
|
|
|
|
if let Some(session) = sessions.get(&session_id) {
|
|
|
|
return session.remove_session_hook(key);
|
|
|
|
}
|
|
|
|
false
|
|
|
|
}
|
|
|
|
|
2023-04-08 17:46:47 +08:00
|
|
|
impl Default for RustDeskApiTable {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self {
|
2023-04-14 01:53:34 +08:00
|
|
|
load_plugin,
|
|
|
|
unload_plugin,
|
|
|
|
add_session,
|
|
|
|
remove_session,
|
|
|
|
add_session_hook,
|
|
|
|
remove_session_hook,
|
2023-04-08 17:46:47 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|