fidl_fuchsia_mem/
fidl_fuchsia_mem.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::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_mem__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14/// A buffer for data whose size is not necessarily a multiple of the page
15/// size.
16///
17/// DEPRECATED: This type is superfluous and deprecated. Instead of using this type,
18/// use a zx.Handle:VMO object and store the size of the contents in the ZX_PROP_VMO_CONTENT_SIZE
19/// property.
20#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
21pub struct Buffer {
22    /// The vmo that contains the buffer.
23    pub vmo: fidl::Vmo,
24    /// The number of bytes in the buffer.
25    ///
26    /// The content of the buffer begin at the start of the VMO and continue
27    /// for `size` bytes. To specify a range of bytes that do not start at
28    /// the beginning of the VMO, use `Range` rather than buffer.
29    ///
30    /// This size must not be greater than the physical size of the VMO.
31    pub size: u64,
32}
33
34impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Buffer {}
35
36/// A range of bytes within a VMO.
37#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
38pub struct Range {
39    /// The vmo that contains the bytes.
40    pub vmo: fidl::Vmo,
41    /// The offset of the first byte within the range relative to the start of
42    /// the VMO.
43    ///
44    /// For example, if `offset` is zero, then the first byte in the range is
45    /// the first byte in the VMO.
46    pub offset: u64,
47    /// The number of bytes in the range.
48    ///
49    /// For example, if the offset is 3 and the size is 2, and the VMO starts
50    /// with "abcdefg...", then the range contains "de".
51    ///
52    /// The sum of the offset and the size must not be greater than the
53    /// physical size of the VMO.
54    pub size: u64,
55}
56
57impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Range {}
58
59/// Binary data that might be stored inline or in a VMO.
60///
61/// Useful for performance-sensitive protocols that sometimes receive small
62/// amounts of binary data (i.e., which is more efficient to provide using
63/// `bytes`) but also need to support arbitrary amounts of data (i.e., which
64/// need to be provided out-of-line in a `Buffer`).
65#[derive(Debug)]
66pub enum Data {
67    /// The binary data provided inline in the message.
68    Bytes(Vec<u8>),
69    /// The binary data provided out-of-line in a `Buffer`.
70    Buffer(Buffer),
71    #[doc(hidden)]
72    __SourceBreaking { unknown_ordinal: u64 },
73}
74
75/// Pattern that matches an unknown `Data` member.
76#[macro_export]
77macro_rules! DataUnknown {
78    () => {
79        _
80    };
81}
82
83// Custom PartialEq so that unknown variants are not equal to themselves.
84impl PartialEq for Data {
85    fn eq(&self, other: &Self) -> bool {
86        match (self, other) {
87            (Self::Bytes(x), Self::Bytes(y)) => *x == *y,
88            (Self::Buffer(x), Self::Buffer(y)) => *x == *y,
89            _ => false,
90        }
91    }
92}
93
94impl Data {
95    #[inline]
96    pub fn ordinal(&self) -> u64 {
97        match *self {
98            Self::Bytes(_) => 1,
99            Self::Buffer(_) => 2,
100            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
101        }
102    }
103
104    #[inline]
105    pub fn unknown_variant_for_testing() -> Self {
106        Self::__SourceBreaking { unknown_ordinal: 0 }
107    }
108
109    #[inline]
110    pub fn is_unknown(&self) -> bool {
111        match self {
112            Self::__SourceBreaking { .. } => true,
113            _ => false,
114        }
115    }
116}
117
118impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Data {}
119
120mod internal {
121    use super::*;
122
123    impl fidl::encoding::ResourceTypeMarker for Buffer {
124        type Borrowed<'a> = &'a mut Self;
125        fn take_or_borrow<'a>(
126            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
127        ) -> Self::Borrowed<'a> {
128            value
129        }
130    }
131
132    unsafe impl fidl::encoding::TypeMarker for Buffer {
133        type Owned = Self;
134
135        #[inline(always)]
136        fn inline_align(_context: fidl::encoding::Context) -> usize {
137            8
138        }
139
140        #[inline(always)]
141        fn inline_size(_context: fidl::encoding::Context) -> usize {
142            16
143        }
144    }
145
146    unsafe impl fidl::encoding::Encode<Buffer, fidl::encoding::DefaultFuchsiaResourceDialect>
147        for &mut Buffer
148    {
149        #[inline]
150        unsafe fn encode(
151            self,
152            encoder: &mut fidl::encoding::Encoder<
153                '_,
154                fidl::encoding::DefaultFuchsiaResourceDialect,
155            >,
156            offset: usize,
157            _depth: fidl::encoding::Depth,
158        ) -> fidl::Result<()> {
159            encoder.debug_check_bounds::<Buffer>(offset);
160            // Delegate to tuple encoding.
161            fidl::encoding::Encode::<Buffer, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
162                (
163                    <fidl::encoding::HandleType<
164                        fidl::Vmo,
165                        { fidl::ObjectType::VMO.into_raw() },
166                        2147483648,
167                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
168                        &mut self.vmo
169                    ),
170                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.size),
171                ),
172                encoder,
173                offset,
174                _depth,
175            )
176        }
177    }
178    unsafe impl<
179        T0: fidl::encoding::Encode<
180                fidl::encoding::HandleType<
181                    fidl::Vmo,
182                    { fidl::ObjectType::VMO.into_raw() },
183                    2147483648,
184                >,
185                fidl::encoding::DefaultFuchsiaResourceDialect,
186            >,
187        T1: fidl::encoding::Encode<u64, fidl::encoding::DefaultFuchsiaResourceDialect>,
188    > fidl::encoding::Encode<Buffer, fidl::encoding::DefaultFuchsiaResourceDialect> for (T0, T1)
189    {
190        #[inline]
191        unsafe fn encode(
192            self,
193            encoder: &mut fidl::encoding::Encoder<
194                '_,
195                fidl::encoding::DefaultFuchsiaResourceDialect,
196            >,
197            offset: usize,
198            depth: fidl::encoding::Depth,
199        ) -> fidl::Result<()> {
200            encoder.debug_check_bounds::<Buffer>(offset);
201            // Zero out padding regions. There's no need to apply masks
202            // because the unmasked parts will be overwritten by fields.
203            unsafe {
204                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
205                (ptr as *mut u64).write_unaligned(0);
206            }
207            // Write the fields.
208            self.0.encode(encoder, offset + 0, depth)?;
209            self.1.encode(encoder, offset + 8, depth)?;
210            Ok(())
211        }
212    }
213
214    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Buffer {
215        #[inline(always)]
216        fn new_empty() -> Self {
217            Self {
218                vmo: fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
219                size: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
220            }
221        }
222
223        #[inline]
224        unsafe fn decode(
225            &mut self,
226            decoder: &mut fidl::encoding::Decoder<
227                '_,
228                fidl::encoding::DefaultFuchsiaResourceDialect,
229            >,
230            offset: usize,
231            _depth: fidl::encoding::Depth,
232        ) -> fidl::Result<()> {
233            decoder.debug_check_bounds::<Self>(offset);
234            // Verify that padding bytes are zero.
235            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
236            let padval = unsafe { (ptr as *const u64).read_unaligned() };
237            let mask = 0xffffffff00000000u64;
238            let maskedval = padval & mask;
239            if maskedval != 0 {
240                return Err(fidl::Error::NonZeroPadding {
241                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
242                });
243            }
244            fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.vmo, decoder, offset + 0, _depth)?;
245            fidl::decode!(
246                u64,
247                fidl::encoding::DefaultFuchsiaResourceDialect,
248                &mut self.size,
249                decoder,
250                offset + 8,
251                _depth
252            )?;
253            Ok(())
254        }
255    }
256
257    impl fidl::encoding::ResourceTypeMarker for Range {
258        type Borrowed<'a> = &'a mut Self;
259        fn take_or_borrow<'a>(
260            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
261        ) -> Self::Borrowed<'a> {
262            value
263        }
264    }
265
266    unsafe impl fidl::encoding::TypeMarker for Range {
267        type Owned = Self;
268
269        #[inline(always)]
270        fn inline_align(_context: fidl::encoding::Context) -> usize {
271            8
272        }
273
274        #[inline(always)]
275        fn inline_size(_context: fidl::encoding::Context) -> usize {
276            24
277        }
278    }
279
280    unsafe impl fidl::encoding::Encode<Range, fidl::encoding::DefaultFuchsiaResourceDialect>
281        for &mut Range
282    {
283        #[inline]
284        unsafe fn encode(
285            self,
286            encoder: &mut fidl::encoding::Encoder<
287                '_,
288                fidl::encoding::DefaultFuchsiaResourceDialect,
289            >,
290            offset: usize,
291            _depth: fidl::encoding::Depth,
292        ) -> fidl::Result<()> {
293            encoder.debug_check_bounds::<Range>(offset);
294            // Delegate to tuple encoding.
295            fidl::encoding::Encode::<Range, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
296                (
297                    <fidl::encoding::HandleType<
298                        fidl::Vmo,
299                        { fidl::ObjectType::VMO.into_raw() },
300                        2147483648,
301                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
302                        &mut self.vmo
303                    ),
304                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.offset),
305                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.size),
306                ),
307                encoder,
308                offset,
309                _depth,
310            )
311        }
312    }
313    unsafe impl<
314        T0: fidl::encoding::Encode<
315                fidl::encoding::HandleType<
316                    fidl::Vmo,
317                    { fidl::ObjectType::VMO.into_raw() },
318                    2147483648,
319                >,
320                fidl::encoding::DefaultFuchsiaResourceDialect,
321            >,
322        T1: fidl::encoding::Encode<u64, fidl::encoding::DefaultFuchsiaResourceDialect>,
323        T2: fidl::encoding::Encode<u64, fidl::encoding::DefaultFuchsiaResourceDialect>,
324    > fidl::encoding::Encode<Range, fidl::encoding::DefaultFuchsiaResourceDialect>
325        for (T0, T1, T2)
326    {
327        #[inline]
328        unsafe fn encode(
329            self,
330            encoder: &mut fidl::encoding::Encoder<
331                '_,
332                fidl::encoding::DefaultFuchsiaResourceDialect,
333            >,
334            offset: usize,
335            depth: fidl::encoding::Depth,
336        ) -> fidl::Result<()> {
337            encoder.debug_check_bounds::<Range>(offset);
338            // Zero out padding regions. There's no need to apply masks
339            // because the unmasked parts will be overwritten by fields.
340            unsafe {
341                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
342                (ptr as *mut u64).write_unaligned(0);
343            }
344            // Write the fields.
345            self.0.encode(encoder, offset + 0, depth)?;
346            self.1.encode(encoder, offset + 8, depth)?;
347            self.2.encode(encoder, offset + 16, depth)?;
348            Ok(())
349        }
350    }
351
352    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Range {
353        #[inline(always)]
354        fn new_empty() -> Self {
355            Self {
356                vmo: fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
357                offset: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
358                size: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
359            }
360        }
361
362        #[inline]
363        unsafe fn decode(
364            &mut self,
365            decoder: &mut fidl::encoding::Decoder<
366                '_,
367                fidl::encoding::DefaultFuchsiaResourceDialect,
368            >,
369            offset: usize,
370            _depth: fidl::encoding::Depth,
371        ) -> fidl::Result<()> {
372            decoder.debug_check_bounds::<Self>(offset);
373            // Verify that padding bytes are zero.
374            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
375            let padval = unsafe { (ptr as *const u64).read_unaligned() };
376            let mask = 0xffffffff00000000u64;
377            let maskedval = padval & mask;
378            if maskedval != 0 {
379                return Err(fidl::Error::NonZeroPadding {
380                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
381                });
382            }
383            fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.vmo, decoder, offset + 0, _depth)?;
384            fidl::decode!(
385                u64,
386                fidl::encoding::DefaultFuchsiaResourceDialect,
387                &mut self.offset,
388                decoder,
389                offset + 8,
390                _depth
391            )?;
392            fidl::decode!(
393                u64,
394                fidl::encoding::DefaultFuchsiaResourceDialect,
395                &mut self.size,
396                decoder,
397                offset + 16,
398                _depth
399            )?;
400            Ok(())
401        }
402    }
403
404    impl fidl::encoding::ResourceTypeMarker for Data {
405        type Borrowed<'a> = &'a mut Self;
406        fn take_or_borrow<'a>(
407            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
408        ) -> Self::Borrowed<'a> {
409            value
410        }
411    }
412
413    unsafe impl fidl::encoding::TypeMarker for Data {
414        type Owned = Self;
415
416        #[inline(always)]
417        fn inline_align(_context: fidl::encoding::Context) -> usize {
418            8
419        }
420
421        #[inline(always)]
422        fn inline_size(_context: fidl::encoding::Context) -> usize {
423            16
424        }
425    }
426
427    unsafe impl fidl::encoding::Encode<Data, fidl::encoding::DefaultFuchsiaResourceDialect>
428        for &mut Data
429    {
430        #[inline]
431        unsafe fn encode(
432            self,
433            encoder: &mut fidl::encoding::Encoder<
434                '_,
435                fidl::encoding::DefaultFuchsiaResourceDialect,
436            >,
437            offset: usize,
438            _depth: fidl::encoding::Depth,
439        ) -> fidl::Result<()> {
440            encoder.debug_check_bounds::<Data>(offset);
441            encoder.write_num::<u64>(self.ordinal(), offset);
442            match self {
443            Data::Bytes(ref val) => {
444                fidl::encoding::encode_in_envelope::<fidl::encoding::UnboundedVector<u8>, fidl::encoding::DefaultFuchsiaResourceDialect>(
445                    <fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow(val),
446                    encoder, offset + 8, _depth
447                )
448            }
449            Data::Buffer(ref mut val) => {
450                fidl::encoding::encode_in_envelope::<Buffer, fidl::encoding::DefaultFuchsiaResourceDialect>(
451                    <Buffer as fidl::encoding::ResourceTypeMarker>::take_or_borrow(val),
452                    encoder, offset + 8, _depth
453                )
454            }
455            Data::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
456        }
457        }
458    }
459
460    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Data {
461        #[inline(always)]
462        fn new_empty() -> Self {
463            Self::__SourceBreaking { unknown_ordinal: 0 }
464        }
465
466        #[inline]
467        unsafe fn decode(
468            &mut self,
469            decoder: &mut fidl::encoding::Decoder<
470                '_,
471                fidl::encoding::DefaultFuchsiaResourceDialect,
472            >,
473            offset: usize,
474            mut depth: fidl::encoding::Depth,
475        ) -> fidl::Result<()> {
476            decoder.debug_check_bounds::<Self>(offset);
477            #[allow(unused_variables)]
478            let next_out_of_line = decoder.next_out_of_line();
479            let handles_before = decoder.remaining_handles();
480            let (ordinal, inlined, num_bytes, num_handles) =
481                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
482
483            let member_inline_size = match ordinal {
484                1 => {
485                    <fidl::encoding::UnboundedVector<u8> as fidl::encoding::TypeMarker>::inline_size(
486                        decoder.context,
487                    )
488                }
489                2 => <Buffer as fidl::encoding::TypeMarker>::inline_size(decoder.context),
490                0 => return Err(fidl::Error::UnknownUnionTag),
491                _ => num_bytes as usize,
492            };
493
494            if inlined != (member_inline_size <= 4) {
495                return Err(fidl::Error::InvalidInlineBitInEnvelope);
496            }
497            let _inner_offset;
498            if inlined {
499                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
500                _inner_offset = offset + 8;
501            } else {
502                depth.increment()?;
503                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
504            }
505            match ordinal {
506                1 => {
507                    #[allow(irrefutable_let_patterns)]
508                    if let Data::Bytes(_) = self {
509                        // Do nothing, read the value into the object
510                    } else {
511                        // Initialize `self` to the right variant
512                        *self = Data::Bytes(fidl::new_empty!(
513                            fidl::encoding::UnboundedVector<u8>,
514                            fidl::encoding::DefaultFuchsiaResourceDialect
515                        ));
516                    }
517                    #[allow(irrefutable_let_patterns)]
518                    if let Data::Bytes(ref mut val) = self {
519                        fidl::decode!(
520                            fidl::encoding::UnboundedVector<u8>,
521                            fidl::encoding::DefaultFuchsiaResourceDialect,
522                            val,
523                            decoder,
524                            _inner_offset,
525                            depth
526                        )?;
527                    } else {
528                        unreachable!()
529                    }
530                }
531                2 => {
532                    #[allow(irrefutable_let_patterns)]
533                    if let Data::Buffer(_) = self {
534                        // Do nothing, read the value into the object
535                    } else {
536                        // Initialize `self` to the right variant
537                        *self = Data::Buffer(fidl::new_empty!(
538                            Buffer,
539                            fidl::encoding::DefaultFuchsiaResourceDialect
540                        ));
541                    }
542                    #[allow(irrefutable_let_patterns)]
543                    if let Data::Buffer(ref mut val) = self {
544                        fidl::decode!(
545                            Buffer,
546                            fidl::encoding::DefaultFuchsiaResourceDialect,
547                            val,
548                            decoder,
549                            _inner_offset,
550                            depth
551                        )?;
552                    } else {
553                        unreachable!()
554                    }
555                }
556                #[allow(deprecated)]
557                ordinal => {
558                    for _ in 0..num_handles {
559                        decoder.drop_next_handle()?;
560                    }
561                    *self = Data::__SourceBreaking { unknown_ordinal: ordinal };
562                }
563            }
564            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
565                return Err(fidl::Error::InvalidNumBytesInEnvelope);
566            }
567            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
568                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
569            }
570            Ok(())
571        }
572    }
573}