mirror of
https://github.com/AkiChase/scrcpy-mask
synced 2025-04-21 04:25:13 +08:00
style(main.rs): command
This commit is contained in:
parent
b67aa3b5be
commit
ebaa8eadaa
169
src-tauri/src/command.rs
Normal file
169
src-tauri/src/command.rs
Normal file
@ -0,0 +1,169 @@
|
||||
use crate::{
|
||||
adb::{Adb, Device},
|
||||
client::ScrcpyClient,
|
||||
resource::{ResHelper, ResourceName},
|
||||
share,
|
||||
socket::connect_socket,
|
||||
};
|
||||
|
||||
use std::{fs::read_to_string, sync::Arc};
|
||||
use tauri::{Emitter, Listener, Manager};
|
||||
use tauri_plugin_store::StoreExt;
|
||||
|
||||
// TODO move to command.rs
|
||||
#[tauri::command]
|
||||
/// get devices info list
|
||||
pub fn adb_devices() -> Result<Vec<Device>, String> {
|
||||
match Adb::cmd_devices() {
|
||||
Ok(devices) => Ok(devices),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// forward local port to the device port
|
||||
pub fn forward_server_port(id: String, scid: String, port: u16) -> Result<(), String> {
|
||||
match ScrcpyClient::forward_server_port(&id, &scid, port) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// push scrcpy-server file to the device
|
||||
pub fn push_server_file(id: String, app: tauri::AppHandle) -> Result<(), String> {
|
||||
let dir = app.path().resource_dir().unwrap().join("resource");
|
||||
match ScrcpyClient::push_server_file(&dir, &id) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
// TODO fix: device connect timeout
|
||||
#[tauri::command]
|
||||
/// start scrcpy server and connect to it
|
||||
pub fn start_scrcpy_server(
|
||||
id: String,
|
||||
scid: String,
|
||||
address: String,
|
||||
app: tauri::AppHandle,
|
||||
) -> Result<(), String> {
|
||||
let mut client_info = share::CLIENT_INFO.lock().unwrap();
|
||||
if let Some(_) = &*client_info {
|
||||
return Err("client already exists".to_string());
|
||||
}
|
||||
|
||||
*client_info = Some(share::ClientInfo::new(
|
||||
"unknow".to_string(),
|
||||
id.clone(),
|
||||
scid.clone(),
|
||||
));
|
||||
|
||||
let version = ScrcpyClient::get_scrcpy_version();
|
||||
|
||||
// start scrcpy server
|
||||
tokio::spawn(async move {
|
||||
ScrcpyClient::shell_start_server(&id, &scid, &version).unwrap();
|
||||
});
|
||||
|
||||
// connect to scrcpy server
|
||||
tokio::spawn(async move {
|
||||
// wait 1 second for scrcpy-server to start
|
||||
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
|
||||
|
||||
let app = Arc::new(app);
|
||||
|
||||
// create channel to transmit device reply to front
|
||||
let share_app = app.clone();
|
||||
let (device_reply_sender, mut device_reply_receiver) =
|
||||
tokio::sync::mpsc::channel::<String>(16);
|
||||
println!("device reply channel created");
|
||||
tokio::spawn(async move {
|
||||
while let Some(reply) = device_reply_receiver.recv().await {
|
||||
share_app.emit("device-reply", reply).unwrap();
|
||||
}
|
||||
println!("device reply channel closed");
|
||||
});
|
||||
|
||||
// create channel to transmit front msg to TcpStream handler
|
||||
let (front_msg_sender, front_msg_receiver) = tokio::sync::mpsc::channel::<String>(16);
|
||||
let share_app = app.clone();
|
||||
let listen_handler = share_app.listen("front-command", move |event| {
|
||||
let sender = front_msg_sender.clone();
|
||||
// println!("收到front-command: {}", event.payload());
|
||||
tokio::spawn(async move {
|
||||
if let Err(_) = sender.send(event.payload().into()).await {
|
||||
println!("front-command forwarding failure, please restart the program !");
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// connect
|
||||
let share_app = app.clone();
|
||||
tokio::spawn(connect_socket(
|
||||
address,
|
||||
front_msg_receiver,
|
||||
device_reply_sender,
|
||||
listen_handler,
|
||||
share_app,
|
||||
));
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn get_cur_client_info() -> Result<Option<share::ClientInfo>, String> {
|
||||
let client_info = share::CLIENT_INFO.lock().unwrap();
|
||||
match &*client_info {
|
||||
Some(client) => Ok(Some(client.clone())),
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// get device screen size
|
||||
pub fn get_device_screen_size(id: String) -> Result<(u32, u32), String> {
|
||||
match ScrcpyClient::get_device_screen_size(&id) {
|
||||
Ok(size) => Ok(size),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// connect to wireless device
|
||||
pub fn adb_connect(address: String) -> Result<String, String> {
|
||||
match Adb::cmd_connect(&address) {
|
||||
Ok(res) => Ok(res),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// load default key mapping config file
|
||||
pub fn load_default_keyconfig(app: tauri::AppHandle) -> Result<String, String> {
|
||||
let dir = app.path().resource_dir().unwrap().join("resource");
|
||||
let file = ResHelper::get_file_path(&dir, ResourceName::DefaultKeyConfig);
|
||||
match read_to_string(file) {
|
||||
Ok(content) => Ok(content),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn check_adb_available() -> Result<(), String> {
|
||||
match Adb::cmd_base().output() {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn set_adb_path(adb_path: String, app: tauri::AppHandle) -> Result<(), String> {
|
||||
let store = app
|
||||
.store("store.bin")
|
||||
.map_err(|_| "failed to load store".to_string())?;
|
||||
store.set("adbPath", adb_path.clone());
|
||||
*share::ADB_PATH.lock().unwrap() = adb_path;
|
||||
Ok(())
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
pub mod adb;
|
||||
pub mod binary;
|
||||
pub mod client;
|
||||
pub mod command;
|
||||
pub mod control_msg;
|
||||
pub mod resource;
|
||||
pub mod scrcpy_mask_cmd;
|
||||
|
@ -1,176 +1,10 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
use scrcpy_mask::{
|
||||
adb::{Adb, Device},
|
||||
client::ScrcpyClient,
|
||||
resource::{ResHelper, ResourceName},
|
||||
share,
|
||||
socket::connect_socket,
|
||||
};
|
||||
use std::{fs::read_to_string, sync::Arc};
|
||||
use tauri::{Emitter, Listener, Manager};
|
||||
use scrcpy_mask::{command, resource::ResHelper, share};
|
||||
use tauri::Manager;
|
||||
use tauri_plugin_store::StoreExt;
|
||||
|
||||
|
||||
// TODO move to command.rs
|
||||
#[tauri::command]
|
||||
/// get devices info list
|
||||
fn adb_devices() -> Result<Vec<Device>, String> {
|
||||
match Adb::cmd_devices() {
|
||||
Ok(devices) => Ok(devices),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// forward local port to the device port
|
||||
fn forward_server_port(id: String, scid: String, port: u16) -> Result<(), String> {
|
||||
match ScrcpyClient::forward_server_port(&id, &scid, port) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// push scrcpy-server file to the device
|
||||
fn push_server_file(id: String, app: tauri::AppHandle) -> Result<(), String> {
|
||||
let dir = app.path().resource_dir().unwrap().join("resource");
|
||||
match ScrcpyClient::push_server_file(&dir, &id) {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// TODO fix: device connect timeout
|
||||
#[tauri::command]
|
||||
/// start scrcpy server and connect to it
|
||||
fn start_scrcpy_server(
|
||||
id: String,
|
||||
scid: String,
|
||||
address: String,
|
||||
app: tauri::AppHandle,
|
||||
) -> Result<(), String> {
|
||||
let mut client_info = share::CLIENT_INFO.lock().unwrap();
|
||||
if let Some(_) = &*client_info {
|
||||
return Err("client already exists".to_string());
|
||||
}
|
||||
|
||||
*client_info = Some(share::ClientInfo::new(
|
||||
"unknow".to_string(),
|
||||
id.clone(),
|
||||
scid.clone(),
|
||||
));
|
||||
|
||||
let version = ScrcpyClient::get_scrcpy_version();
|
||||
|
||||
// start scrcpy server
|
||||
tokio::spawn(async move {
|
||||
ScrcpyClient::shell_start_server(&id, &scid, &version).unwrap();
|
||||
});
|
||||
|
||||
// connect to scrcpy server
|
||||
tokio::spawn(async move {
|
||||
// wait 1 second for scrcpy-server to start
|
||||
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
|
||||
|
||||
let app = Arc::new(app);
|
||||
|
||||
// create channel to transmit device reply to front
|
||||
let share_app = app.clone();
|
||||
let (device_reply_sender, mut device_reply_receiver) =
|
||||
tokio::sync::mpsc::channel::<String>(16);
|
||||
println!("device reply channel created");
|
||||
tokio::spawn(async move {
|
||||
while let Some(reply) = device_reply_receiver.recv().await {
|
||||
share_app.emit("device-reply", reply).unwrap();
|
||||
}
|
||||
println!("device reply channel closed");
|
||||
});
|
||||
|
||||
// create channel to transmit front msg to TcpStream handler
|
||||
let (front_msg_sender, front_msg_receiver) = tokio::sync::mpsc::channel::<String>(16);
|
||||
let share_app = app.clone();
|
||||
let listen_handler = share_app.listen("front-command", move |event| {
|
||||
let sender = front_msg_sender.clone();
|
||||
// println!("收到front-command: {}", event.payload());
|
||||
tokio::spawn(async move {
|
||||
if let Err(_) = sender.send(event.payload().into()).await {
|
||||
println!("front-command forwarding failure, please restart the program !");
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
// connect
|
||||
let share_app = app.clone();
|
||||
tokio::spawn(connect_socket(
|
||||
address,
|
||||
front_msg_receiver,
|
||||
device_reply_sender,
|
||||
listen_handler,
|
||||
share_app,
|
||||
));
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn get_cur_client_info() -> Result<Option<share::ClientInfo>, String> {
|
||||
let client_info = share::CLIENT_INFO.lock().unwrap();
|
||||
match &*client_info {
|
||||
Some(client) => Ok(Some(client.clone())),
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// get device screen size
|
||||
fn get_device_screen_size(id: String) -> Result<(u32, u32), String> {
|
||||
match ScrcpyClient::get_device_screen_size(&id) {
|
||||
Ok(size) => Ok(size),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// connect to wireless device
|
||||
fn adb_connect(address: String) -> Result<String, String> {
|
||||
match Adb::cmd_connect(&address) {
|
||||
Ok(res) => Ok(res),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
/// load default key mapping config file
|
||||
fn load_default_keyconfig(app: tauri::AppHandle) -> Result<String, String> {
|
||||
let dir = app.path().resource_dir().unwrap().join("resource");
|
||||
let file = ResHelper::get_file_path(&dir, ResourceName::DefaultKeyConfig);
|
||||
match read_to_string(file) {
|
||||
Ok(content) => Ok(content),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn check_adb_available() -> Result<(), String> {
|
||||
match Adb::cmd_base().output() {
|
||||
Ok(_) => Ok(()),
|
||||
Err(e) => Err(e.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn set_adb_path(adb_path: String, app: tauri::AppHandle) -> Result<(), String> {
|
||||
let store = app
|
||||
.store("store.bin")
|
||||
.map_err(|_| "failed to load store".to_string())?;
|
||||
store.set("adbPath", adb_path.clone());
|
||||
*share::ADB_PATH.lock().unwrap() = adb_path;
|
||||
Ok(())
|
||||
}
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
tauri::Builder::default()
|
||||
@ -247,19 +81,20 @@ async fn main() {
|
||||
.join("resource"),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
adb_devices,
|
||||
forward_server_port,
|
||||
push_server_file,
|
||||
start_scrcpy_server,
|
||||
get_cur_client_info,
|
||||
get_device_screen_size,
|
||||
adb_connect,
|
||||
load_default_keyconfig,
|
||||
check_adb_available,
|
||||
set_adb_path
|
||||
command::adb_devices,
|
||||
command::forward_server_port,
|
||||
command::push_server_file,
|
||||
command::start_scrcpy_server,
|
||||
command::get_cur_client_info,
|
||||
command::get_device_screen_size,
|
||||
command::adb_connect,
|
||||
command::load_default_keyconfig,
|
||||
command::check_adb_available,
|
||||
command::set_adb_path
|
||||
])
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
|
Loading…
Reference in New Issue
Block a user