Skip to content

Commit 99f8b3a

Browse files
committed
feat: add web api
1 parent 59118c6 commit 99f8b3a

File tree

13 files changed

+260
-109
lines changed

13 files changed

+260
-109
lines changed

.editorconfig

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
root = true
2+
3+
[*]
4+
end_of_line = lf
5+
indent_size = 4
6+
insert_final_newline = true
7+
charset = utf-8
8+
indent_style = space

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ serde = { version = "1.0", features = ["derive"] }
1515
# sysinfo = "0.29.4"
1616
serde_json = "1.0"
1717
tokio = "1.32.0"
18+
lazy_static = "1.4.0"

libcapture.dll

60.5 KB
Binary file not shown.

libcapture.lib

5.71 KB
Binary file not shown.

src/discover/mod.rs

+16-15
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
pub mod udp_server;
22

3-
use std::{sync::Arc, thread};
43
use crate::global::state::State;
4+
use std::{
5+
sync::{Arc, Mutex},
6+
thread,
7+
};
58
use udp_server::UDPServer;
69

7-
pub fn init(global_state: Arc<State>) {
8-
let udp_discover = UDPServer::new("0.0.0.0".to_string(), 1232);
9-
let server = Arc::new(udp_discover);
10+
pub fn init() {
11+
let udp_discover = UDPServer::new("0.0.0.0".to_string(), 1232);
12+
let server = Arc::new(udp_discover);
1013

11-
let recv_state = Arc::clone(&global_state);
12-
let recv_server = Arc::clone(&server);
13-
thread::spawn(move || {
14-
recv_server.recv(recv_state);
15-
});
16-
17-
let send_state = Arc::clone(&global_state);
18-
let send_server = Arc::clone(&server);
19-
thread::spawn(move || {
20-
send_server.send(send_state);
21-
});
14+
let recv_server = Arc::clone(&server);
15+
thread::spawn(move || {
16+
recv_server.recv();
17+
});
18+
19+
let send_server = Arc::clone(&server);
20+
thread::spawn(move || {
21+
send_server.send();
22+
});
2223
}

src/discover/udp_server.rs

+55-50
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,68 @@
1+
use std::str;
12
use std::sync::Arc;
23
use std::time::Duration;
34
use std::{net::UdpSocket, thread};
4-
use std::str;
55

6-
use chrono::prelude::*;
76
use crate::global::device::{DeviceInfo, RemoteDevice};
8-
use crate::global::state::State;
7+
use crate::global::state::{State, STATE};
8+
use chrono::prelude::*;
99

1010
pub struct UDPServer {
11-
socket: UdpSocket,
12-
ip: String,
13-
port: u16
11+
socket: UdpSocket,
12+
ip: String,
13+
port: u16,
1414
}
1515

1616
impl UDPServer {
17-
pub fn new(ip: String, port: u16) -> UDPServer {
18-
let socket = UdpSocket::bind(format!("{ip}:{port}")).unwrap();
19-
// socket.set_nonblocking(true).unwrap();
20-
socket.set_broadcast(true).unwrap();
21-
UDPServer {
22-
socket,
23-
ip,
24-
port
17+
pub fn new(ip: String, port: u16) -> UDPServer {
18+
let socket = UdpSocket::bind(format!("{ip}:{port}")).unwrap();
19+
// socket.set_nonblocking(true).unwrap();
20+
socket.set_broadcast(true).unwrap();
21+
UDPServer { socket, ip, port }
2522
}
26-
}
27-
pub fn recv(&self, state: Arc<State>) {
28-
let dev = &state.cur_device;
29-
// let dev = DeviceInfo::new();
30-
let mut buf = [0; 64 * 1024];
31-
loop {
32-
let (data, rinfo) = self.socket.recv_from(&mut buf).unwrap();
33-
let remote = DeviceInfo::from_json(str::from_utf8(&buf[..data]).unwrap().to_string());
34-
35-
if dev.ifs.iter().all(|interface| {
36-
interface.addr.to_string() != rinfo.ip().to_string()
37-
}) {
38-
println!("{} - {:?}", Local::now(), remote);
39-
state.add_remote(remote);
40-
}
41-
}
42-
}
43-
pub fn send(&self, state: Arc<State>) {
44-
// let dev = DeviceInfo::new();
45-
let dev = &state.cur_device;
46-
let mut remote_infos = Vec::new();
47-
for interface in &dev.ifs {
48-
let addr = format!("{}:{}", interface.broadcast_addr, self.port);
49-
let remote = RemoteDevice {
50-
hostname: dev.hostname.clone(),
51-
ip: interface.addr.to_string()
52-
}.to_json();
53-
remote_infos.push((remote, addr));
23+
pub fn recv(&self) {
24+
// let dev = DeviceInfo::new();
25+
let mut buf = [0; 64 * 1024];
26+
loop {
27+
let (data, rinfo) = self.socket.recv_from(&mut buf).unwrap();
28+
let remote = DeviceInfo::from_json(str::from_utf8(&buf[..data]).unwrap().to_string());
29+
30+
let state = STATE.lock().unwrap();
31+
let dev = &state.cur_device;
32+
if dev
33+
.ifs
34+
.iter()
35+
.all(|interface| interface.addr.to_string() != rinfo.ip().to_string())
36+
{
37+
println!("{} - {:?}", Local::now(), remote);
38+
state.add_remote(remote);
39+
}
40+
}
5441
}
55-
loop {
56-
for (remote, addr) in &remote_infos {
57-
self.socket.send_to(remote.as_bytes(), addr).expect("send failed");
58-
// println!("send to {:?}", interface.broadcast_addr);
59-
}
60-
thread::sleep(Duration::from_secs(1));
42+
pub fn send(&self) {
43+
// let dev = DeviceInfo::new();
44+
let mut remote_infos = Vec::new();
45+
{
46+
let state = STATE.lock().unwrap();
47+
let dev = &state.cur_device;
48+
for interface in &dev.ifs {
49+
let addr = format!("{}:{}", interface.broadcast_addr, self.port);
50+
let remote = RemoteDevice {
51+
hostname: dev.hostname.clone(),
52+
ip: interface.addr.to_string(),
53+
}
54+
.to_json();
55+
remote_infos.push((remote, addr));
56+
}
57+
}
58+
loop {
59+
for (remote, addr) in &remote_infos {
60+
self.socket
61+
.send_to(remote.as_bytes(), addr)
62+
.expect("send failed");
63+
// println!("send to {:?}", interface.broadcast_addr);
64+
}
65+
thread::sleep(Duration::from_secs(1));
66+
}
6167
}
62-
}
63-
}
68+
}

src/global/device.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ pub struct Interface {
1212
pub broadcast_addr: Ipv4Addr
1313
}
1414

15-
#[derive(Serialize, Deserialize, Debug)]
15+
#[derive(Serialize, Deserialize, Debug, Clone)]
1616
pub struct DeviceInfo {
1717
pub hostname: String,
1818
pub ifs: Vec<Interface>
1919
}
2020

21-
#[derive(Serialize, Deserialize, Debug, PartialEq)]
21+
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
2222
pub struct RemoteDevice {
2323
pub hostname: String,
2424
pub ip: String
@@ -62,9 +62,10 @@ impl DeviceInfo {
6262
let remote: RemoteDevice = serde_json::from_str(&json_str).unwrap();
6363
remote
6464
}
65-
// pub fn to_json(&self) -> String {
66-
// serde_json::to_string(&self).unwrap()
67-
// }
65+
66+
pub fn to_json(&self) -> String {
67+
serde_json::to_string(&self).unwrap()
68+
}
6869
}
6970

7071
fn calc_broadcast_addr(addr: Ipv4Addr, netmask: Ipv4Addr) -> Ipv4Addr {
@@ -90,4 +91,4 @@ fn calc_broadcast_addr_test() {
9091
Ipv4Addr::new(255, 128, 0, 0)
9192
);
9293
assert_eq!(b1, Ipv4Addr::new(200, 255, 255, 255));
93-
}
94+
}

src/global/state.rs

+44-15
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,53 @@
1-
use std::sync::Mutex;
1+
use std::sync::{Arc, Mutex};
22

3-
use super::device::{RemoteDevice, DeviceInfo};
3+
use super::device::{DeviceInfo, RemoteDevice};
4+
use lazy_static::lazy_static;
5+
6+
lazy_static! {
7+
pub static ref STATE: Mutex<State> = Mutex::new(State::new());
8+
}
49

510
pub struct State {
6-
remotes: Mutex<Vec<RemoteDevice>>,
7-
pub cur_device: DeviceInfo
11+
pub remotes: Mutex<Vec<RemoteDevice>>,
12+
pub cur_device: DeviceInfo,
13+
remote_peer: Option<RemoteDevice>,
814
}
915

1016
impl State {
11-
pub fn new() -> State {
12-
State {
13-
remotes: Mutex::new(Vec::new()),
14-
cur_device: DeviceInfo::new()
17+
// pub fn get_instance() -> State {
18+
// STATE.lock().unwrap().try_into()
19+
// }
20+
21+
fn new() -> State {
22+
State {
23+
remotes: Mutex::new(Vec::new()),
24+
cur_device: DeviceInfo::new(),
25+
remote_peer: None,
26+
}
27+
}
28+
29+
pub fn set_remote_peer(&mut self, peer: Option<RemoteDevice>) {
30+
self.remote_peer = peer;
1531
}
16-
}
1732

18-
pub fn add_remote(&self, remote: RemoteDevice) {
19-
let mut remotes = self.remotes.lock().unwrap();
20-
if !remotes.contains(&remote) {
21-
remotes.push(remote);
33+
pub fn get_remote(&self) -> Vec<RemoteDevice> {
34+
self.remotes.lock().unwrap().clone()
2235
}
23-
}
24-
}
36+
37+
pub fn add_remote(&self, remote: RemoteDevice) {
38+
let mut remotes = self.remotes.lock().unwrap();
39+
if !remotes.contains(&remote) {
40+
remotes.push(remote);
41+
}
42+
}
43+
44+
pub fn find_remote_by_ip(&self, ip: &str) -> Option<RemoteDevice> {
45+
let remotes = self.remotes.lock().unwrap();
46+
for r in remotes.clone().into_iter() {
47+
if r.ip.as_str() == ip {
48+
return Some(r.clone());
49+
}
50+
}
51+
None
52+
}
53+
}

src/input/mod.rs

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
3+
use std::{ffi::{c_int, c_long, c_char, CStr, c_uchar, OsString, OsStr, c_ushort}, thread, time::Duration, slice, os::windows::prelude::{OsStrExt, OsStringExt}, iter::once};
4+
5+
#[repr(C)]
6+
// #[no_mangle]
7+
struct Square {
8+
a: c_int,
9+
b: c_int
10+
}
11+
#[repr(C)]
12+
enum MouseButton {
13+
MouseLeft = 1,
14+
MouseMiddle,
15+
MouseRight
16+
}
17+
#[repr(C)]
18+
enum MouseWheel {
19+
WheelUp = -1,
20+
WheelDown = 1
21+
}
22+
enum MouseType {
23+
MouseWheel = 0,
24+
MouseMove,
25+
MouseDown,
26+
MouseUp,
27+
KeyDown,
28+
KeyUp
29+
}
30+
type CInputHandler = extern fn(ev: *const c_long);
31+
type CClipboardHandler = extern fn();
32+
#[link(name = "libcapture")]
33+
extern "C" {
34+
fn mouse_move(x: c_int, y: c_int);
35+
fn mouse_wheel(direction: MouseWheel);
36+
fn mouse_down(button: MouseButton);
37+
fn mouse_up(button: MouseButton);
38+
39+
fn listener_init(
40+
mouseHanlder: CInputHandler,
41+
keyboardHanlder: CInputHandler
42+
);
43+
fn listener_listen();
44+
fn charToKeycode(scancode: c_int) -> c_int;
45+
46+
fn clipboard_init();
47+
fn clipboard_dispose();
48+
fn read_text() -> *const c_ushort;
49+
fn capture(cb: CClipboardHandler);
50+
fn write_text(text: *const c_ushort) -> c_int;
51+
52+
fn utils_open(path: *const c_ushort);
53+
}
54+
55+
56+
fn string_to_vec_u16(msg: String) -> Vec<u16> {
57+
let wide: Vec<u16> = OsStr::new(msg.as_str()).encode_wide().chain(once(0)).collect();
58+
return wide;
59+
}
60+
61+
fn const_u16_to_string(wide_str_ptr: *const u16) -> String {
62+
// 计算以 null 结尾的 u16 数组的长度
63+
let mut len = 0;
64+
while unsafe { *wide_str_ptr.offset(len as isize) } != 0 {
65+
len += 1;
66+
}
67+
let wide_str = unsafe {
68+
slice::from_raw_parts(wide_str_ptr, len)
69+
};
70+
// println!("const_u16_to_string={:?}", wide_str);
71+
let str = String::from_utf16_lossy(wide_str);
72+
return str;
73+
}

0 commit comments

Comments
 (0)