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>
189        for (T0, T1)
190    {
191        #[inline]
192        unsafe fn encode(
193            self,
194            encoder: &mut fidl::encoding::Encoder<
195                '_,
196                fidl::encoding::DefaultFuchsiaResourceDialect,
197            >,
198            offset: usize,
199            depth: fidl::encoding::Depth,
200        ) -> fidl::Result<()> {
201            encoder.debug_check_bounds::<Buffer>(offset);
202            // Zero out padding regions. There's no need to apply masks
203            // because the unmasked parts will be overwritten by fields.
204            unsafe {
205                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
206                (ptr as *mut u64).write_unaligned(0);
207            }
208            // Write the fields.
209            self.0.encode(encoder, offset + 0, depth)?;
210            self.1.encode(encoder, offset + 8, depth)?;
211            Ok(())
212        }
213    }
214
215    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Buffer {
216        #[inline(always)]
217        fn new_empty() -> Self {
218            Self {
219                vmo: fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
220                size: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
221            }
222        }
223
224        #[inline]
225        unsafe fn decode(
226            &mut self,
227            decoder: &mut fidl::encoding::Decoder<
228                '_,
229                fidl::encoding::DefaultFuchsiaResourceDialect,
230            >,
231            offset: usize,
232            _depth: fidl::encoding::Depth,
233        ) -> fidl::Result<()> {
234            decoder.debug_check_bounds::<Self>(offset);
235            // Verify that padding bytes are zero.
236            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
237            let padval = unsafe { (ptr as *const u64).read_unaligned() };
238            let mask = 0xffffffff00000000u64;
239            let maskedval = padval & mask;
240            if maskedval != 0 {
241                return Err(fidl::Error::NonZeroPadding {
242                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
243                });
244            }
245            fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.vmo, decoder, offset + 0, _depth)?;
246            fidl::decode!(
247                u64,
248                fidl::encoding::DefaultFuchsiaResourceDialect,
249                &mut self.size,
250                decoder,
251                offset + 8,
252                _depth
253            )?;
254            Ok(())
255        }
256    }
257
258    impl fidl::encoding::ResourceTypeMarker for Range {
259        type Borrowed<'a> = &'a mut Self;
260        fn take_or_borrow<'a>(
261            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
262        ) -> Self::Borrowed<'a> {
263            value
264        }
265    }
266
267    unsafe impl fidl::encoding::TypeMarker for Range {
268        type Owned = Self;
269
270        #[inline(always)]
271        fn inline_align(_context: fidl::encoding::Context) -> usize {
272            8
273        }
274
275        #[inline(always)]
276        fn inline_size(_context: fidl::encoding::Context) -> usize {
277            24
278        }
279    }
280
281    unsafe impl fidl::encoding::Encode<Range, fidl::encoding::DefaultFuchsiaResourceDialect>
282        for &mut Range
283    {
284        #[inline]
285        unsafe fn encode(
286            self,
287            encoder: &mut fidl::encoding::Encoder<
288                '_,
289                fidl::encoding::DefaultFuchsiaResourceDialect,
290            >,
291            offset: usize,
292            _depth: fidl::encoding::Depth,
293        ) -> fidl::Result<()> {
294            encoder.debug_check_bounds::<Range>(offset);
295            // Delegate to tuple encoding.
296            fidl::encoding::Encode::<Range, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
297                (
298                    <fidl::encoding::HandleType<
299                        fidl::Vmo,
300                        { fidl::ObjectType::VMO.into_raw() },
301                        2147483648,
302                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
303                        &mut self.vmo
304                    ),
305                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.offset),
306                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.size),
307                ),
308                encoder,
309                offset,
310                _depth,
311            )
312        }
313    }
314    unsafe impl<
315            T0: fidl::encoding::Encode<
316                fidl::encoding::HandleType<
317                    fidl::Vmo,
318                    { fidl::ObjectType::VMO.into_raw() },
319                    2147483648,
320                >,
321                fidl::encoding::DefaultFuchsiaResourceDialect,
322            >,
323            T1: fidl::encoding::Encode<u64, fidl::encoding::DefaultFuchsiaResourceDialect>,
324            T2: fidl::encoding::Encode<u64, fidl::encoding::DefaultFuchsiaResourceDialect>,
325        > fidl::encoding::Encode<Range, fidl::encoding::DefaultFuchsiaResourceDialect>
326        for (T0, T1, T2)
327    {
328        #[inline]
329        unsafe fn encode(
330            self,
331            encoder: &mut fidl::encoding::Encoder<
332                '_,
333                fidl::encoding::DefaultFuchsiaResourceDialect,
334            >,
335            offset: usize,
336            depth: fidl::encoding::Depth,
337        ) -> fidl::Result<()> {
338            encoder.debug_check_bounds::<Range>(offset);
339            // Zero out padding regions. There's no need to apply masks
340            // because the unmasked parts will be overwritten by fields.
341            unsafe {
342                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
343                (ptr as *mut u64).write_unaligned(0);
344            }
345            // Write the fields.
346            self.0.encode(encoder, offset + 0, depth)?;
347            self.1.encode(encoder, offset + 8, depth)?;
348            self.2.encode(encoder, offset + 16, depth)?;
349            Ok(())
350        }
351    }
352
353    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Range {
354        #[inline(always)]
355        fn new_empty() -> Self {
356            Self {
357                vmo: fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
358                offset: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
359                size: fidl::new_empty!(u64, fidl::encoding::DefaultFuchsiaResourceDialect),
360            }
361        }
362
363        #[inline]
364        unsafe fn decode(
365            &mut self,
366            decoder: &mut fidl::encoding::Decoder<
367                '_,
368                fidl::encoding::DefaultFuchsiaResourceDialect,
369            >,
370            offset: usize,
371            _depth: fidl::encoding::Depth,
372        ) -> fidl::Result<()> {
373            decoder.debug_check_bounds::<Self>(offset);
374            // Verify that padding bytes are zero.
375            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
376            let padval = unsafe { (ptr as *const u64).read_unaligned() };
377            let mask = 0xffffffff00000000u64;
378            let maskedval = padval & mask;
379            if maskedval != 0 {
380                return Err(fidl::Error::NonZeroPadding {
381                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
382                });
383            }
384            fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.vmo, decoder, offset + 0, _depth)?;
385            fidl::decode!(
386                u64,
387                fidl::encoding::DefaultFuchsiaResourceDialect,
388                &mut self.offset,
389                decoder,
390                offset + 8,
391                _depth
392            )?;
393            fidl::decode!(
394                u64,
395                fidl::encoding::DefaultFuchsiaResourceDialect,
396                &mut self.size,
397                decoder,
398                offset + 16,
399                _depth
400            )?;
401            Ok(())
402        }
403    }
404
405    impl fidl::encoding::ResourceTypeMarker for Data {
406        type Borrowed<'a> = &'a mut Self;
407        fn take_or_borrow<'a>(
408            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
409        ) -> Self::Borrowed<'a> {
410            value
411        }
412    }
413
414    unsafe impl fidl::encoding::TypeMarker for Data {
415        type Owned = Self;
416
417        #[inline(always)]
418        fn inline_align(_context: fidl::encoding::Context) -> usize {
419            8
420        }
421
422        #[inline(always)]
423        fn inline_size(_context: fidl::encoding::Context) -> usize {
424            16
425        }
426    }
427
428    unsafe impl fidl::encoding::Encode<Data, fidl::encoding::DefaultFuchsiaResourceDialect>
429        for &mut Data
430    {
431        #[inline]
432        unsafe fn encode(
433            self,
434            encoder: &mut fidl::encoding::Encoder<
435                '_,
436                fidl::encoding::DefaultFuchsiaResourceDialect,
437            >,
438            offset: usize,
439            _depth: fidl::encoding::Depth,
440        ) -> fidl::Result<()> {
441            encoder.debug_check_bounds::<Data>(offset);
442            encoder.write_num::<u64>(self.ordinal(), offset);
443            match self {
444            Data::Bytes(ref val) => {
445                fidl::encoding::encode_in_envelope::<fidl::encoding::UnboundedVector<u8>, fidl::encoding::DefaultFuchsiaResourceDialect>(
446                    <fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow(val),
447                    encoder, offset + 8, _depth
448                )
449            }
450            Data::Buffer(ref mut val) => {
451                fidl::encoding::encode_in_envelope::<Buffer, fidl::encoding::DefaultFuchsiaResourceDialect>(
452                    <Buffer as fidl::encoding::ResourceTypeMarker>::take_or_borrow(val),
453                    encoder, offset + 8, _depth
454                )
455            }
456            Data::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
457        }
458        }
459    }
460
461    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Data {
462        #[inline(always)]
463        fn new_empty() -> Self {
464            Self::__SourceBreaking { unknown_ordinal: 0 }
465        }
466
467        #[inline]
468        unsafe fn decode(
469            &mut self,
470            decoder: &mut fidl::encoding::Decoder<
471                '_,
472                fidl::encoding::DefaultFuchsiaResourceDialect,
473            >,
474            offset: usize,
475            mut depth: fidl::encoding::Depth,
476        ) -> fidl::Result<()> {
477            decoder.debug_check_bounds::<Self>(offset);
478            #[allow(unused_variables)]
479            let next_out_of_line = decoder.next_out_of_line();
480            let handles_before = decoder.remaining_handles();
481            let (ordinal, inlined, num_bytes, num_handles) =
482                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
483
484            let member_inline_size = match ordinal {
485                1 => {
486                    <fidl::encoding::UnboundedVector<u8> as fidl::encoding::TypeMarker>::inline_size(
487                        decoder.context,
488                    )
489                }
490                2 => <Buffer as fidl::encoding::TypeMarker>::inline_size(decoder.context),
491                0 => return Err(fidl::Error::UnknownUnionTag),
492                _ => num_bytes as usize,
493            };
494
495            if inlined != (member_inline_size <= 4) {
496                return Err(fidl::Error::InvalidInlineBitInEnvelope);
497            }
498            let _inner_offset;
499            if inlined {
500                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
501                _inner_offset = offset + 8;
502            } else {
503                depth.increment()?;
504                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
505            }
506            match ordinal {
507                1 => {
508                    #[allow(irrefutable_let_patterns)]
509                    if let Data::Bytes(_) = self {
510                        // Do nothing, read the value into the object
511                    } else {
512                        // Initialize `self` to the right variant
513                        *self = Data::Bytes(fidl::new_empty!(
514                            fidl::encoding::UnboundedVector<u8>,
515                            fidl::encoding::DefaultFuchsiaResourceDialect
516                        ));
517                    }
518                    #[allow(irrefutable_let_patterns)]
519                    if let Data::Bytes(ref mut val) = self {
520                        fidl::decode!(
521                            fidl::encoding::UnboundedVector<u8>,
522                            fidl::encoding::DefaultFuchsiaResourceDialect,
523                            val,
524                            decoder,
525                            _inner_offset,
526                            depth
527                        )?;
528                    } else {
529                        unreachable!()
530                    }
531                }
532                2 => {
533                    #[allow(irrefutable_let_patterns)]
534                    if let Data::Buffer(_) = self {
535                        // Do nothing, read the value into the object
536                    } else {
537                        // Initialize `self` to the right variant
538                        *self = Data::Buffer(fidl::new_empty!(
539                            Buffer,
540                            fidl::encoding::DefaultFuchsiaResourceDialect
541                        ));
542                    }
543                    #[allow(irrefutable_let_patterns)]
544                    if let Data::Buffer(ref mut val) = self {
545                        fidl::decode!(
546                            Buffer,
547                            fidl::encoding::DefaultFuchsiaResourceDialect,
548                            val,
549                            decoder,
550                            _inner_offset,
551                            depth
552                        )?;
553                    } else {
554                        unreachable!()
555                    }
556                }
557                #[allow(deprecated)]
558                ordinal => {
559                    for _ in 0..num_handles {
560                        decoder.drop_next_handle()?;
561                    }
562                    *self = Data::__SourceBreaking { unknown_ordinal: ordinal };
563                }
564            }
565            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
566                return Err(fidl::Error::InvalidNumBytesInEnvelope);
567            }
568            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
569                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
570            }
571            Ok(())
572        }
573    }
574}