update rust demo
parent
daf53fdebc
commit
4e8c53bd20
|
@ -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"
|
||||
|
|
|
@ -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" }
|
||||
serde_json = "1.0.0"
|
|
@ -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<CString, NulError> {
|
||||
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<String, String>,
|
||||
}
|
||||
|
||||
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<c_int, NulError> {
|
||||
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<c_int, NulError> {
|
||||
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<c_int, NulError> {
|
||||
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<c_int, NulError> {
|
||||
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<c_int, NulError> {
|
||||
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<c_int, NulError> {
|
||||
unsafe {
|
||||
let ret = finclip_callback_res(
|
||||
str_to_cstr(appid)?.as_ptr(),
|
||||
callback_id,
|
||||
result as *mut c_void,
|
||||
);
|
||||
Ok(ret)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<CString, NulError> {
|
||||
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<String, String>,
|
||||
}
|
||||
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>);
|
||||
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<Mutex<WinElem>>, 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<Mutex<WinElem>>, 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<TextBuffer>, v: &Value) -> Option<()> {
|
||||
buf?.set_text(v.as_str()?);
|
||||
Some(())
|
||||
}
|
||||
|
||||
fn set_buffer_str(buf: Option<TextBuffer>, 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<WinElem> {
|
||||
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<Mutex<Self>>) -> 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(())
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue