diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index d18971332..9da6d1552 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1398,7 +1398,7 @@ pub fn send_url_scheme(_url: String) { pub fn plugin_event(id: String, event: Vec) { #[cfg(feature = "plugin_framework")] { - crate::plugin::handle_ui_event(&id, &event); + allow_err!(crate::plugin::handle_ui_event(&id, &event)); } } diff --git a/src/plugin/callback_msg.rs b/src/plugin/callback_msg.rs index 42d3cf283..2ceffca9e 100644 --- a/src/plugin/callback_msg.rs +++ b/src/plugin/callback_msg.rs @@ -2,7 +2,11 @@ use super::cstr_to_string; use crate::flutter::{self, APP_TYPE_CM, APP_TYPE_MAIN, SESSIONS}; use hbb_common::{lazy_static, log, message_proto::PluginRequest}; use serde_json; -use std::{collections::HashMap, ffi::c_char, sync::Arc}; +use std::{ + collections::HashMap, + ffi::{c_char, c_void}, + sync::Arc, +}; const MSG_TO_PEER_TARGET: &str = "peer"; const MSG_TO_UI_TARGET: &str = "ui"; @@ -42,7 +46,7 @@ pub fn callback_msg( peer: *const c_char, target: *const c_char, id: *const c_char, - content: *const c_char, + content: *const c_void, len: usize, ) { macro_rules! callback_msg_field { @@ -66,12 +70,12 @@ pub fn callback_msg( let content_slice = unsafe { std::slice::from_raw_parts(content as *const u8, len) }; let content_vec = Vec::from(content_slice); - let plugin = PluginRequest { + let request = PluginRequest { id, content: bytes::Bytes::from(content_vec), ..Default::default() }; - session.send_plugin(plugin); + session.send_plugin_request(request); } } MSG_TO_UI_TARGET => { diff --git a/src/plugin/errno.rs b/src/plugin/errno.rs index e7419608c..d48e97c49 100644 --- a/src/plugin/errno.rs +++ b/src/plugin/errno.rs @@ -1,3 +1,5 @@ +#![allow(dead_code)] + pub const ERR_SUCCESS: i32 = 0; // ====================================================== diff --git a/src/plugin/mod.rs b/src/plugin/mod.rs index 3d1998b63..2f16f0325 100644 --- a/src/plugin/mod.rs +++ b/src/plugin/mod.rs @@ -1,14 +1,15 @@ use hbb_common::ResultType; -use std::ffi::{c_char, CStr}; +use std::ffi::{c_char, c_void, CStr}; mod callback_msg; mod config; pub mod desc; -mod plugins; mod errno; +mod plugins; pub use plugins::{ - handle_client_event, handle_ui_event, load_plugin, load_plugins, reload_plugin, unload_plugin, + handle_client_event, handle_server_event, handle_ui_event, load_plugin, load_plugins, + reload_plugin, unload_plugin, }; #[inline] @@ -27,5 +28,5 @@ fn get_code_msg_from_ret(ret: *const c_void) -> (i32, String) { .to_str() .unwrap_or("") .to_string(); - Ok((code, msg)) + (code, msg) } diff --git a/src/plugin/plugins.rs b/src/plugin/plugins.rs index 39bda5cb7..b7de6e0be 100644 --- a/src/plugin/plugins.rs +++ b/src/plugin/plugins.rs @@ -1,6 +1,6 @@ use std::{ collections::HashMap, - ffi::c_char, + ffi::{c_char, c_void}, path::Path, sync::{Arc, RwLock}, }; @@ -176,13 +176,13 @@ pub fn load_plugin(path: &str) -> ResultType<()> { fn handle_event(method: &[u8], id: &str, event: &[u8]) -> ResultType<()> { match PLUGINS.read().unwrap().get(id) { Some(plugin) => { - let ret = (plugin.fn_call)(method.as_ptr() as _, event.as_ptr(), event.len()); + let ret = (plugin.fn_call)(method.as_ptr() as _, event.as_ptr() as _, event.len()); if ret.is_null() { Ok(()) } else { let (code, msg) = get_code_msg_from_ret(ret); unsafe { - libc::free(ret); + libc::free(ret as _); } bail!( "Failed to handle plugin event, id: {}, method: {}, code: {}, msg: {}", @@ -213,7 +213,7 @@ pub fn handle_client_event(id: &str, event: &[u8]) -> Option { Some(plugin) => { let ret = (plugin.fn_call)( METHOD_HANDLE_PEER.as_ptr() as _, - event.as_ptr(), + event.as_ptr() as _, event.len(), ); if ret.is_null() { @@ -221,13 +221,10 @@ pub fn handle_client_event(id: &str, event: &[u8]) -> Option { } else { let (code, msg) = get_code_msg_from_ret(ret); unsafe { - libc::free(ret); + libc::free(ret as _); } if code > ERR_RUSTDESK_HANDLE_BASE && code < ERR_PLUGIN_HANDLE_BASE { - let name = match PLUGINS.read().unwrap().get(id) { - Some(plugin) => plugin.desc.as_ref().unwrap().name(), - None => "", - }; + let name = plugin.desc.as_ref().unwrap().name(); match code { ERR_CALL_NOT_SUPPORTED_METHOD => Some(make_plugin_response( id, diff --git a/src/server/connection.rs b/src/server/connection.rs index f2550d5e1..44e995a3a 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1813,7 +1813,7 @@ impl Connection { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] Some(misc::Union::PluginRequest(p)) => { - if let Some(msg) = create::plugin::handle_client_event(&p.id, &p.content) { + if let Some(msg) = crate::plugin::handle_client_event(&p.id, &p.content) { self.send(msg).await; } } diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 191d71448..b28f29c4c 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -246,9 +246,9 @@ impl Session { #[cfg(all(feature = "flutter", feature = "plugin_framework"))] #[cfg(not(any(target_os = "android", target_os = "ios")))] - pub fn send_plugin(&self, plugin: Plugin) { + pub fn send_plugin_request(&self, request: PluginRequest) { let mut misc = Misc::new(); - misc.set_plugin(plugin); + misc.set_plugin_request(request); let mut msg_out = Message::new(); msg_out.set_misc(misc); self.send(Data::Message(msg_out));