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;
13use crate::usb::xhci::xhci_transfer::XhciTransfer;
14
15pub struct BackendTransferHandle {
18 handle: Box<dyn GenericTransferHandle>,
19}
20
21impl BackendTransferHandle {
22 pub fn new(handle: impl GenericTransferHandle + 'static) -> Self {
23 BackendTransferHandle {
24 handle: Box::new(handle),
25 }
26 }
27
28 pub fn cancel(&self) -> Result<()> {
29 self.handle.cancel()
30 }
31}
32
33pub enum BackendTransferType {
34 HostDevice(Transfer),
35 FidoDevice(FidoTransfer),
36}
37
38pub trait BackendTransfer {
42 fn status(&self) -> TransferStatus;
44 fn actual_length(&self) -> usize;
46 fn buffer(&self) -> &TransferBuffer;
48 fn set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C);
50}
51
52impl BackendTransfer for BackendTransferType {
54 fn status(&self) -> TransferStatus {
55 match self {
56 BackendTransferType::HostDevice(transfer) => BackendTransfer::status(transfer),
57 BackendTransferType::FidoDevice(transfer) => BackendTransfer::status(transfer),
58 }
59 }
60
61 fn actual_length(&self) -> usize {
62 match self {
63 BackendTransferType::HostDevice(transfer) => BackendTransfer::actual_length(transfer),
64 BackendTransferType::FidoDevice(transfer) => BackendTransfer::actual_length(transfer),
65 }
66 }
67
68 fn buffer(&self) -> &TransferBuffer {
69 match self {
70 BackendTransferType::HostDevice(transfer) => BackendTransfer::buffer(transfer),
71 BackendTransferType::FidoDevice(transfer) => BackendTransfer::buffer(transfer),
72 }
73 }
74
75 fn set_callback<C: 'static + Fn(BackendTransferType) + Send + Sync>(&mut self, cb: C) {
76 match self {
77 BackendTransferType::HostDevice(transfer) => {
78 BackendTransfer::set_callback(transfer, cb)
79 }
80 BackendTransferType::FidoDevice(transfer) => {
81 BackendTransfer::set_callback(transfer, cb)
82 }
83 }
84 }
85}
86
87pub trait GenericTransferHandle: Send {
91 fn cancel(&self) -> Result<()>;
95}
96
97pub struct ControlTransferState {
98 pub ctl_ep_state: ControlEndpointState,
99 pub control_request_setup: UsbRequestSetup,
100 pub data_stage_transfer: Option<XhciTransfer>,
101}