From 4e8c53bd20e96e2cca38c951ecb2931f9b3cd0fd Mon Sep 17 00:00:00 2001 From: caojiawen Date: Sat, 8 Oct 2022 09:35:10 +0800 Subject: [PATCH] update rust demo --- examples/rust/Cargo.lock | 94 ------ examples/rust/Cargo.toml | 4 +- examples/rust/src/finclip.rs | 266 +--------------- examples/rust/src/main.rs | 585 ++++++++--------------------------- 4 files changed, 137 insertions(+), 812 deletions(-) diff --git a/examples/rust/Cargo.lock b/examples/rust/Cargo.lock index b2ac039..ca1bd7d 100644 --- a/examples/rust/Cargo.lock +++ b/examples/rust/Cargo.lock @@ -8,98 +8,12 @@ version = "1.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb07d2053ccdbe10e2af2995a2f116c1330396493dc1269f6a91d0ae82e19704" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cmake" -version = "0.1.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a" -dependencies = [ - "cc", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c02a4d71819009c192cf4872265391563fd6a84c81ff2c0f2a7026ca4c1d85c" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82ee10ce34d7bc12c2122495e7593a9c41347ecdd64185af4ecf72cb1a7f83" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "fltk" -version = "1.3.10" -source = "git+https://github.com/fltk-rs/fltk-rs#975159ca7d4a87a8f4eca3ff23f1f2c5cdd5ab76" -dependencies = [ - "bitflags", - "crossbeam-channel", - "fltk-sys", - "lazy_static", - "paste", - "ttf-parser", -] - -[[package]] -name = "fltk-sys" -version = "1.3.10" -source = "git+https://github.com/fltk-rs/fltk-rs#975159ca7d4a87a8f4eca3ff23f1f2c5cdd5ab76" -dependencies = [ - "cmake", -] - [[package]] name = "itoa" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "once_cell" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225" - -[[package]] -name = "paste" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" - [[package]] name = "proc-macro2" version = "1.0.40" @@ -123,8 +37,6 @@ name = "rustdemo" version = "0.1.0" dependencies = [ "anyhow", - "fltk", - "fltk-sys", "serde", "serde_derive", "serde_json", @@ -178,12 +90,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "ttf-parser" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" - [[package]] name = "unicode-ident" version = "1.0.1" diff --git a/examples/rust/Cargo.toml b/examples/rust/Cargo.toml index 9104352..35ae24e 100644 --- a/examples/rust/Cargo.toml +++ b/examples/rust/Cargo.toml @@ -9,6 +9,4 @@ edition = "2021" anyhow = "1.0" serde = { version = "1.0.80", features = ["derive"] } serde_derive = "^1.0.59" -serde_json = "1.0.0" -fltk = { version = "^1.3", git = "https://github.com/fltk-rs/fltk-rs" } -fltk-sys = { version = "^1.3", git = "https://github.com/fltk-rs/fltk-rs" } \ No newline at end of file +serde_json = "1.0.0" \ No newline at end of file diff --git a/examples/rust/src/finclip.rs b/examples/rust/src/finclip.rs index 3584aef..b255608 100644 --- a/examples/rust/src/finclip.rs +++ b/examples/rust/src/finclip.rs @@ -1,9 +1,4 @@ -use std::{ - collections::HashMap, - ffi::{CString, NulError}, - fmt::{self, Display}, - os::raw::{c_char, c_int, c_void}, -}; +use std::os::raw::{c_char, c_int, c_void}; #[repr(C)] pub struct IPackerFactory; @@ -117,264 +112,13 @@ extern "C" { callback_id: c_int, result: *mut c_void, ) -> c_int; + + #[allow(dead_code)] + pub fn finclip_is_applet_open(appid: *const c_char) -> bool; } -fn str_to_cstr(k: &str) -> Result { - let v = CString::new(k.as_bytes())?; - Ok(v) -} - +#[allow(dead_code)] pub enum FinClipApiType { Applet = 0, WebView = 1, } - -#[derive(Debug)] -pub struct AppParams { - pub appstore: String, - pub appkey: String, - pub secret: String, - pub domain: String, - pub appid: String, - pub exe_path: String, - pub show_loading: String, - pub params: HashMap, -} - -impl Display for AppParams { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "({}, {}, {}, {}, {}, {}, {})", - self.appstore, - self.appid, - self.appkey, - self.secret, - self.domain, - self.show_loading, - self.exe_path - ) - } -} - -pub mod wrapper { - use super::*; - - #[allow(dead_code)] - pub fn get_packer_factory() -> *mut IPackerFactory { - unsafe { finclip_get_packer_factory() } - } - - #[allow(dead_code)] - pub fn packer_factory_get_config_packer(factory: *mut IPackerFactory) -> *mut IFinConfigPacker { - unsafe { finclip_packer_factory_get_config_packer(factory) } - } - - #[allow(dead_code)] - pub fn initialize(configpacker: *mut IFinConfigPacker) -> c_int { - unsafe { finclip_initialize(configpacker) } - } - - #[allow(dead_code)] - pub fn create_params() -> *mut FinclipParams { - unsafe { finclip_create_params() } - } - - #[allow(dead_code)] - pub fn destory_params(params: *mut FinclipParams) { - unsafe { finclip_destory_params(params) } - } - - #[allow(dead_code)] - pub fn params_set(params: *mut FinclipParams, key: &str, value: &str) -> Result<(), NulError> { - unsafe { - finclip_params_set( - params, - str_to_cstr(key)?.as_ptr(), - str_to_cstr(value)?.as_ptr(), - ); - Ok(()) - } - } - - #[allow(dead_code)] - pub fn params_del(params: *mut FinclipParams, key: &str) -> Result<(), NulError> { - unsafe { - finclip_params_del(params, str_to_cstr(key)?.as_ptr()); - Ok(()) - } - } - - #[allow(dead_code)] - pub fn config_packer_add_config( - packer: *mut IFinConfigPacker, - config: *mut FinclipParams, - ) -> c_int { - unsafe { finclip_config_packer_add_config(packer, config) } - } - - #[allow(dead_code)] - pub fn config_packer_new_config(packer: *mut IFinConfigPacker) -> *mut FinclipParams { - unsafe { finclip_config_packer_new_config(packer) } - } - - #[allow(dead_code)] - pub fn config_packer_get_config( - packer: *mut IFinConfigPacker, - appstore: &str, - ) -> Result<*mut FinclipParams, NulError> { - unsafe { - let ret = finclip_config_packer_get_config(packer, str_to_cstr(appstore)?.as_ptr()); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn set_position( - appid: &str, - left: c_int, - top: c_int, - width: c_int, - height: c_int, - ) -> Result<(), NulError> { - unsafe { - finclip_set_position(str_to_cstr(appid)?.as_ptr(), left, top, width, height); - Ok(()) - } - } - - #[allow(dead_code)] - pub fn start_applet(appstore: &str, appid: &str) -> Result { - unsafe { - let ret = finclip_start_applet( - str_to_cstr(appstore)?.as_ptr(), - str_to_cstr(appid)?.as_ptr(), - ); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn register_api( - packer: *mut IFinConfigPacker, - typ: FinClipApiType, - apis: &str, - handle: ApiHandler, - input: *mut c_void, - ) -> Result<(), NulError> { - unsafe { - finclip_register_api( - packer, - typ as c_int, - str_to_cstr(apis)?.as_ptr(), - handle, - input, - ); - Ok(()) - } - } - - #[allow(dead_code)] - pub fn invoke_api( - typ: FinClipApiType, - app_id: &str, - api_name: &str, - params: &str, - callback: ApiCallback, - input: *mut c_void, - ) -> Result { - unsafe { - let ret = finclip_invoke_api( - typ as c_int, - str_to_cstr(app_id)?.as_ptr(), - str_to_cstr(api_name)?.as_ptr(), - str_to_cstr(params)?.as_ptr(), - callback, - input, - ); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn close_applet(appid: &str) -> Result { - unsafe { - let ret = finclip_close_applet(str_to_cstr(appid)?.as_ptr()); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn close_all_applet() -> c_int { - unsafe { finclip_close_all_applet() } - } - - #[allow(dead_code)] - pub fn applet_set_params(params: *mut FinclipParams, from: &AppParams) -> Result<(), NulError> { - for k in &from.params { - params_set(params, k.0.as_str(), k.1.as_str())?; - } - params_set(params, "appstore", from.appstore.as_str())?; - params_set(params, "appkey", from.appkey.as_str())?; - params_set(params, "secret", from.secret.as_str())?; - params_set(params, "domain", from.domain.as_str())?; - params_set(params, "app_id", from.appid.as_str())?; - if !from.exe_path.is_empty() { - params_set(params, "exe_path", from.exe_path.as_str())?; - } - params_set(params, "show_loading", from.show_loading.as_str())?; - Ok(()) - } - - #[allow(dead_code)] - pub fn batch_app_info( - appid: &str, - req_list: &str, - callback: ApiCallback, - input: *mut c_void, - ) -> Result { - unsafe { - let ret = finclip_batch_app_info( - str_to_cstr(appid)?.as_ptr(), - str_to_cstr(req_list)?.as_ptr(), - callback, - input, - ); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn search_app( - appid: &str, - search_text: &str, - callback: ApiCallback, - input: *mut c_void, - ) -> Result { - unsafe { - let ret = finclip_search_app( - str_to_cstr(appid)?.as_ptr(), - str_to_cstr(search_text)?.as_ptr(), - callback, - input, - ); - Ok(ret) - } - } - - #[allow(dead_code)] - pub fn callback_res( - appid: &str, - callback_id: c_int, - result: *mut FinclipParams, - ) -> Result { - unsafe { - let ret = finclip_callback_res( - str_to_cstr(appid)?.as_ptr(), - callback_id, - result as *mut c_void, - ); - Ok(ret) - } - } -} diff --git a/examples/rust/src/main.rs b/examples/rust/src/main.rs index 56d255a..e6f31d6 100644 --- a/examples/rust/src/main.rs +++ b/examples/rust/src/main.rs @@ -6,482 +6,159 @@ mod finclip; use anyhow::Result; use finclip::*; -use finclip::FinClipApiType; -use fltk::dialog; -use fltk::enums::{Align, Event}; -use fltk::window::Window; -use fltk::{app, button::Button, frame::Frame, prelude::*, text::*}; -use serde_json::{json, Value}; use std::collections::HashMap; -use std::ffi::CStr; -use std::fs; +use std::ffi::{CStr, CString, NulError}; +use std::fmt::{Display, self}; use std::os::raw::{c_char, c_void}; -use std::sync::{Arc, Mutex}; +use std::thread; +use std::time::Duration; -extern "C" fn web_api_callback(res: *const c_char, input: *mut c_void) { +pub fn str_to_cstr(k: &str) -> Result { + let v = CString::new(k.as_bytes())?; + Ok(v) +} + +#[derive(Debug)] +pub struct AppParams { + pub appstore: String, + pub appkey: String, + pub secret: String, + pub domain: String, + pub appid: String, + pub exe_path: String, + pub show_loading: String, + pub params: HashMap, +} + +impl Display for AppParams { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "AppParams({}, {}, {}, {}, {}, {}, {})", + self.appstore, + self.appid, + self.appkey, + self.secret, + self.domain, + self.show_loading, + self.exe_path + ) + } +} + +extern "C" fn web_api_handler( + res: *const c_char, + _res: *const c_char, + input: *mut c_void, + _input: *mut c_void, +) { unsafe { let appid = { - let data = &*(input as *mut Arc>); - let mut d = data.lock().unwrap(); - d.btn_call.set_label("调用自定义api成功"); - d.appid.buffer().unwrap().text() + let data = &*(input as *mut AppParams); + data.appid.clone() }; println!( ">> web_api_callback {} {}", CStr::from_ptr(res).to_str().unwrap(), appid, ); + //finclip_callback_res(appid, callback_id, result); } } -extern "C" fn openapi_search( - event: *const c_char, - param: *const c_char, - input: *mut c_void, - _res: *mut c_void, -) { +fn start_normal(cfg: &AppParams) -> Result<()> { unsafe { - let data = &*(input as *mut Arc>); - let appid = { - let d = &mut data.lock().unwrap(); - d.appid.buffer().unwrap().text() - }; - wrapper::batch_app_info(&appid, - "62f5c1e08f13e800017fa823,62f47da680b7ba0001de5701,62f47ce980b7ba0001de56fc,62f479dc80b7ba0001de56f8,62f625408f13e800017fa873", - batch_app_info_callback, input).unwrap(); - println!( - ">> openapi_search {} {} {}", - CStr::from_ptr(event).to_str().unwrap(), - CStr::from_ptr(param).to_str().unwrap(), - appid, + let factory = finclip_get_packer_factory(); + let packer = finclip_packer_factory_get_config_packer(factory); + println!("get config packer."); + let cfg_ptr = &cfg as *const _ as *mut c_void; + finclip_register_api( + packer, + FinClipApiType::Applet as i32, + str_to_cstr("openapi_search")?.as_ptr(), + web_api_handler, + cfg_ptr, ); - } -} - -extern "C" fn mock_login( - event: *const c_char, - param: *const c_char, - input: *mut c_void, - _res: *mut c_void, -) { - unsafe { - let data = &*(input as *mut Arc>); - println!( - ">> app_api_example {} {} {}", - CStr::from_ptr(event).to_str().unwrap(), - CStr::from_ptr(param).to_str().unwrap(), - data.lock().unwrap().appid.buffer().unwrap().text(), - ); - } -} - -extern "C" fn navigate_to_mini_program( - event: *const c_char, - param: *const c_char, - input: *mut c_void, - _res: *mut c_void, -) { - unsafe { - let data = &*(input as *mut Arc>); - println!( - ">> app_api_example {} {} {}", - CStr::from_ptr(event).to_str().unwrap(), - CStr::from_ptr(param).to_str().unwrap(), - data.lock().unwrap().appid.buffer().unwrap().text(), - ); - } -} - -extern "C" fn get_domain( - event: *const c_char, - param: *const c_char, - input: *mut c_void, - _res: *mut c_void, -) { - unsafe { - let data = &*(input as *mut Arc>); - println!( - ">> app_api_example {} {} {}", - CStr::from_ptr(event).to_str().unwrap(), - CStr::from_ptr(param).to_str().unwrap(), - data.lock().unwrap().appid.buffer().unwrap().text(), - ); - } -} - -extern "C" fn batch_app_info_callback(res: *const c_char, input: *mut c_void) { - unsafe { - let data = &*(input as *mut Arc>); - let appid = - data.lock().unwrap().appid.buffer().unwrap().text(); - - println!( - ">> batch_app_info_callback {}", - CStr::from_ptr(res).to_str().unwrap() - ); - let result = wrapper::create_params(); - wrapper::params_set(result, "data", CStr::from_ptr(res).to_str().unwrap()).unwrap(); - //wrapper::callback_res(&appid, 0, result).unwrap(); //TODO: - wrapper::destory_params(result); - } -} - -extern "C" fn search_app_callback(res: *const c_char, _input: *mut c_void) { - unsafe { - println!( - ">> search app {}", - CStr::from_ptr(res).to_str().unwrap() - ); - } -} - -fn start_normal(win_elems: Arc>, cfg: &finclip::AppParams) -> Result<()> { - let factory = wrapper::get_packer_factory(); - let packer = wrapper::packer_factory_get_config_packer(factory); - println!("get config packer."); - let cfg_ptr = &win_elems as *const _ as *mut c_void; - wrapper::register_api( - packer, - FinClipApiType::Applet, - "openapi_search", - openapi_search, - cfg_ptr, - )?; - wrapper::register_api( - packer, - FinClipApiType::Applet, - "mock_login", - mock_login, - cfg_ptr, - )?; - wrapper::register_api( - packer, - FinClipApiType::Applet, - "navigate_to_mini_program", - navigate_to_mini_program, - cfg_ptr, - )?; - wrapper::register_api( - packer, - FinClipApiType::Applet, - "get_domain", - get_domain, - cfg_ptr, - )?; - let res = wrapper::initialize(packer); - println!("initialize packer. result: {}", res); - let config = wrapper::create_params(); - println!("create params."); - wrapper::applet_set_params(config, cfg)?; - println!("set params finished."); - let res = wrapper::config_packer_add_config(packer, config); - println!("add config. result: {}", res); - let res = wrapper::start_applet(cfg.appstore.as_str(), cfg.appid.as_str())?; - println!("start applet. result: {}", res); - Ok(()) -} - -fn close_all_applet() { - wrapper::close_all_applet(); -} - -fn call_api(win_elems: Arc>, appid: String) -> Result<()> { - let cfg_ptr = &win_elems as *const _ as *mut c_void; - let res = wrapper::invoke_api( - FinClipApiType::WebView, - appid.as_str(), - "test", - r###"{"hello":"world"}"###, - web_api_callback, - cfg_ptr, - )?; - println!("invoke api. result: {}", res); - Ok(()) -} - -fn set_buffer(buf: Option, v: &Value) -> Option<()> { - buf?.set_text(v.as_str()?); - Some(()) -} - -fn set_buffer_str(buf: Option, txt: &str) -> Option<()> { - buf?.set_text(txt); - Some(()) -} - -fn center(w: i32, h: i32) -> (i32, i32) { - let screens = app::Screen::all_screens(); - for s in screens { - if s.is_valid() { - return ((s.w() - w) / 2, (s.h() - h) / 2); + let res = finclip_initialize(packer); + println!("initialize packer. result: {}", res); + let config = finclip_create_params(); + println!("create params."); + for k in &cfg.params { + finclip_params_set( + config, + str_to_cstr(k.0.as_str())?.as_ptr(), + str_to_cstr(k.1.as_str())?.as_ptr(), + ); } - } - (0, 0) -} - -#[derive(Clone)] -struct WinElem { - wind: Window, - appid: TextEditor, - appkey: TextEditor, - secret: TextEditor, - domain: TextEditor, - exe: TextDisplay, - param: TextEditor, - btn_exe: Button, - btn_start: Button, - btn_close: Button, - btn_call: Button, - btn_batch: Button, - btn_search: Button, -} - -impl WinElem { - fn new() -> Result { - let wind = { - const SIZE: (i32, i32) = (655, 490); - let (x, y) = center(SIZE.0, SIZE.1); - Window::new(x, y, SIZE.0, SIZE.1, "rustdemo") - }; - let mut ret = WinElem { - wind, - appid: TextEditor::new(100, 40, 540, 25, ""), - appkey: TextEditor::new(100, 80, 540, 25, ""), - secret: TextEditor::new(100, 120, 540, 25, ""), - domain: TextEditor::new(100, 160, 540, 25, ""), - exe: TextDisplay::new(100, 200, 435, 25, ""), - param: TextEditor::new(100, 240, 540, 170, ""), - btn_exe: Button::new(540, 200, 100, 25, "设置app路径"), - btn_start: Button::new(100, 420, 130, 25, "启动"), - btn_close: Button::new(255, 420, 130, 25, "关闭所有小程序"), - btn_call: Button::new(400, 420, 130, 25, "调用webview api"), - btn_batch: Button::new(100, 455, 130, 25, "批量获取app"), - btn_search: Button::new(255, 455, 130, 25, "搜索app"), - }; - let align = Align::Left | Align::Inside; - Frame::new(10, 42, 100, 20, "appid").with_align(align); - Frame::new(10, 82, 100, 20, "appkey").with_align(align); - Frame::new(10, 122, 100, 20, "secret").with_align(align); - Frame::new(10, 162, 100, 20, "domain").with_align(align); - Frame::new(10, 202, 100, 20, "可执行文件").with_align(align); - Frame::new(10, 242, 100, 20, "参数").with_align(align); - ret.appid.set_scrollbar_align(Align::Clip); - ret.appid.set_cursor_style(Cursor::Simple); - ret.appkey.set_scrollbar_align(Align::Clip); - ret.secret.set_scrollbar_align(Align::Clip); - ret.domain.set_scrollbar_align(Align::Clip); - ret.exe.set_scrollbar_align(Align::Clip); - ret.param.wrap_mode(WrapMode::AtColumn, 0); - - ret.appid.set_buffer(TextBuffer::default()); - ret.appkey.set_buffer(TextBuffer::default()); - ret.secret.set_buffer(TextBuffer::default()); - ret.domain.set_buffer(TextBuffer::default()); - ret.exe.set_buffer(TextBuffer::default()); - ret.param.set_buffer(TextBuffer::default()); - - ret.btn_start.take_focus()?; - - let cb = move |t: &mut TextEditor, ev| match ev { - Event::Leave => { - t.buffer().unwrap().unselect(); - true - } - Event::Enter => { - t.buffer().unwrap().select(0, t.buffer().unwrap().length()); - t.take_focus().unwrap(); - true - } - _ => false, - }; - ret.appid.handle(cb); - ret.appkey.handle(cb); - ret.secret.handle(cb); - ret.domain.handle(cb); - ret.param.handle(move |t: &mut TextEditor, ev| match ev { - Event::Leave => { - t.buffer().unwrap().unselect(); - true - } - Event::Enter => { - t.take_focus().unwrap(); - true - } - _ => false, - }); - ret.exe.handle(move |t, ev| match ev { - Event::Unfocus => { - t.buffer().unwrap().unselect(); - true - } - _ => false, - }); - - ret.wind.end(); - ret.wind.show(); - Ok(ret) - } - - fn init(this: Arc>) -> Result<()> { - let elems = &mut this.lock().unwrap(); - elems.btn_start.set_callback({ - let data = this.clone(); - move |_| { - let (appid, appkey, secret, domain, exe, param) = { - let d = &mut data.lock().unwrap(); - ( - d.appid.buffer(), - d.appkey.buffer(), - d.secret.buffer(), - d.domain.buffer(), - d.exe.buffer(), - d.param.buffer(), - ) - }; - let text = param.unwrap().text(); - let mut params: Value = - serde_json::from_str(text.as_str()).unwrap_or_else(|_| json!({})); - if !params.is_object() { - params = json!({}); - } - let mut param_map = HashMap::new(); - for (k, v) in params.as_object().unwrap() { - if v.is_string() { - param_map.insert(k.clone(), v.as_str().unwrap().to_string()); - } - } - start_normal( - data.clone(), - &finclip::AppParams { - appstore: String::from("1"), - appid: appid.unwrap().text(), - appkey: appkey.unwrap().text(), - secret: secret.unwrap().text(), - domain: domain.unwrap().text(), - exe_path: exe.unwrap().text(), - show_loading: "0".to_string(), - params: param_map, - }, - ) - .unwrap(); - } - }); - - elems.btn_close.set_callback(move |_| close_all_applet()); - - elems.btn_call.set_callback({ - let data = this.clone(); - move |_| { - let txt = { - let d = &mut data.lock().unwrap(); - d.appid.buffer().unwrap().text() - }; - call_api(data.clone(), txt).unwrap(); - } - }); - - elems.btn_exe.set_callback({ - let data = this.clone(); - move |_| { - let (x, y, buffer) = { - let d = &mut data.lock().unwrap(); - (d.wind.x(), d.wind.y(), d.exe.buffer()) - }; - let mut chooser = dialog::FileChooser::new( - ".", - "*", - dialog::FileChooserType::Single | dialog::FileChooserType::Directory, - "设置app路径", - ); - chooser.show(); - chooser.window().set_pos(x + 75, y + 50); - while chooser.shown() { - app::wait(); - } - if chooser.value(1).is_none() { - return; - } - set_buffer_str(buffer, &chooser.value(1).unwrap()); - } - }); - - elems.btn_batch.set_callback({ - let data = this.clone(); - move |_| { - let appid = { - let d = &mut data.lock().unwrap(); - d.appid.buffer().unwrap().text() - }; - let cfg_ptr = &data as *const _ as *mut c_void; - let res = wrapper::batch_app_info( - appid.as_str(), - "62f5c1e08f13e800017fa823,62f47da680b7ba0001de5701,62f47ce980b7ba0001de56fc,62f479dc80b7ba0001de56f8,62f625408f13e800017fa873", - batch_app_info_callback, - cfg_ptr, - ) - .unwrap(); - println!("batch app info. result: {}", res); - } - }); - - elems.btn_search.set_callback({ - let data = this.clone(); - move |_| { - let appid = { - let d = &mut data.lock().unwrap(); - d.appid.buffer().unwrap().text() - }; - let cfg_ptr = &data as *const _ as *mut c_void; - let res = wrapper::search_app( - appid.as_str(), - "实例", - search_app_callback, - cfg_ptr, - ) - .unwrap(); - println!("search app. result: {}", res); - } - }); - - elems.load_config()?; - Ok(()) - } - - fn load_config(&mut self) -> Result<()> { - let content = fs::read_to_string("./config.json").unwrap_or_else(|_| "".to_string()); - if content.len() > 0 { - let a: Value = serde_json::from_str(content.as_str()).unwrap_or_else(|_| json!({})); - set_buffer(self.appid.buffer(), &a["app_id"]); - set_buffer(self.appkey.buffer(), &a["appkey"]); - set_buffer(self.secret.buffer(), &a["secret"]); - set_buffer(self.domain.buffer(), &a["domain"]); - set_buffer(self.exe.buffer(), &a["exe_path"]); - set_buffer(self.param.buffer(), &a["params"]); + finclip_params_set( + config, + str_to_cstr("appstore")?.as_ptr(), + str_to_cstr(cfg.appstore.as_str())?.as_ptr(), + ); + finclip_params_set( + config, + str_to_cstr("appkey")?.as_ptr(), + str_to_cstr(cfg.appkey.as_str())?.as_ptr(), + ); + finclip_params_set( + config, + str_to_cstr("secret")?.as_ptr(), + str_to_cstr(cfg.secret.as_str())?.as_ptr(), + ); + finclip_params_set( + config, + str_to_cstr("domain")?.as_ptr(), + str_to_cstr(cfg.domain.as_str())?.as_ptr(), + ); + finclip_params_set( + config, + str_to_cstr("app_id")?.as_ptr(), + str_to_cstr(cfg.appid.as_str())?.as_ptr(), + ); + if !cfg.exe_path.is_empty() { + finclip_params_set( + config, + str_to_cstr("exe_path")?.as_ptr(), + str_to_cstr(cfg.exe_path.as_str())?.as_ptr(), + ); } - Ok(()) - } - - fn save_config(&self) -> Result<()> { - let v = json!({ - "appstore": "1", - "appkey": self.appkey.buffer().unwrap().text(), - "secret": self.secret.buffer().unwrap().text(), - "domain": self.domain.buffer().unwrap().text(), - "app_id": self.appid.buffer().unwrap().text(), - "exe_path": self.exe.buffer().unwrap().text(), - "params": self.param.buffer().unwrap().text(), - }); - let s = serde_json::to_string(&v)?; - fs::write("./config.json", s)?; + finclip_params_set( + config, + str_to_cstr("show_loading")?.as_ptr(), + str_to_cstr(cfg.show_loading.as_str())?.as_ptr(), + ); + println!("set params finished."); + let res = finclip_config_packer_add_config(packer, config); + println!("add config. result: {}", res); + let res = finclip_start_applet( + str_to_cstr(cfg.appstore.as_str())?.as_ptr(), + str_to_cstr(cfg.appid.as_str())?.as_ptr(), + ); + println!("start applet. result: {}", res); Ok(()) } } fn main() -> Result<()> { - let app = app::App::default(); - let elems_arc = Arc::new(Mutex::new(WinElem::new()?)); - WinElem::init(elems_arc.clone())?; - app.run()?; - elems_arc.lock().unwrap().save_config()?; + let appid = "6152b5dbfcfb4e0001448e6e"; + start_normal(&AppParams { + appstore: "1".to_string(), + appkey: "22LyZEib0gLTQdU3MUauAfJ/xujwNfM6OvvEqQyH4igA".to_string(), + secret: "703b9026be3d6bc5".to_string(), + domain: "https://finclip-testing.finogeeks.club".to_string(), + appid: appid.to_string(), + exe_path: "/Users/sylar/Projects/finclipsdk-desktop/build/core/Debug/FinClip.app" + .to_string(), + show_loading: "0".to_string(), + params: HashMap::new(), + })?; + loop { + thread::sleep(Duration::from_secs(1)); + unsafe { + if !finclip_is_applet_open(str_to_cstr(appid)?.as_ptr()) { + break; + } + } + } Ok(()) }