From fac58ccdf96e6c3e962982ecbc774940a683c4fa Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Sat, 16 May 2020 17:00:03 +0800 Subject: [PATCH] Refactor interface --- examples/cdc_acm_serial.rs | 18 ++++++++---------- examples/hid_keyboard.rs | 28 +++++++++++++--------------- src/lib.rs | 8 +++++++- src/util.rs | 1 + 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/examples/cdc_acm_serial.rs b/examples/cdc_acm_serial.rs index f9ca8b5..7fc1172 100644 --- a/examples/cdc_acm_serial.rs +++ b/examples/cdc_acm_serial.rs @@ -11,16 +11,14 @@ async fn main() { let handler = Arc::new(Mutex::new(Box::new(usbip::cdc::UsbCdcAcmHandler::new()) as Box)); - let server = usbip::UsbIpServer { - devices: vec![usbip::UsbDevice::new(0).with_interface( - usbip::ClassCode::CDC as u8, - usbip::cdc::CDC_ACM_SUBCLASS, - 0x00, - "Test CDC ACM", - usbip::cdc::UsbCdcAcmHandler::endpoints(), - handler.clone(), - )], - }; + let server = usbip::UsbIpServer::new_simulated(vec![usbip::UsbDevice::new(0).with_interface( + usbip::ClassCode::CDC as u8, + usbip::cdc::CDC_ACM_SUBCLASS, + 0x00, + "Test CDC ACM", + usbip::cdc::UsbCdcAcmHandler::endpoints(), + handler.clone(), + )]); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 3240); tokio::spawn(usbip::server(addr, server)); diff --git a/examples/hid_keyboard.rs b/examples/hid_keyboard.rs index 404d8c4..94d0c66 100644 --- a/examples/hid_keyboard.rs +++ b/examples/hid_keyboard.rs @@ -12,21 +12,19 @@ async fn main() { Box::new(usbip::hid::UsbHidKeyboardHandler::new_keyboard()) as Box, )); - let server = usbip::UsbIpServer { - devices: vec![usbip::UsbDevice::new(0).with_interface( - usbip::ClassCode::HID as u8, - 0x00, - 0x00, - "Test HID", - vec![usbip::UsbEndpoint { - address: 0x81, // IN - attributes: 0x03, // Interrupt - max_packet_size: 0x08, // 8 bytes - interval: 10, - }], - handler.clone(), - )], - }; + let server = usbip::UsbIpServer::new_simulated(vec![usbip::UsbDevice::new(0).with_interface( + usbip::ClassCode::HID as u8, + 0x00, + 0x00, + "Test HID", + vec![usbip::UsbEndpoint { + address: 0x81, // IN + attributes: 0x03, // Interrupt + max_packet_size: 0x08, // 8 bytes + interval: 10, + }], + handler.clone(), + )]); let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 3240); tokio::spawn(usbip::server(addr, server)); diff --git a/src/lib.rs b/src/lib.rs index 1c98018..acac375 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -33,10 +33,16 @@ pub use util::*; /// Main struct of a USB/IP server pub struct UsbIpServer { - pub devices: Vec, + devices: Vec, } impl UsbIpServer { + /// Create a `UsbIpServer` with simulated devices + pub fn new_simulated(devices: Vec) -> Self { + Self { devices } + } + + /// Create a `UsbIpServer` exposing devices in the host, and redirect all USB transfers to them using libusb pub fn new_from_host() -> Self { let mut devices = vec![]; if let Ok(list) = rusb::devices() { diff --git a/src/util.rs b/src/util.rs index bd2116a..e444285 100644 --- a/src/util.rs +++ b/src/util.rs @@ -11,6 +11,7 @@ pub(crate) async fn socket_write_fixed_string