From 7671ed857da5f452d9580659d86db68d7b100e57 Mon Sep 17 00:00:00 2001 From: dignow Date: Wed, 30 Aug 2023 13:49:10 +0800 Subject: [PATCH] ios add dummy call and remove some lookup functions Signed-off-by: dignow --- flutter/ios/Runner/AppDelegate.swift | 5 +-- flutter/ios/Runner/ffi.h | 5 +-- flutter/lib/models/model.dart | 2 +- flutter/lib/models/native_model.dart | 62 ++++------------------------ src/flutter.rs | 35 ++++++---------- src/flutter_ffi.rs | 28 +++++++------ 6 files changed, 39 insertions(+), 98 deletions(-) diff --git a/flutter/ios/Runner/AppDelegate.swift b/flutter/ios/Runner/AppDelegate.swift index 06a9a2695..b1c78e9c8 100644 --- a/flutter/ios/Runner/AppDelegate.swift +++ b/flutter/ios/Runner/AppDelegate.swift @@ -13,9 +13,6 @@ import Flutter } public func dummyMethodToEnforceBundling() { - get_rgba(); - // free_rgba(nil); - // get_by_name("", ""); - // set_by_name("", ""); + session_get_rgba(nil); } } diff --git a/flutter/ios/Runner/ffi.h b/flutter/ios/Runner/ffi.h index 701ec4b09..56b0d6ccc 100644 --- a/flutter/ios/Runner/ffi.h +++ b/flutter/ios/Runner/ffi.h @@ -1,4 +1 @@ -void* get_rgba(); -void free_rgba(void*); -void set_by_name(const char*, const char*); -const char* get_by_name(const char*, const char*); +const unsigned char* session_get_rgba(const char*); diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 4dc17f9c2..105c2b513 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1693,7 +1693,7 @@ class FFI { } else { // Fetch the image buffer from rust codes. final sz = platformFFI.getRgbaSize(sessionId); - if (sz == null || sz == 0) { + if (sz == 0) { return; } final rgba = platformFFI.getRgba(sessionId, sz); diff --git a/flutter/lib/models/native_model.dart b/flutter/lib/models/native_model.dart index d2e11e2c1..80809309a 100644 --- a/flutter/lib/models/native_model.dart +++ b/flutter/lib/models/native_model.dart @@ -21,16 +21,8 @@ class RgbaFrame extends Struct { external Pointer data; } -typedef F2 = Pointer Function(Pointer, Pointer); typedef F3 = Pointer Function(Pointer); -typedef F4 = Uint64 Function(Pointer); -typedef F4Dart = int Function(Pointer); -typedef F5 = Void Function(Pointer); -typedef F5Dart = void Function(Pointer); typedef HandleEvent = Future Function(Map evt); -// pub fn session_register_texture(id: *const char, ptr: usize) -typedef F6 = Void Function(Pointer, Uint64); -typedef F6Dart = void Function(Pointer, int); /// FFI wrapper around the native Rust core. /// Hides the platform differences. @@ -38,7 +30,6 @@ class PlatformFFI { String _dir = ''; // _homeDir is only needed for Android and IOS. String _homeDir = ''; - F2? _translate; final _eventHandlers = >{}; late RustdeskImpl _ffiBind; late String _appType; @@ -51,9 +42,6 @@ class PlatformFFI { RustdeskImpl get ffiBind => _ffiBind; F3? _session_get_rgba; - F4Dart? _session_get_rgba_size; - F5Dart? _session_next_rgba; - F6Dart? _session_register_texture; static get localeName => Platform.localeName; @@ -89,18 +77,8 @@ class PlatformFFI { } } - String translate(String name, String locale) { - if (_translate == null) return name; - var a = name.toNativeUtf8(); - var b = locale.toNativeUtf8(); - var p = _translate!(a, b); - assert(p != nullptr); - final res = p.toDartString(); - calloc.free(p); - calloc.free(a); - calloc.free(b); - return res; - } + String translate(String name, String locale) => + _ffiBind.translate(name: name, locale: locale); Uint8List? getRgba(SessionID sessionId, int bufSize) { if (_session_get_rgba == null) return null; @@ -118,30 +96,11 @@ class PlatformFFI { } } - int? getRgbaSize(SessionID sessionId) { - if (_session_get_rgba_size == null) return null; - final sessionIdStr = sessionId.toString(); - var a = sessionIdStr.toNativeUtf8(); - final bufferSize = _session_get_rgba_size!(a); - malloc.free(a); - return bufferSize; - } - - void nextRgba(SessionID sessionId) { - if (_session_next_rgba == null) return; - final sessionIdStr = sessionId.toString(); - final a = sessionIdStr.toNativeUtf8(); - _session_next_rgba!(a); - malloc.free(a); - } - - void registerTexture(SessionID sessionId, int ptr) { - if (_session_register_texture == null) return; - final sessionIdStr = sessionId.toString(); - final a = sessionIdStr.toNativeUtf8(); - _session_register_texture!(a, ptr); - malloc.free(a); - } + int getRgbaSize(SessionID sessionId) => + _ffiBind.sessionGetRgbaSize(sessionId: sessionId); + void nextRgba(SessionID sessionId) => _ffiBind.sessionNextRgba(sessionId: sessionId); + void registerTexture(SessionID sessionId, int ptr) => + _ffiBind.sessionRegisterTexture(sessionId: sessionId, ptr: ptr); /// Init the FFI class, loads the native Rust core library. Future init(String appType) async { @@ -157,14 +116,7 @@ class PlatformFFI { : DynamicLibrary.process(); debugPrint('initializing FFI $_appType'); try { - _translate = dylib.lookupFunction('translate'); _session_get_rgba = dylib.lookupFunction("session_get_rgba"); - _session_get_rgba_size = - dylib.lookupFunction("session_get_rgba_size"); - _session_next_rgba = - dylib.lookupFunction("session_next_rgba"); - _session_register_texture = - dylib.lookupFunction("session_register_texture"); try { // SYSTEM user failed _dir = (await getApplicationDocumentsDirectory()).path; diff --git a/src/flutter.rs b/src/flutter.rs index 52190ce2e..2c9b7690b 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -1035,24 +1035,24 @@ fn serialize_resolutions(resolutions: &Vec) -> String { } fn char_to_session_id(c: *const char) -> ResultType { + if c.is_null() { + bail!("Session id ptr is null"); + } let cstr = unsafe { std::ffi::CStr::from_ptr(c as _) }; let str = cstr.to_str()?; SessionID::from_str(str).map_err(|e| anyhow!("{:?}", e)) } -#[no_mangle] -pub fn session_get_rgba_size(_session_uuid_str: *const char) -> usize { +pub fn session_get_rgba_size(_session_id: SessionID) -> usize { #[cfg(not(feature = "flutter_texture_render"))] - if let Ok(session_id) = char_to_session_id(_session_uuid_str) { - if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { - return session.rgba.read().unwrap().len(); - } + if let Some(session) = SESSIONS.read().unwrap().get(&_session_id) { + return session.rgba.read().unwrap().len(); } 0 } #[no_mangle] -pub fn session_get_rgba(session_uuid_str: *const char) -> *const u8 { +pub extern "C" fn session_get_rgba(session_uuid_str: *const char) -> *const u8 { if let Ok(session_id) = char_to_session_id(session_uuid_str) { if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { return session.get_rgba(); @@ -1062,23 +1062,17 @@ pub fn session_get_rgba(session_uuid_str: *const char) -> *const u8 { std::ptr::null() } -#[no_mangle] -pub fn session_next_rgba(session_uuid_str: *const char) { - if let Ok(session_id) = char_to_session_id(session_uuid_str) { - if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { - return session.next_rgba(); - } +pub fn session_next_rgba(session_id: SessionID) { + if let Some(session) = SESSIONS.read().unwrap().get(&session_id) { + return session.next_rgba(); } } #[inline] -#[no_mangle] -pub fn session_register_texture(_session_uuid_str: *const char, _ptr: usize) { +pub fn session_register_texture(_session_id: SessionID, _ptr: usize) { #[cfg(feature = "flutter_texture_render")] - if let Ok(session_id) = char_to_session_id(_session_uuid_str) { - if let Some(session) = SESSIONS.write().unwrap().get_mut(&session_id) { - return session.register_texture(_ptr); - } + if let Some(session) = SESSIONS.write().unwrap().get_mut(&_session_id) { + return session.register_texture(_ptr); } } @@ -1130,9 +1124,6 @@ pub fn stop_global_event_stream(app_type: String) { let _ = GLOBAL_EVENT_STREAM.write().unwrap().remove(&app_type); } -#[no_mangle] -unsafe extern "C" fn get_rgba() {} - /// Hooks for session. #[derive(Clone)] pub enum SessionHook { diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index f076b4b23..88ddd6cd5 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1410,18 +1410,6 @@ pub fn main_get_build_date() -> String { crate::BUILD_DATE.to_string() } -#[no_mangle] -unsafe extern "C" fn translate(name: *const c_char, locale: *const c_char) -> *const c_char { - let name = CStr::from_ptr(name); - let locale = CStr::from_ptr(locale); - let res = if let (Ok(name), Ok(locale)) = (name.to_str(), locale.to_str()) { - crate::client::translate_locale(name.to_owned(), locale) - } else { - String::new() - }; - CString::from_vec_unchecked(res.into_bytes()).into_raw() -} - fn handle_query_onlines(onlines: Vec, offlines: Vec) { let data = HashMap::from([ ("name", "callback_query_onlines".to_owned()), @@ -1434,6 +1422,22 @@ fn handle_query_onlines(onlines: Vec, offlines: Vec) { ); } +pub fn translate(name: String, locale: String) -> SyncReturn { + SyncReturn(crate::client::translate_locale(name, &locale)) +} + +pub fn session_get_rgba_size(session_id: SessionID) -> SyncReturn { + SyncReturn(super::flutter::session_get_rgba_size(session_id)) +} + +pub fn session_next_rgba(session_id: SessionID) -> SyncReturn<()> { + SyncReturn(super::flutter::session_next_rgba(session_id)) +} + +pub fn session_register_texture(session_id: SessionID, ptr: usize) -> SyncReturn<()> { + SyncReturn(super::flutter::session_register_texture(session_id, ptr)) +} + pub fn query_onlines(ids: Vec) { #[cfg(not(any(target_os = "ios")))] crate::rendezvous_mediator::query_online_states(ids, handle_query_onlines)