devices/usb/backend/
transfer.rs1use usb_util::Transfer;
6use usb_util::TransferBuffer;
7use usb_util::TransferStatus;
8use usb_util::UsbRequestSetup;
9
10use crate::usb::backend::endpoint::ControlEndpointState;
11use crate::usb::backend::error::Result;
12use crate::usb::backend::fido_backend::transfer::FidoTransfer;
13
14pub struct BackendTransferHandle {
17 handle: Box<dyn GenericTransferHandle>,
18}
19
20impl BackendTransferHandle {
21 pub fn new(handle: impl GenericTransferHandle + 'static) -> Self {
22 BackendTransferHandle {
23 handle: Box::new(handle),
24 }
25 }
26
27 pub fn cancel(&self) -> Result<()> {
28 self.handle.cancel()
29 }
30}
31
32pub enum BackendTransferType {
33 HostDevice(Transfer),
34 FidoDevice(FidoTransfer),
35}
36
37pub trait BackendTransfer {
41 fn status(&self) -> TransferStatus;
43 fn actual_length(&self) -> usize;
45 fn buffer(&self) -> &TransferBuffer;
47 fn set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C);
49}
50
51impl BackendTransfer for BackendTransferType {
53 fn status(&self) -> TransferStatus {
54 match self {
55 BackendTransferType::HostDevice(transfer) => BackendTransfer::status(transfer),
56 BackendTransferType::FidoDevice(transfer) => BackendTransfer::status(transfer),
57 }
58 }
59
60 fn actual_length(&self) -> usize {
61 match self {
62 BackendTransferType::HostDevice(transfer) => BackendTransfer::actual_length(transfer),
63 BackendTransferType::FidoDevice(transfer) => BackendTransfer::actual_length(transfer),
64 }
65 }
66
67 fn buffer(&self) -> &TransferBuffer {
68 match self {
69 BackendTransferType::HostDevice(transfer) => BackendTransfer::buffer(transfer),
70 BackendTransferType::FidoDevice(transfer) => BackendTransfer::buffer(transfer),
71 }
72 }
73
74 fn set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C) {
75 match self {
76 BackendTransferType::HostDevice(transfer) => {
77 BackendTransfer::set_callback(transfer, cb)
78 }
79 BackendTransferType::FidoDevice(transfer) => {
80 BackendTransfer::set_callback(transfer, cb)
81 }
82 }
83 }
84}
85
86pub trait GenericTransferHandle: Send {
90 fn cancel(&self) -> Result<()>;
94}
95
96#[derive(Copy, Clone)]
97pub struct ControlTransferState {
98 pub ctl_ep_state: ControlEndpointState,
99 pub control_request_setup: UsbRequestSetup,
100 pub executed: bool,
101}