mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-15 17:20:54 +03:00
better error messages
This commit is contained in:
@@ -95,19 +95,25 @@ impl App {
|
||||
let keyboard: Vk = self.vkm.create_virtual_keyboard(&self.seat, &self.qh, ());
|
||||
|
||||
// receive keymap from device
|
||||
eprintln!("connecting to {}", client.addr);
|
||||
|
||||
eprint!("\rconnecting to {} ", client.addr);
|
||||
let mut attempts = 0;
|
||||
let data = loop {
|
||||
match request::request_data(client.addr, Request::KeyMap) {
|
||||
Some(data) => break data,
|
||||
None => {
|
||||
eprint!(".");
|
||||
io::stderr().flush().unwrap();
|
||||
thread::sleep(Duration::from_millis(500));
|
||||
}
|
||||
let result = request::request_data(client.addr, Request::KeyMap);
|
||||
eprint!("\rconnecting to {} ", client.addr);
|
||||
for _ in 0..attempts { eprint!("."); }
|
||||
match result {
|
||||
Ok(data) => break data,
|
||||
Err(e) => { eprint!(" - {}", e); }
|
||||
}
|
||||
io::stderr().flush().unwrap();
|
||||
thread::sleep(Duration::from_millis(500));
|
||||
attempts += 1;
|
||||
};
|
||||
|
||||
eprint!("\rconnecting to {} ", client.addr);
|
||||
for _ in 0..attempts { eprint!("."); }
|
||||
eprintln!(" done! ");
|
||||
|
||||
// TODO use shm_open
|
||||
let f = tempfile::tempfile().unwrap();
|
||||
let mut buf = BufWriter::new(&f);
|
||||
|
||||
@@ -4,7 +4,7 @@ use std::{
|
||||
io::prelude::*,
|
||||
net::{SocketAddr, TcpListener, TcpStream},
|
||||
sync::{Arc, RwLock},
|
||||
thread::{self, JoinHandle},
|
||||
thread::{self, JoinHandle}, fmt::Display,
|
||||
};
|
||||
|
||||
use memmap::Mmap;
|
||||
@@ -83,47 +83,51 @@ impl Server {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn request_data(addr: SocketAddr, req: Request) -> Option<Vec<u8>> {
|
||||
#[derive(Debug)]
|
||||
pub struct BadRequest;
|
||||
|
||||
impl Display for BadRequest {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(f, "BadRequest")
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for BadRequest {}
|
||||
|
||||
pub fn request_data(addr: SocketAddr, req: Request) -> Result<Vec<u8>, Box<dyn Error>> {
|
||||
// connect to server
|
||||
let mut sock = match TcpStream::connect(addr) {
|
||||
Ok(sock) => sock,
|
||||
Err(e) => {
|
||||
eprintln!("{}", e);
|
||||
return None;
|
||||
}
|
||||
Err(e) => return Err(Box::new(e)),
|
||||
};
|
||||
|
||||
// write the request to the socket
|
||||
// convert to u32
|
||||
let req: u32 = req as u32;
|
||||
if let Err(e) = sock.write(&req.to_ne_bytes()) {
|
||||
eprintln!("{}", e);
|
||||
return None;
|
||||
return Err(Box::new(e));
|
||||
}
|
||||
if let Err(e) = sock.flush() {
|
||||
eprintln!("{}", e);
|
||||
return None;
|
||||
return Err(Box::new(e));
|
||||
}
|
||||
|
||||
// read the response = (len, data) - len 0 means no data / bad request
|
||||
// read len
|
||||
let mut buf = [0u8; 8];
|
||||
if let Err(e) = sock.read_exact(&mut buf[..]) {
|
||||
eprintln!("{}", e);
|
||||
return None;
|
||||
return Err(Box::new(e));
|
||||
}
|
||||
let len = usize::from_ne_bytes(buf);
|
||||
|
||||
// check for bad request
|
||||
if len == 0 {
|
||||
return None;
|
||||
return Err(Box::new(BadRequest{}));
|
||||
}
|
||||
|
||||
// read the data
|
||||
let mut data: Vec<u8> = vec![0u8; len];
|
||||
if let Err(e) = sock.read_exact(&mut data[..]) {
|
||||
eprintln!("{}", e);
|
||||
return None;
|
||||
return Err(Box::new(e));
|
||||
}
|
||||
Some(data)
|
||||
Ok(data)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user