Skip to main content

fidl_fuchsia_hardware_usb_policy__common/
fidl_fuchsia_hardware_usb_policy__common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// Device States mirrors the descriptions in Section 9.1 of the USB 2.0 spec
12#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13pub enum DeviceState {
14    NotAttached,
15    Attached,
16    Powered,
17    /// 3 is reserved for RECONNECTING, which is an unused legacy value for wireless USB
18    /// 4 is reserved for UNAUTHENTICATED, which is an unused legacy value for wireless USB
19    Default,
20    Address,
21    Configured,
22    Suspended,
23    #[doc(hidden)]
24    __SourceBreaking {
25        unknown_ordinal: u32,
26    },
27}
28
29/// Pattern that matches an unknown `DeviceState` member.
30#[macro_export]
31macro_rules! DeviceStateUnknown {
32    () => {
33        _
34    };
35}
36
37impl DeviceState {
38    #[inline]
39    pub fn from_primitive(prim: u32) -> Option<Self> {
40        match prim {
41            0 => Some(Self::NotAttached),
42            1 => Some(Self::Attached),
43            2 => Some(Self::Powered),
44            5 => Some(Self::Default),
45            6 => Some(Self::Address),
46            7 => Some(Self::Configured),
47            8 => Some(Self::Suspended),
48            _ => None,
49        }
50    }
51
52    #[inline]
53    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
54        match prim {
55            0 => Self::NotAttached,
56            1 => Self::Attached,
57            2 => Self::Powered,
58            5 => Self::Default,
59            6 => Self::Address,
60            7 => Self::Configured,
61            8 => Self::Suspended,
62            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
63        }
64    }
65
66    #[inline]
67    pub fn unknown() -> Self {
68        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
69    }
70
71    #[inline]
72    pub const fn into_primitive(self) -> u32 {
73        match self {
74            Self::NotAttached => 0,
75            Self::Attached => 1,
76            Self::Powered => 2,
77            Self::Default => 5,
78            Self::Address => 6,
79            Self::Configured => 7,
80            Self::Suspended => 8,
81            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
82        }
83    }
84
85    #[inline]
86    pub fn is_unknown(&self) -> bool {
87        match self {
88            Self::__SourceBreaking { unknown_ordinal: _ } => true,
89            _ => false,
90        }
91    }
92}
93
94/// A table representing the current state of a USB device.
95#[derive(Clone, Debug, Default, PartialEq)]
96pub struct DeviceStateUpdate {
97    /// The current USB device state.
98    pub state: Option<DeviceState>,
99    /// The USB device address.
100    pub address: Option<u8>,
101    #[doc(hidden)]
102    pub __source_breaking: fidl::marker::SourceBreaking,
103}
104
105impl fidl::Persistable for DeviceStateUpdate {}
106
107pub mod controller_ordinals {
108    pub const WATCH_DEVICE_STATE: u64 = 0x44628a2275753738;
109}
110
111pub mod device_state_watcher_ordinals {
112    pub const WATCH_DEVICE_STATE: u64 = 0x44628a2275753738;
113}
114
115mod internal {
116    use super::*;
117    unsafe impl fidl::encoding::TypeMarker for DeviceState {
118        type Owned = Self;
119
120        #[inline(always)]
121        fn inline_align(_context: fidl::encoding::Context) -> usize {
122            std::mem::align_of::<u32>()
123        }
124
125        #[inline(always)]
126        fn inline_size(_context: fidl::encoding::Context) -> usize {
127            std::mem::size_of::<u32>()
128        }
129
130        #[inline(always)]
131        fn encode_is_copy() -> bool {
132            false
133        }
134
135        #[inline(always)]
136        fn decode_is_copy() -> bool {
137            false
138        }
139    }
140
141    impl fidl::encoding::ValueTypeMarker for DeviceState {
142        type Borrowed<'a> = Self;
143        #[inline(always)]
144        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
145            *value
146        }
147    }
148
149    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for DeviceState {
150        #[inline]
151        unsafe fn encode(
152            self,
153            encoder: &mut fidl::encoding::Encoder<'_, D>,
154            offset: usize,
155            _depth: fidl::encoding::Depth,
156        ) -> fidl::Result<()> {
157            encoder.debug_check_bounds::<Self>(offset);
158            encoder.write_num(self.into_primitive(), offset);
159            Ok(())
160        }
161    }
162
163    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceState {
164        #[inline(always)]
165        fn new_empty() -> Self {
166            Self::unknown()
167        }
168
169        #[inline]
170        unsafe fn decode(
171            &mut self,
172            decoder: &mut fidl::encoding::Decoder<'_, D>,
173            offset: usize,
174            _depth: fidl::encoding::Depth,
175        ) -> fidl::Result<()> {
176            decoder.debug_check_bounds::<Self>(offset);
177            let prim = decoder.read_num::<u32>(offset);
178
179            *self = Self::from_primitive_allow_unknown(prim);
180            Ok(())
181        }
182    }
183
184    impl DeviceStateUpdate {
185        #[inline(always)]
186        fn max_ordinal_present(&self) -> u64 {
187            if let Some(_) = self.address {
188                return 2;
189            }
190            if let Some(_) = self.state {
191                return 1;
192            }
193            0
194        }
195    }
196
197    impl fidl::encoding::ValueTypeMarker for DeviceStateUpdate {
198        type Borrowed<'a> = &'a Self;
199        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
200            value
201        }
202    }
203
204    unsafe impl fidl::encoding::TypeMarker for DeviceStateUpdate {
205        type Owned = Self;
206
207        #[inline(always)]
208        fn inline_align(_context: fidl::encoding::Context) -> usize {
209            8
210        }
211
212        #[inline(always)]
213        fn inline_size(_context: fidl::encoding::Context) -> usize {
214            16
215        }
216    }
217
218    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceStateUpdate, D>
219        for &DeviceStateUpdate
220    {
221        unsafe fn encode(
222            self,
223            encoder: &mut fidl::encoding::Encoder<'_, D>,
224            offset: usize,
225            mut depth: fidl::encoding::Depth,
226        ) -> fidl::Result<()> {
227            encoder.debug_check_bounds::<DeviceStateUpdate>(offset);
228            // Vector header
229            let max_ordinal: u64 = self.max_ordinal_present();
230            encoder.write_num(max_ordinal, offset);
231            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
232            // Calling encoder.out_of_line_offset(0) is not allowed.
233            if max_ordinal == 0 {
234                return Ok(());
235            }
236            depth.increment()?;
237            let envelope_size = 8;
238            let bytes_len = max_ordinal as usize * envelope_size;
239            #[allow(unused_variables)]
240            let offset = encoder.out_of_line_offset(bytes_len);
241            let mut _prev_end_offset: usize = 0;
242            if 1 > max_ordinal {
243                return Ok(());
244            }
245
246            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
247            // are envelope_size bytes.
248            let cur_offset: usize = (1 - 1) * envelope_size;
249
250            // Zero reserved fields.
251            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
252
253            // Safety:
254            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
255            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
256            //   envelope_size bytes, there is always sufficient room.
257            fidl::encoding::encode_in_envelope_optional::<DeviceState, D>(
258                self.state.as_ref().map(<DeviceState as fidl::encoding::ValueTypeMarker>::borrow),
259                encoder,
260                offset + cur_offset,
261                depth,
262            )?;
263
264            _prev_end_offset = cur_offset + envelope_size;
265            if 2 > max_ordinal {
266                return Ok(());
267            }
268
269            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
270            // are envelope_size bytes.
271            let cur_offset: usize = (2 - 1) * envelope_size;
272
273            // Zero reserved fields.
274            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
275
276            // Safety:
277            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
278            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
279            //   envelope_size bytes, there is always sufficient room.
280            fidl::encoding::encode_in_envelope_optional::<u8, D>(
281                self.address.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
282                encoder,
283                offset + cur_offset,
284                depth,
285            )?;
286
287            _prev_end_offset = cur_offset + envelope_size;
288
289            Ok(())
290        }
291    }
292
293    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceStateUpdate {
294        #[inline(always)]
295        fn new_empty() -> Self {
296            Self::default()
297        }
298
299        unsafe fn decode(
300            &mut self,
301            decoder: &mut fidl::encoding::Decoder<'_, D>,
302            offset: usize,
303            mut depth: fidl::encoding::Depth,
304        ) -> fidl::Result<()> {
305            decoder.debug_check_bounds::<Self>(offset);
306            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
307                None => return Err(fidl::Error::NotNullable),
308                Some(len) => len,
309            };
310            // Calling decoder.out_of_line_offset(0) is not allowed.
311            if len == 0 {
312                return Ok(());
313            };
314            depth.increment()?;
315            let envelope_size = 8;
316            let bytes_len = len * envelope_size;
317            let offset = decoder.out_of_line_offset(bytes_len)?;
318            // Decode the envelope for each type.
319            let mut _next_ordinal_to_read = 0;
320            let mut next_offset = offset;
321            let end_offset = offset + bytes_len;
322            _next_ordinal_to_read += 1;
323            if next_offset >= end_offset {
324                return Ok(());
325            }
326
327            // Decode unknown envelopes for gaps in ordinals.
328            while _next_ordinal_to_read < 1 {
329                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
330                _next_ordinal_to_read += 1;
331                next_offset += envelope_size;
332            }
333
334            let next_out_of_line = decoder.next_out_of_line();
335            let handles_before = decoder.remaining_handles();
336            if let Some((inlined, num_bytes, num_handles)) =
337                fidl::encoding::decode_envelope_header(decoder, next_offset)?
338            {
339                let member_inline_size =
340                    <DeviceState as fidl::encoding::TypeMarker>::inline_size(decoder.context);
341                if inlined != (member_inline_size <= 4) {
342                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
343                }
344                let inner_offset;
345                let mut inner_depth = depth.clone();
346                if inlined {
347                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
348                    inner_offset = next_offset;
349                } else {
350                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
351                    inner_depth.increment()?;
352                }
353                let val_ref = self.state.get_or_insert_with(|| fidl::new_empty!(DeviceState, D));
354                fidl::decode!(DeviceState, D, val_ref, decoder, inner_offset, inner_depth)?;
355                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
356                {
357                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
358                }
359                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
360                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
361                }
362            }
363
364            next_offset += envelope_size;
365            _next_ordinal_to_read += 1;
366            if next_offset >= end_offset {
367                return Ok(());
368            }
369
370            // Decode unknown envelopes for gaps in ordinals.
371            while _next_ordinal_to_read < 2 {
372                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
373                _next_ordinal_to_read += 1;
374                next_offset += envelope_size;
375            }
376
377            let next_out_of_line = decoder.next_out_of_line();
378            let handles_before = decoder.remaining_handles();
379            if let Some((inlined, num_bytes, num_handles)) =
380                fidl::encoding::decode_envelope_header(decoder, next_offset)?
381            {
382                let member_inline_size =
383                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
384                if inlined != (member_inline_size <= 4) {
385                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
386                }
387                let inner_offset;
388                let mut inner_depth = depth.clone();
389                if inlined {
390                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
391                    inner_offset = next_offset;
392                } else {
393                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
394                    inner_depth.increment()?;
395                }
396                let val_ref = self.address.get_or_insert_with(|| fidl::new_empty!(u8, D));
397                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
398                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
399                {
400                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
401                }
402                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
403                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
404                }
405            }
406
407            next_offset += envelope_size;
408
409            // Decode the remaining unknown envelopes.
410            while next_offset < end_offset {
411                _next_ordinal_to_read += 1;
412                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
413                next_offset += envelope_size;
414            }
415
416            Ok(())
417        }
418    }
419}