fidl_fuchsia_driver_loader/
fidl_fuchsia_driver_loader.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_driver_loader_common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, Default, PartialEq)]
15pub struct DriverHostLauncherLaunchRequest {
16    /// Process to load the driver host into.
17    /// This process must not already be running.
18    pub process: Option<fidl::Process>,
19    /// Vmar object that was created when the process was created.
20    pub root_vmar: Option<fidl::Vmar>,
21    /// Binary to load.
22    pub driver_host_binary: Option<fidl::Vmo>,
23    /// vDSO to use for the driver host.
24    pub vdso: Option<fidl::Vmo>,
25    /// /pkg/lib directory from the driver host package, where library dependencies are found.
26    pub driver_host_libs: Option<fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>>,
27    /// Server end of the driver host that will be used to load drivers.
28    pub driver_host: Option<fidl::endpoints::ServerEnd<DriverHostMarker>>,
29    #[doc(hidden)]
30    pub __source_breaking: fidl::marker::SourceBreaking,
31}
32
33impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
34    for DriverHostLauncherLaunchRequest
35{
36}
37
38#[derive(Debug, Default, PartialEq)]
39pub struct DriverHostLoadDriverRequest {
40    /// Soname of the driver.
41    pub driver_soname: Option<String>,
42    /// Binary to load.
43    pub driver_binary: Option<fidl::Vmo>,
44    /// Library dependencies of the driver.
45    pub driver_libs: Option<fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>>,
46    /// Additional root modules to be loaded, such as the
47    /// DFv1 driver module when running in DFv2 compatibility mode.
48    pub additional_root_modules: Option<Vec<RootModule>>,
49    #[doc(hidden)]
50    pub __source_breaking: fidl::marker::SourceBreaking,
51}
52
53impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
54    for DriverHostLoadDriverRequest
55{
56}
57
58/// The root module that can be loaded.
59#[derive(Debug, Default, PartialEq)]
60pub struct RootModule {
61    /// Module name.
62    pub name: Option<String>,
63    /// Binary to load.
64    pub binary: Option<fidl::Vmo>,
65    #[doc(hidden)]
66    pub __source_breaking: fidl::marker::SourceBreaking,
67}
68
69impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for RootModule {}
70
71#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
72pub struct DriverHostMarker;
73
74impl fidl::endpoints::ProtocolMarker for DriverHostMarker {
75    type Proxy = DriverHostProxy;
76    type RequestStream = DriverHostRequestStream;
77    #[cfg(target_os = "fuchsia")]
78    type SynchronousProxy = DriverHostSynchronousProxy;
79
80    const DEBUG_NAME: &'static str = "fuchsia.driver.loader.DriverHost";
81}
82impl fidl::endpoints::DiscoverableProtocolMarker for DriverHostMarker {}
83pub type DriverHostLoadDriverResult = Result<DriverHostLoadDriverResponse, i32>;
84
85pub trait DriverHostProxyInterface: Send + Sync {
86    type LoadDriverResponseFut: std::future::Future<Output = Result<DriverHostLoadDriverResult, fidl::Error>>
87        + Send;
88    fn r#load_driver(&self, payload: DriverHostLoadDriverRequest) -> Self::LoadDriverResponseFut;
89}
90#[derive(Debug)]
91#[cfg(target_os = "fuchsia")]
92pub struct DriverHostSynchronousProxy {
93    client: fidl::client::sync::Client,
94}
95
96#[cfg(target_os = "fuchsia")]
97impl fidl::endpoints::SynchronousProxy for DriverHostSynchronousProxy {
98    type Proxy = DriverHostProxy;
99    type Protocol = DriverHostMarker;
100
101    fn from_channel(inner: fidl::Channel) -> Self {
102        Self::new(inner)
103    }
104
105    fn into_channel(self) -> fidl::Channel {
106        self.client.into_channel()
107    }
108
109    fn as_channel(&self) -> &fidl::Channel {
110        self.client.as_channel()
111    }
112}
113
114#[cfg(target_os = "fuchsia")]
115impl DriverHostSynchronousProxy {
116    pub fn new(channel: fidl::Channel) -> Self {
117        let protocol_name = <DriverHostMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
118        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
119    }
120
121    pub fn into_channel(self) -> fidl::Channel {
122        self.client.into_channel()
123    }
124
125    /// Waits until an event arrives and returns it. It is safe for other
126    /// threads to make concurrent requests while waiting for an event.
127    pub fn wait_for_event(
128        &self,
129        deadline: zx::MonotonicInstant,
130    ) -> Result<DriverHostEvent, fidl::Error> {
131        DriverHostEvent::decode(self.client.wait_for_event(deadline)?)
132    }
133
134    /// Loads a driver into the driver host.
135    pub fn r#load_driver(
136        &self,
137        mut payload: DriverHostLoadDriverRequest,
138        ___deadline: zx::MonotonicInstant,
139    ) -> Result<DriverHostLoadDriverResult, fidl::Error> {
140        let _response = self.client.send_query::<
141            DriverHostLoadDriverRequest,
142            fidl::encoding::FlexibleResultType<DriverHostLoadDriverResponse, i32>,
143        >(
144            &mut payload,
145            0x5c43a774b3fd4930,
146            fidl::encoding::DynamicFlags::FLEXIBLE,
147            ___deadline,
148        )?
149        .into_result::<DriverHostMarker>("load_driver")?;
150        Ok(_response.map(|x| x))
151    }
152}
153
154#[derive(Debug, Clone)]
155pub struct DriverHostProxy {
156    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
157}
158
159impl fidl::endpoints::Proxy for DriverHostProxy {
160    type Protocol = DriverHostMarker;
161
162    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
163        Self::new(inner)
164    }
165
166    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
167        self.client.into_channel().map_err(|client| Self { client })
168    }
169
170    fn as_channel(&self) -> &::fidl::AsyncChannel {
171        self.client.as_channel()
172    }
173}
174
175impl DriverHostProxy {
176    /// Create a new Proxy for fuchsia.driver.loader/DriverHost.
177    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
178        let protocol_name = <DriverHostMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
179        Self { client: fidl::client::Client::new(channel, protocol_name) }
180    }
181
182    /// Get a Stream of events from the remote end of the protocol.
183    ///
184    /// # Panics
185    ///
186    /// Panics if the event stream was already taken.
187    pub fn take_event_stream(&self) -> DriverHostEventStream {
188        DriverHostEventStream { event_receiver: self.client.take_event_receiver() }
189    }
190
191    /// Loads a driver into the driver host.
192    pub fn r#load_driver(
193        &self,
194        mut payload: DriverHostLoadDriverRequest,
195    ) -> fidl::client::QueryResponseFut<
196        DriverHostLoadDriverResult,
197        fidl::encoding::DefaultFuchsiaResourceDialect,
198    > {
199        DriverHostProxyInterface::r#load_driver(self, payload)
200    }
201}
202
203impl DriverHostProxyInterface for DriverHostProxy {
204    type LoadDriverResponseFut = fidl::client::QueryResponseFut<
205        DriverHostLoadDriverResult,
206        fidl::encoding::DefaultFuchsiaResourceDialect,
207    >;
208    fn r#load_driver(
209        &self,
210        mut payload: DriverHostLoadDriverRequest,
211    ) -> Self::LoadDriverResponseFut {
212        fn _decode(
213            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
214        ) -> Result<DriverHostLoadDriverResult, fidl::Error> {
215            let _response = fidl::client::decode_transaction_body::<
216                fidl::encoding::FlexibleResultType<DriverHostLoadDriverResponse, i32>,
217                fidl::encoding::DefaultFuchsiaResourceDialect,
218                0x5c43a774b3fd4930,
219            >(_buf?)?
220            .into_result::<DriverHostMarker>("load_driver")?;
221            Ok(_response.map(|x| x))
222        }
223        self.client
224            .send_query_and_decode::<DriverHostLoadDriverRequest, DriverHostLoadDriverResult>(
225                &mut payload,
226                0x5c43a774b3fd4930,
227                fidl::encoding::DynamicFlags::FLEXIBLE,
228                _decode,
229            )
230    }
231}
232
233pub struct DriverHostEventStream {
234    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
235}
236
237impl std::marker::Unpin for DriverHostEventStream {}
238
239impl futures::stream::FusedStream for DriverHostEventStream {
240    fn is_terminated(&self) -> bool {
241        self.event_receiver.is_terminated()
242    }
243}
244
245impl futures::Stream for DriverHostEventStream {
246    type Item = Result<DriverHostEvent, fidl::Error>;
247
248    fn poll_next(
249        mut self: std::pin::Pin<&mut Self>,
250        cx: &mut std::task::Context<'_>,
251    ) -> std::task::Poll<Option<Self::Item>> {
252        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
253            &mut self.event_receiver,
254            cx
255        )?) {
256            Some(buf) => std::task::Poll::Ready(Some(DriverHostEvent::decode(buf))),
257            None => std::task::Poll::Ready(None),
258        }
259    }
260}
261
262#[derive(Debug)]
263pub enum DriverHostEvent {
264    #[non_exhaustive]
265    _UnknownEvent {
266        /// Ordinal of the event that was sent.
267        ordinal: u64,
268    },
269}
270
271impl DriverHostEvent {
272    /// Decodes a message buffer as a [`DriverHostEvent`].
273    fn decode(
274        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
275    ) -> Result<DriverHostEvent, fidl::Error> {
276        let (bytes, _handles) = buf.split_mut();
277        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
278        debug_assert_eq!(tx_header.tx_id, 0);
279        match tx_header.ordinal {
280            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
281                Ok(DriverHostEvent::_UnknownEvent { ordinal: tx_header.ordinal })
282            }
283            _ => Err(fidl::Error::UnknownOrdinal {
284                ordinal: tx_header.ordinal,
285                protocol_name: <DriverHostMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
286            }),
287        }
288    }
289}
290
291/// A Stream of incoming requests for fuchsia.driver.loader/DriverHost.
292pub struct DriverHostRequestStream {
293    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
294    is_terminated: bool,
295}
296
297impl std::marker::Unpin for DriverHostRequestStream {}
298
299impl futures::stream::FusedStream for DriverHostRequestStream {
300    fn is_terminated(&self) -> bool {
301        self.is_terminated
302    }
303}
304
305impl fidl::endpoints::RequestStream for DriverHostRequestStream {
306    type Protocol = DriverHostMarker;
307    type ControlHandle = DriverHostControlHandle;
308
309    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
310        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
311    }
312
313    fn control_handle(&self) -> Self::ControlHandle {
314        DriverHostControlHandle { inner: self.inner.clone() }
315    }
316
317    fn into_inner(
318        self,
319    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
320    {
321        (self.inner, self.is_terminated)
322    }
323
324    fn from_inner(
325        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
326        is_terminated: bool,
327    ) -> Self {
328        Self { inner, is_terminated }
329    }
330}
331
332impl futures::Stream for DriverHostRequestStream {
333    type Item = Result<DriverHostRequest, fidl::Error>;
334
335    fn poll_next(
336        mut self: std::pin::Pin<&mut Self>,
337        cx: &mut std::task::Context<'_>,
338    ) -> std::task::Poll<Option<Self::Item>> {
339        let this = &mut *self;
340        if this.inner.check_shutdown(cx) {
341            this.is_terminated = true;
342            return std::task::Poll::Ready(None);
343        }
344        if this.is_terminated {
345            panic!("polled DriverHostRequestStream after completion");
346        }
347        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
348            |bytes, handles| {
349                match this.inner.channel().read_etc(cx, bytes, handles) {
350                    std::task::Poll::Ready(Ok(())) => {}
351                    std::task::Poll::Pending => return std::task::Poll::Pending,
352                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
353                        this.is_terminated = true;
354                        return std::task::Poll::Ready(None);
355                    }
356                    std::task::Poll::Ready(Err(e)) => {
357                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
358                            e.into(),
359                        ))))
360                    }
361                }
362
363                // A message has been received from the channel
364                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
365
366                std::task::Poll::Ready(Some(match header.ordinal {
367                    0x5c43a774b3fd4930 => {
368                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
369                        let mut req = fidl::new_empty!(
370                            DriverHostLoadDriverRequest,
371                            fidl::encoding::DefaultFuchsiaResourceDialect
372                        );
373                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<DriverHostLoadDriverRequest>(&header, _body_bytes, handles, &mut req)?;
374                        let control_handle = DriverHostControlHandle { inner: this.inner.clone() };
375                        Ok(DriverHostRequest::LoadDriver {
376                            payload: req,
377                            responder: DriverHostLoadDriverResponder {
378                                control_handle: std::mem::ManuallyDrop::new(control_handle),
379                                tx_id: header.tx_id,
380                            },
381                        })
382                    }
383                    _ if header.tx_id == 0
384                        && header
385                            .dynamic_flags()
386                            .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
387                    {
388                        Ok(DriverHostRequest::_UnknownMethod {
389                            ordinal: header.ordinal,
390                            control_handle: DriverHostControlHandle { inner: this.inner.clone() },
391                            method_type: fidl::MethodType::OneWay,
392                        })
393                    }
394                    _ if header
395                        .dynamic_flags()
396                        .contains(fidl::encoding::DynamicFlags::FLEXIBLE) =>
397                    {
398                        this.inner.send_framework_err(
399                            fidl::encoding::FrameworkErr::UnknownMethod,
400                            header.tx_id,
401                            header.ordinal,
402                            header.dynamic_flags(),
403                            (bytes, handles),
404                        )?;
405                        Ok(DriverHostRequest::_UnknownMethod {
406                            ordinal: header.ordinal,
407                            control_handle: DriverHostControlHandle { inner: this.inner.clone() },
408                            method_type: fidl::MethodType::TwoWay,
409                        })
410                    }
411                    _ => Err(fidl::Error::UnknownOrdinal {
412                        ordinal: header.ordinal,
413                        protocol_name:
414                            <DriverHostMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
415                    }),
416                }))
417            },
418        )
419    }
420}
421
422/// Protocol through which drivers can be loaded into a driver host process
423/// using out-of-process dynamic linking.
424#[derive(Debug)]
425pub enum DriverHostRequest {
426    /// Loads a driver into the driver host.
427    LoadDriver { payload: DriverHostLoadDriverRequest, responder: DriverHostLoadDriverResponder },
428    /// An interaction was received which does not match any known method.
429    #[non_exhaustive]
430    _UnknownMethod {
431        /// Ordinal of the method that was called.
432        ordinal: u64,
433        control_handle: DriverHostControlHandle,
434        method_type: fidl::MethodType,
435    },
436}
437
438impl DriverHostRequest {
439    #[allow(irrefutable_let_patterns)]
440    pub fn into_load_driver(
441        self,
442    ) -> Option<(DriverHostLoadDriverRequest, DriverHostLoadDriverResponder)> {
443        if let DriverHostRequest::LoadDriver { payload, responder } = self {
444            Some((payload, responder))
445        } else {
446            None
447        }
448    }
449
450    /// Name of the method defined in FIDL
451    pub fn method_name(&self) -> &'static str {
452        match *self {
453            DriverHostRequest::LoadDriver { .. } => "load_driver",
454            DriverHostRequest::_UnknownMethod { method_type: fidl::MethodType::OneWay, .. } => {
455                "unknown one-way method"
456            }
457            DriverHostRequest::_UnknownMethod { method_type: fidl::MethodType::TwoWay, .. } => {
458                "unknown two-way method"
459            }
460        }
461    }
462}
463
464#[derive(Debug, Clone)]
465pub struct DriverHostControlHandle {
466    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
467}
468
469impl fidl::endpoints::ControlHandle for DriverHostControlHandle {
470    fn shutdown(&self) {
471        self.inner.shutdown()
472    }
473    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
474        self.inner.shutdown_with_epitaph(status)
475    }
476
477    fn is_closed(&self) -> bool {
478        self.inner.channel().is_closed()
479    }
480    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
481        self.inner.channel().on_closed()
482    }
483
484    #[cfg(target_os = "fuchsia")]
485    fn signal_peer(
486        &self,
487        clear_mask: zx::Signals,
488        set_mask: zx::Signals,
489    ) -> Result<(), zx_status::Status> {
490        use fidl::Peered;
491        self.inner.channel().signal_peer(clear_mask, set_mask)
492    }
493}
494
495impl DriverHostControlHandle {}
496
497#[must_use = "FIDL methods require a response to be sent"]
498#[derive(Debug)]
499pub struct DriverHostLoadDriverResponder {
500    control_handle: std::mem::ManuallyDrop<DriverHostControlHandle>,
501    tx_id: u32,
502}
503
504/// Set the the channel to be shutdown (see [`DriverHostControlHandle::shutdown`])
505/// if the responder is dropped without sending a response, so that the client
506/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
507impl std::ops::Drop for DriverHostLoadDriverResponder {
508    fn drop(&mut self) {
509        self.control_handle.shutdown();
510        // Safety: drops once, never accessed again
511        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
512    }
513}
514
515impl fidl::endpoints::Responder for DriverHostLoadDriverResponder {
516    type ControlHandle = DriverHostControlHandle;
517
518    fn control_handle(&self) -> &DriverHostControlHandle {
519        &self.control_handle
520    }
521
522    fn drop_without_shutdown(mut self) {
523        // Safety: drops once, never accessed again due to mem::forget
524        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
525        // Prevent Drop from running (which would shut down the channel)
526        std::mem::forget(self);
527    }
528}
529
530impl DriverHostLoadDriverResponder {
531    /// Sends a response to the FIDL transaction.
532    ///
533    /// Sets the channel to shutdown if an error occurs.
534    pub fn send(
535        self,
536        mut result: Result<&DriverHostLoadDriverResponse, i32>,
537    ) -> Result<(), fidl::Error> {
538        let _result = self.send_raw(result);
539        if _result.is_err() {
540            self.control_handle.shutdown();
541        }
542        self.drop_without_shutdown();
543        _result
544    }
545
546    /// Similar to "send" but does not shutdown the channel if an error occurs.
547    pub fn send_no_shutdown_on_err(
548        self,
549        mut result: Result<&DriverHostLoadDriverResponse, i32>,
550    ) -> Result<(), fidl::Error> {
551        let _result = self.send_raw(result);
552        self.drop_without_shutdown();
553        _result
554    }
555
556    fn send_raw(
557        &self,
558        mut result: Result<&DriverHostLoadDriverResponse, i32>,
559    ) -> Result<(), fidl::Error> {
560        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
561            DriverHostLoadDriverResponse,
562            i32,
563        >>(
564            fidl::encoding::FlexibleResult::new(result),
565            self.tx_id,
566            0x5c43a774b3fd4930,
567            fidl::encoding::DynamicFlags::FLEXIBLE,
568        )
569    }
570}
571
572#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
573pub struct DriverHostLauncherMarker;
574
575impl fidl::endpoints::ProtocolMarker for DriverHostLauncherMarker {
576    type Proxy = DriverHostLauncherProxy;
577    type RequestStream = DriverHostLauncherRequestStream;
578    #[cfg(target_os = "fuchsia")]
579    type SynchronousProxy = DriverHostLauncherSynchronousProxy;
580
581    const DEBUG_NAME: &'static str = "fuchsia.driver.loader.DriverHostLauncher";
582}
583impl fidl::endpoints::DiscoverableProtocolMarker for DriverHostLauncherMarker {}
584pub type DriverHostLauncherLaunchResult = Result<(), i32>;
585
586pub trait DriverHostLauncherProxyInterface: Send + Sync {
587    type LaunchResponseFut: std::future::Future<Output = Result<DriverHostLauncherLaunchResult, fidl::Error>>
588        + Send;
589    fn r#launch(&self, payload: DriverHostLauncherLaunchRequest) -> Self::LaunchResponseFut;
590}
591#[derive(Debug)]
592#[cfg(target_os = "fuchsia")]
593pub struct DriverHostLauncherSynchronousProxy {
594    client: fidl::client::sync::Client,
595}
596
597#[cfg(target_os = "fuchsia")]
598impl fidl::endpoints::SynchronousProxy for DriverHostLauncherSynchronousProxy {
599    type Proxy = DriverHostLauncherProxy;
600    type Protocol = DriverHostLauncherMarker;
601
602    fn from_channel(inner: fidl::Channel) -> Self {
603        Self::new(inner)
604    }
605
606    fn into_channel(self) -> fidl::Channel {
607        self.client.into_channel()
608    }
609
610    fn as_channel(&self) -> &fidl::Channel {
611        self.client.as_channel()
612    }
613}
614
615#[cfg(target_os = "fuchsia")]
616impl DriverHostLauncherSynchronousProxy {
617    pub fn new(channel: fidl::Channel) -> Self {
618        let protocol_name =
619            <DriverHostLauncherMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
620        Self { client: fidl::client::sync::Client::new(channel, protocol_name) }
621    }
622
623    pub fn into_channel(self) -> fidl::Channel {
624        self.client.into_channel()
625    }
626
627    /// Waits until an event arrives and returns it. It is safe for other
628    /// threads to make concurrent requests while waiting for an event.
629    pub fn wait_for_event(
630        &self,
631        deadline: zx::MonotonicInstant,
632    ) -> Result<DriverHostLauncherEvent, fidl::Error> {
633        DriverHostLauncherEvent::decode(self.client.wait_for_event(deadline)?)
634    }
635
636    /// Launches |driver_host_binary| into |process|. This includes:
637    ///  - Setting up the address space for driver host module and dependencies
638    ///    using remote dynamic linking.
639    ///  - Creating the stack for the process.
640    ///  - Starting the process.
641    ///  - Sending the bootstrap messages to the process.
642    pub fn r#launch(
643        &self,
644        mut payload: DriverHostLauncherLaunchRequest,
645        ___deadline: zx::MonotonicInstant,
646    ) -> Result<DriverHostLauncherLaunchResult, fidl::Error> {
647        let _response = self.client.send_query::<
648            DriverHostLauncherLaunchRequest,
649            fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, i32>,
650        >(
651            &mut payload,
652            0x3af75d84043eb730,
653            fidl::encoding::DynamicFlags::FLEXIBLE,
654            ___deadline,
655        )?
656        .into_result::<DriverHostLauncherMarker>("launch")?;
657        Ok(_response.map(|x| x))
658    }
659}
660
661#[derive(Debug, Clone)]
662pub struct DriverHostLauncherProxy {
663    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
664}
665
666impl fidl::endpoints::Proxy for DriverHostLauncherProxy {
667    type Protocol = DriverHostLauncherMarker;
668
669    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
670        Self::new(inner)
671    }
672
673    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
674        self.client.into_channel().map_err(|client| Self { client })
675    }
676
677    fn as_channel(&self) -> &::fidl::AsyncChannel {
678        self.client.as_channel()
679    }
680}
681
682impl DriverHostLauncherProxy {
683    /// Create a new Proxy for fuchsia.driver.loader/DriverHostLauncher.
684    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
685        let protocol_name =
686            <DriverHostLauncherMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
687        Self { client: fidl::client::Client::new(channel, protocol_name) }
688    }
689
690    /// Get a Stream of events from the remote end of the protocol.
691    ///
692    /// # Panics
693    ///
694    /// Panics if the event stream was already taken.
695    pub fn take_event_stream(&self) -> DriverHostLauncherEventStream {
696        DriverHostLauncherEventStream { event_receiver: self.client.take_event_receiver() }
697    }
698
699    /// Launches |driver_host_binary| into |process|. This includes:
700    ///  - Setting up the address space for driver host module and dependencies
701    ///    using remote dynamic linking.
702    ///  - Creating the stack for the process.
703    ///  - Starting the process.
704    ///  - Sending the bootstrap messages to the process.
705    pub fn r#launch(
706        &self,
707        mut payload: DriverHostLauncherLaunchRequest,
708    ) -> fidl::client::QueryResponseFut<
709        DriverHostLauncherLaunchResult,
710        fidl::encoding::DefaultFuchsiaResourceDialect,
711    > {
712        DriverHostLauncherProxyInterface::r#launch(self, payload)
713    }
714}
715
716impl DriverHostLauncherProxyInterface for DriverHostLauncherProxy {
717    type LaunchResponseFut = fidl::client::QueryResponseFut<
718        DriverHostLauncherLaunchResult,
719        fidl::encoding::DefaultFuchsiaResourceDialect,
720    >;
721    fn r#launch(&self, mut payload: DriverHostLauncherLaunchRequest) -> Self::LaunchResponseFut {
722        fn _decode(
723            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
724        ) -> Result<DriverHostLauncherLaunchResult, fidl::Error> {
725            let _response = fidl::client::decode_transaction_body::<
726                fidl::encoding::FlexibleResultType<fidl::encoding::EmptyStruct, i32>,
727                fidl::encoding::DefaultFuchsiaResourceDialect,
728                0x3af75d84043eb730,
729            >(_buf?)?
730            .into_result::<DriverHostLauncherMarker>("launch")?;
731            Ok(_response.map(|x| x))
732        }
733        self.client.send_query_and_decode::<
734            DriverHostLauncherLaunchRequest,
735            DriverHostLauncherLaunchResult,
736        >(
737            &mut payload,
738            0x3af75d84043eb730,
739            fidl::encoding::DynamicFlags::FLEXIBLE,
740            _decode,
741        )
742    }
743}
744
745pub struct DriverHostLauncherEventStream {
746    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
747}
748
749impl std::marker::Unpin for DriverHostLauncherEventStream {}
750
751impl futures::stream::FusedStream for DriverHostLauncherEventStream {
752    fn is_terminated(&self) -> bool {
753        self.event_receiver.is_terminated()
754    }
755}
756
757impl futures::Stream for DriverHostLauncherEventStream {
758    type Item = Result<DriverHostLauncherEvent, fidl::Error>;
759
760    fn poll_next(
761        mut self: std::pin::Pin<&mut Self>,
762        cx: &mut std::task::Context<'_>,
763    ) -> std::task::Poll<Option<Self::Item>> {
764        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
765            &mut self.event_receiver,
766            cx
767        )?) {
768            Some(buf) => std::task::Poll::Ready(Some(DriverHostLauncherEvent::decode(buf))),
769            None => std::task::Poll::Ready(None),
770        }
771    }
772}
773
774#[derive(Debug)]
775pub enum DriverHostLauncherEvent {
776    #[non_exhaustive]
777    _UnknownEvent {
778        /// Ordinal of the event that was sent.
779        ordinal: u64,
780    },
781}
782
783impl DriverHostLauncherEvent {
784    /// Decodes a message buffer as a [`DriverHostLauncherEvent`].
785    fn decode(
786        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
787    ) -> Result<DriverHostLauncherEvent, fidl::Error> {
788        let (bytes, _handles) = buf.split_mut();
789        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
790        debug_assert_eq!(tx_header.tx_id, 0);
791        match tx_header.ordinal {
792            _ if tx_header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
793                Ok(DriverHostLauncherEvent::_UnknownEvent { ordinal: tx_header.ordinal })
794            }
795            _ => Err(fidl::Error::UnknownOrdinal {
796                ordinal: tx_header.ordinal,
797                protocol_name:
798                    <DriverHostLauncherMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
799            }),
800        }
801    }
802}
803
804/// A Stream of incoming requests for fuchsia.driver.loader/DriverHostLauncher.
805pub struct DriverHostLauncherRequestStream {
806    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
807    is_terminated: bool,
808}
809
810impl std::marker::Unpin for DriverHostLauncherRequestStream {}
811
812impl futures::stream::FusedStream for DriverHostLauncherRequestStream {
813    fn is_terminated(&self) -> bool {
814        self.is_terminated
815    }
816}
817
818impl fidl::endpoints::RequestStream for DriverHostLauncherRequestStream {
819    type Protocol = DriverHostLauncherMarker;
820    type ControlHandle = DriverHostLauncherControlHandle;
821
822    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
823        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
824    }
825
826    fn control_handle(&self) -> Self::ControlHandle {
827        DriverHostLauncherControlHandle { inner: self.inner.clone() }
828    }
829
830    fn into_inner(
831        self,
832    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
833    {
834        (self.inner, self.is_terminated)
835    }
836
837    fn from_inner(
838        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
839        is_terminated: bool,
840    ) -> Self {
841        Self { inner, is_terminated }
842    }
843}
844
845impl futures::Stream for DriverHostLauncherRequestStream {
846    type Item = Result<DriverHostLauncherRequest, fidl::Error>;
847
848    fn poll_next(
849        mut self: std::pin::Pin<&mut Self>,
850        cx: &mut std::task::Context<'_>,
851    ) -> std::task::Poll<Option<Self::Item>> {
852        let this = &mut *self;
853        if this.inner.check_shutdown(cx) {
854            this.is_terminated = true;
855            return std::task::Poll::Ready(None);
856        }
857        if this.is_terminated {
858            panic!("polled DriverHostLauncherRequestStream after completion");
859        }
860        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
861            |bytes, handles| {
862                match this.inner.channel().read_etc(cx, bytes, handles) {
863                    std::task::Poll::Ready(Ok(())) => {}
864                    std::task::Poll::Pending => return std::task::Poll::Pending,
865                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
866                        this.is_terminated = true;
867                        return std::task::Poll::Ready(None);
868                    }
869                    std::task::Poll::Ready(Err(e)) => {
870                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
871                            e.into(),
872                        ))))
873                    }
874                }
875
876                // A message has been received from the channel
877                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
878
879                std::task::Poll::Ready(Some(match header.ordinal {
880                0x3af75d84043eb730 => {
881                    header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
882                    let mut req = fidl::new_empty!(DriverHostLauncherLaunchRequest, fidl::encoding::DefaultFuchsiaResourceDialect);
883                    fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<DriverHostLauncherLaunchRequest>(&header, _body_bytes, handles, &mut req)?;
884                    let control_handle = DriverHostLauncherControlHandle {
885                        inner: this.inner.clone(),
886                    };
887                    Ok(DriverHostLauncherRequest::Launch {payload: req,
888                        responder: DriverHostLauncherLaunchResponder {
889                            control_handle: std::mem::ManuallyDrop::new(control_handle),
890                            tx_id: header.tx_id,
891                        },
892                    })
893                }
894                _ if header.tx_id == 0 && header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
895                    Ok(DriverHostLauncherRequest::_UnknownMethod {
896                        ordinal: header.ordinal,
897                        control_handle: DriverHostLauncherControlHandle { inner: this.inner.clone() },
898                        method_type: fidl::MethodType::OneWay,
899                    })
900                }
901                _ if header.dynamic_flags().contains(fidl::encoding::DynamicFlags::FLEXIBLE) => {
902                    this.inner.send_framework_err(
903                        fidl::encoding::FrameworkErr::UnknownMethod,
904                        header.tx_id,
905                        header.ordinal,
906                        header.dynamic_flags(),
907                        (bytes, handles),
908                    )?;
909                    Ok(DriverHostLauncherRequest::_UnknownMethod {
910                        ordinal: header.ordinal,
911                        control_handle: DriverHostLauncherControlHandle { inner: this.inner.clone() },
912                        method_type: fidl::MethodType::TwoWay,
913                    })
914                }
915                _ => Err(fidl::Error::UnknownOrdinal {
916                    ordinal: header.ordinal,
917                    protocol_name: <DriverHostLauncherMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
918                }),
919            }))
920            },
921        )
922    }
923}
924
925/// Protocol through which a driver host can be launched into a process,
926/// with loading done using remote dynamic linking.
927#[derive(Debug)]
928pub enum DriverHostLauncherRequest {
929    /// Launches |driver_host_binary| into |process|. This includes:
930    ///  - Setting up the address space for driver host module and dependencies
931    ///    using remote dynamic linking.
932    ///  - Creating the stack for the process.
933    ///  - Starting the process.
934    ///  - Sending the bootstrap messages to the process.
935    Launch {
936        payload: DriverHostLauncherLaunchRequest,
937        responder: DriverHostLauncherLaunchResponder,
938    },
939    /// An interaction was received which does not match any known method.
940    #[non_exhaustive]
941    _UnknownMethod {
942        /// Ordinal of the method that was called.
943        ordinal: u64,
944        control_handle: DriverHostLauncherControlHandle,
945        method_type: fidl::MethodType,
946    },
947}
948
949impl DriverHostLauncherRequest {
950    #[allow(irrefutable_let_patterns)]
951    pub fn into_launch(
952        self,
953    ) -> Option<(DriverHostLauncherLaunchRequest, DriverHostLauncherLaunchResponder)> {
954        if let DriverHostLauncherRequest::Launch { payload, responder } = self {
955            Some((payload, responder))
956        } else {
957            None
958        }
959    }
960
961    /// Name of the method defined in FIDL
962    pub fn method_name(&self) -> &'static str {
963        match *self {
964            DriverHostLauncherRequest::Launch { .. } => "launch",
965            DriverHostLauncherRequest::_UnknownMethod {
966                method_type: fidl::MethodType::OneWay,
967                ..
968            } => "unknown one-way method",
969            DriverHostLauncherRequest::_UnknownMethod {
970                method_type: fidl::MethodType::TwoWay,
971                ..
972            } => "unknown two-way method",
973        }
974    }
975}
976
977#[derive(Debug, Clone)]
978pub struct DriverHostLauncherControlHandle {
979    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
980}
981
982impl fidl::endpoints::ControlHandle for DriverHostLauncherControlHandle {
983    fn shutdown(&self) {
984        self.inner.shutdown()
985    }
986    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
987        self.inner.shutdown_with_epitaph(status)
988    }
989
990    fn is_closed(&self) -> bool {
991        self.inner.channel().is_closed()
992    }
993    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
994        self.inner.channel().on_closed()
995    }
996
997    #[cfg(target_os = "fuchsia")]
998    fn signal_peer(
999        &self,
1000        clear_mask: zx::Signals,
1001        set_mask: zx::Signals,
1002    ) -> Result<(), zx_status::Status> {
1003        use fidl::Peered;
1004        self.inner.channel().signal_peer(clear_mask, set_mask)
1005    }
1006}
1007
1008impl DriverHostLauncherControlHandle {}
1009
1010#[must_use = "FIDL methods require a response to be sent"]
1011#[derive(Debug)]
1012pub struct DriverHostLauncherLaunchResponder {
1013    control_handle: std::mem::ManuallyDrop<DriverHostLauncherControlHandle>,
1014    tx_id: u32,
1015}
1016
1017/// Set the the channel to be shutdown (see [`DriverHostLauncherControlHandle::shutdown`])
1018/// if the responder is dropped without sending a response, so that the client
1019/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
1020impl std::ops::Drop for DriverHostLauncherLaunchResponder {
1021    fn drop(&mut self) {
1022        self.control_handle.shutdown();
1023        // Safety: drops once, never accessed again
1024        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1025    }
1026}
1027
1028impl fidl::endpoints::Responder for DriverHostLauncherLaunchResponder {
1029    type ControlHandle = DriverHostLauncherControlHandle;
1030
1031    fn control_handle(&self) -> &DriverHostLauncherControlHandle {
1032        &self.control_handle
1033    }
1034
1035    fn drop_without_shutdown(mut self) {
1036        // Safety: drops once, never accessed again due to mem::forget
1037        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
1038        // Prevent Drop from running (which would shut down the channel)
1039        std::mem::forget(self);
1040    }
1041}
1042
1043impl DriverHostLauncherLaunchResponder {
1044    /// Sends a response to the FIDL transaction.
1045    ///
1046    /// Sets the channel to shutdown if an error occurs.
1047    pub fn send(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1048        let _result = self.send_raw(result);
1049        if _result.is_err() {
1050            self.control_handle.shutdown();
1051        }
1052        self.drop_without_shutdown();
1053        _result
1054    }
1055
1056    /// Similar to "send" but does not shutdown the channel if an error occurs.
1057    pub fn send_no_shutdown_on_err(self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1058        let _result = self.send_raw(result);
1059        self.drop_without_shutdown();
1060        _result
1061    }
1062
1063    fn send_raw(&self, mut result: Result<(), i32>) -> Result<(), fidl::Error> {
1064        self.control_handle.inner.send::<fidl::encoding::FlexibleResultType<
1065            fidl::encoding::EmptyStruct,
1066            i32,
1067        >>(
1068            fidl::encoding::FlexibleResult::new(result),
1069            self.tx_id,
1070            0x3af75d84043eb730,
1071            fidl::encoding::DynamicFlags::FLEXIBLE,
1072        )
1073    }
1074}
1075
1076mod internal {
1077    use super::*;
1078
1079    impl DriverHostLauncherLaunchRequest {
1080        #[inline(always)]
1081        fn max_ordinal_present(&self) -> u64 {
1082            if let Some(_) = self.driver_host {
1083                return 6;
1084            }
1085            if let Some(_) = self.driver_host_libs {
1086                return 5;
1087            }
1088            if let Some(_) = self.vdso {
1089                return 4;
1090            }
1091            if let Some(_) = self.driver_host_binary {
1092                return 3;
1093            }
1094            if let Some(_) = self.root_vmar {
1095                return 2;
1096            }
1097            if let Some(_) = self.process {
1098                return 1;
1099            }
1100            0
1101        }
1102    }
1103
1104    impl fidl::encoding::ResourceTypeMarker for DriverHostLauncherLaunchRequest {
1105        type Borrowed<'a> = &'a mut Self;
1106        fn take_or_borrow<'a>(
1107            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1108        ) -> Self::Borrowed<'a> {
1109            value
1110        }
1111    }
1112
1113    unsafe impl fidl::encoding::TypeMarker for DriverHostLauncherLaunchRequest {
1114        type Owned = Self;
1115
1116        #[inline(always)]
1117        fn inline_align(_context: fidl::encoding::Context) -> usize {
1118            8
1119        }
1120
1121        #[inline(always)]
1122        fn inline_size(_context: fidl::encoding::Context) -> usize {
1123            16
1124        }
1125    }
1126
1127    unsafe impl
1128        fidl::encoding::Encode<
1129            DriverHostLauncherLaunchRequest,
1130            fidl::encoding::DefaultFuchsiaResourceDialect,
1131        > for &mut DriverHostLauncherLaunchRequest
1132    {
1133        unsafe fn encode(
1134            self,
1135            encoder: &mut fidl::encoding::Encoder<
1136                '_,
1137                fidl::encoding::DefaultFuchsiaResourceDialect,
1138            >,
1139            offset: usize,
1140            mut depth: fidl::encoding::Depth,
1141        ) -> fidl::Result<()> {
1142            encoder.debug_check_bounds::<DriverHostLauncherLaunchRequest>(offset);
1143            // Vector header
1144            let max_ordinal: u64 = self.max_ordinal_present();
1145            encoder.write_num(max_ordinal, offset);
1146            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1147            // Calling encoder.out_of_line_offset(0) is not allowed.
1148            if max_ordinal == 0 {
1149                return Ok(());
1150            }
1151            depth.increment()?;
1152            let envelope_size = 8;
1153            let bytes_len = max_ordinal as usize * envelope_size;
1154            #[allow(unused_variables)]
1155            let offset = encoder.out_of_line_offset(bytes_len);
1156            let mut _prev_end_offset: usize = 0;
1157            if 1 > max_ordinal {
1158                return Ok(());
1159            }
1160
1161            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1162            // are envelope_size bytes.
1163            let cur_offset: usize = (1 - 1) * envelope_size;
1164
1165            // Zero reserved fields.
1166            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1167
1168            // Safety:
1169            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1170            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1171            //   envelope_size bytes, there is always sufficient room.
1172            fidl::encoding::encode_in_envelope_optional::<
1173                fidl::encoding::HandleType<
1174                    fidl::Process,
1175                    { fidl::ObjectType::PROCESS.into_raw() },
1176                    2147483648,
1177                >,
1178                fidl::encoding::DefaultFuchsiaResourceDialect,
1179            >(
1180                self.process.as_mut().map(
1181                    <fidl::encoding::HandleType<
1182                        fidl::Process,
1183                        { fidl::ObjectType::PROCESS.into_raw() },
1184                        2147483648,
1185                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1186                ),
1187                encoder,
1188                offset + cur_offset,
1189                depth,
1190            )?;
1191
1192            _prev_end_offset = cur_offset + envelope_size;
1193            if 2 > max_ordinal {
1194                return Ok(());
1195            }
1196
1197            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1198            // are envelope_size bytes.
1199            let cur_offset: usize = (2 - 1) * envelope_size;
1200
1201            // Zero reserved fields.
1202            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1203
1204            // Safety:
1205            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1206            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1207            //   envelope_size bytes, there is always sufficient room.
1208            fidl::encoding::encode_in_envelope_optional::<
1209                fidl::encoding::HandleType<
1210                    fidl::Vmar,
1211                    { fidl::ObjectType::VMAR.into_raw() },
1212                    2147483648,
1213                >,
1214                fidl::encoding::DefaultFuchsiaResourceDialect,
1215            >(
1216                self.root_vmar.as_mut().map(
1217                    <fidl::encoding::HandleType<
1218                        fidl::Vmar,
1219                        { fidl::ObjectType::VMAR.into_raw() },
1220                        2147483648,
1221                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1222                ),
1223                encoder,
1224                offset + cur_offset,
1225                depth,
1226            )?;
1227
1228            _prev_end_offset = cur_offset + envelope_size;
1229            if 3 > max_ordinal {
1230                return Ok(());
1231            }
1232
1233            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1234            // are envelope_size bytes.
1235            let cur_offset: usize = (3 - 1) * envelope_size;
1236
1237            // Zero reserved fields.
1238            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1239
1240            // Safety:
1241            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1242            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1243            //   envelope_size bytes, there is always sufficient room.
1244            fidl::encoding::encode_in_envelope_optional::<
1245                fidl::encoding::HandleType<
1246                    fidl::Vmo,
1247                    { fidl::ObjectType::VMO.into_raw() },
1248                    2147483648,
1249                >,
1250                fidl::encoding::DefaultFuchsiaResourceDialect,
1251            >(
1252                self.driver_host_binary.as_mut().map(
1253                    <fidl::encoding::HandleType<
1254                        fidl::Vmo,
1255                        { fidl::ObjectType::VMO.into_raw() },
1256                        2147483648,
1257                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1258                ),
1259                encoder,
1260                offset + cur_offset,
1261                depth,
1262            )?;
1263
1264            _prev_end_offset = cur_offset + envelope_size;
1265            if 4 > max_ordinal {
1266                return Ok(());
1267            }
1268
1269            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1270            // are envelope_size bytes.
1271            let cur_offset: usize = (4 - 1) * envelope_size;
1272
1273            // Zero reserved fields.
1274            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1275
1276            // Safety:
1277            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1278            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1279            //   envelope_size bytes, there is always sufficient room.
1280            fidl::encoding::encode_in_envelope_optional::<
1281                fidl::encoding::HandleType<
1282                    fidl::Vmo,
1283                    { fidl::ObjectType::VMO.into_raw() },
1284                    2147483648,
1285                >,
1286                fidl::encoding::DefaultFuchsiaResourceDialect,
1287            >(
1288                self.vdso.as_mut().map(
1289                    <fidl::encoding::HandleType<
1290                        fidl::Vmo,
1291                        { fidl::ObjectType::VMO.into_raw() },
1292                        2147483648,
1293                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1294                ),
1295                encoder,
1296                offset + cur_offset,
1297                depth,
1298            )?;
1299
1300            _prev_end_offset = cur_offset + envelope_size;
1301            if 5 > max_ordinal {
1302                return Ok(());
1303            }
1304
1305            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1306            // are envelope_size bytes.
1307            let cur_offset: usize = (5 - 1) * envelope_size;
1308
1309            // Zero reserved fields.
1310            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1311
1312            // Safety:
1313            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1314            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1315            //   envelope_size bytes, there is always sufficient room.
1316            fidl::encoding::encode_in_envelope_optional::<
1317                fidl::encoding::Endpoint<
1318                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1319                >,
1320                fidl::encoding::DefaultFuchsiaResourceDialect,
1321            >(
1322                self.driver_host_libs.as_mut().map(
1323                    <fidl::encoding::Endpoint<
1324                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1325                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1326                ),
1327                encoder,
1328                offset + cur_offset,
1329                depth,
1330            )?;
1331
1332            _prev_end_offset = cur_offset + envelope_size;
1333            if 6 > max_ordinal {
1334                return Ok(());
1335            }
1336
1337            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1338            // are envelope_size bytes.
1339            let cur_offset: usize = (6 - 1) * envelope_size;
1340
1341            // Zero reserved fields.
1342            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1343
1344            // Safety:
1345            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1346            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1347            //   envelope_size bytes, there is always sufficient room.
1348            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<DriverHostMarker>>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1349            self.driver_host.as_mut().map(<fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<DriverHostMarker>> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
1350            encoder, offset + cur_offset, depth
1351        )?;
1352
1353            _prev_end_offset = cur_offset + envelope_size;
1354
1355            Ok(())
1356        }
1357    }
1358
1359    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1360        for DriverHostLauncherLaunchRequest
1361    {
1362        #[inline(always)]
1363        fn new_empty() -> Self {
1364            Self::default()
1365        }
1366
1367        unsafe fn decode(
1368            &mut self,
1369            decoder: &mut fidl::encoding::Decoder<
1370                '_,
1371                fidl::encoding::DefaultFuchsiaResourceDialect,
1372            >,
1373            offset: usize,
1374            mut depth: fidl::encoding::Depth,
1375        ) -> fidl::Result<()> {
1376            decoder.debug_check_bounds::<Self>(offset);
1377            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1378                None => return Err(fidl::Error::NotNullable),
1379                Some(len) => len,
1380            };
1381            // Calling decoder.out_of_line_offset(0) is not allowed.
1382            if len == 0 {
1383                return Ok(());
1384            };
1385            depth.increment()?;
1386            let envelope_size = 8;
1387            let bytes_len = len * envelope_size;
1388            let offset = decoder.out_of_line_offset(bytes_len)?;
1389            // Decode the envelope for each type.
1390            let mut _next_ordinal_to_read = 0;
1391            let mut next_offset = offset;
1392            let end_offset = offset + bytes_len;
1393            _next_ordinal_to_read += 1;
1394            if next_offset >= end_offset {
1395                return Ok(());
1396            }
1397
1398            // Decode unknown envelopes for gaps in ordinals.
1399            while _next_ordinal_to_read < 1 {
1400                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1401                _next_ordinal_to_read += 1;
1402                next_offset += envelope_size;
1403            }
1404
1405            let next_out_of_line = decoder.next_out_of_line();
1406            let handles_before = decoder.remaining_handles();
1407            if let Some((inlined, num_bytes, num_handles)) =
1408                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1409            {
1410                let member_inline_size = <fidl::encoding::HandleType<
1411                    fidl::Process,
1412                    { fidl::ObjectType::PROCESS.into_raw() },
1413                    2147483648,
1414                > as fidl::encoding::TypeMarker>::inline_size(
1415                    decoder.context
1416                );
1417                if inlined != (member_inline_size <= 4) {
1418                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1419                }
1420                let inner_offset;
1421                let mut inner_depth = depth.clone();
1422                if inlined {
1423                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1424                    inner_offset = next_offset;
1425                } else {
1426                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1427                    inner_depth.increment()?;
1428                }
1429                let val_ref =
1430                self.process.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Process, { fidl::ObjectType::PROCESS.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
1431                fidl::decode!(fidl::encoding::HandleType<fidl::Process, { fidl::ObjectType::PROCESS.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
1432                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1433                {
1434                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1435                }
1436                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1437                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1438                }
1439            }
1440
1441            next_offset += envelope_size;
1442            _next_ordinal_to_read += 1;
1443            if next_offset >= end_offset {
1444                return Ok(());
1445            }
1446
1447            // Decode unknown envelopes for gaps in ordinals.
1448            while _next_ordinal_to_read < 2 {
1449                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1450                _next_ordinal_to_read += 1;
1451                next_offset += envelope_size;
1452            }
1453
1454            let next_out_of_line = decoder.next_out_of_line();
1455            let handles_before = decoder.remaining_handles();
1456            if let Some((inlined, num_bytes, num_handles)) =
1457                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1458            {
1459                let member_inline_size = <fidl::encoding::HandleType<
1460                    fidl::Vmar,
1461                    { fidl::ObjectType::VMAR.into_raw() },
1462                    2147483648,
1463                > as fidl::encoding::TypeMarker>::inline_size(
1464                    decoder.context
1465                );
1466                if inlined != (member_inline_size <= 4) {
1467                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1468                }
1469                let inner_offset;
1470                let mut inner_depth = depth.clone();
1471                if inlined {
1472                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1473                    inner_offset = next_offset;
1474                } else {
1475                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1476                    inner_depth.increment()?;
1477                }
1478                let val_ref =
1479                self.root_vmar.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmar, { fidl::ObjectType::VMAR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
1480                fidl::decode!(fidl::encoding::HandleType<fidl::Vmar, { fidl::ObjectType::VMAR.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
1481                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1482                {
1483                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1484                }
1485                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1486                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1487                }
1488            }
1489
1490            next_offset += envelope_size;
1491            _next_ordinal_to_read += 1;
1492            if next_offset >= end_offset {
1493                return Ok(());
1494            }
1495
1496            // Decode unknown envelopes for gaps in ordinals.
1497            while _next_ordinal_to_read < 3 {
1498                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1499                _next_ordinal_to_read += 1;
1500                next_offset += envelope_size;
1501            }
1502
1503            let next_out_of_line = decoder.next_out_of_line();
1504            let handles_before = decoder.remaining_handles();
1505            if let Some((inlined, num_bytes, num_handles)) =
1506                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1507            {
1508                let member_inline_size = <fidl::encoding::HandleType<
1509                    fidl::Vmo,
1510                    { fidl::ObjectType::VMO.into_raw() },
1511                    2147483648,
1512                > as fidl::encoding::TypeMarker>::inline_size(
1513                    decoder.context
1514                );
1515                if inlined != (member_inline_size <= 4) {
1516                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1517                }
1518                let inner_offset;
1519                let mut inner_depth = depth.clone();
1520                if inlined {
1521                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1522                    inner_offset = next_offset;
1523                } else {
1524                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1525                    inner_depth.increment()?;
1526                }
1527                let val_ref =
1528                self.driver_host_binary.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
1529                fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
1530                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1531                {
1532                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1533                }
1534                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1535                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1536                }
1537            }
1538
1539            next_offset += envelope_size;
1540            _next_ordinal_to_read += 1;
1541            if next_offset >= end_offset {
1542                return Ok(());
1543            }
1544
1545            // Decode unknown envelopes for gaps in ordinals.
1546            while _next_ordinal_to_read < 4 {
1547                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1548                _next_ordinal_to_read += 1;
1549                next_offset += envelope_size;
1550            }
1551
1552            let next_out_of_line = decoder.next_out_of_line();
1553            let handles_before = decoder.remaining_handles();
1554            if let Some((inlined, num_bytes, num_handles)) =
1555                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1556            {
1557                let member_inline_size = <fidl::encoding::HandleType<
1558                    fidl::Vmo,
1559                    { fidl::ObjectType::VMO.into_raw() },
1560                    2147483648,
1561                > as fidl::encoding::TypeMarker>::inline_size(
1562                    decoder.context
1563                );
1564                if inlined != (member_inline_size <= 4) {
1565                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1566                }
1567                let inner_offset;
1568                let mut inner_depth = depth.clone();
1569                if inlined {
1570                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1571                    inner_offset = next_offset;
1572                } else {
1573                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1574                    inner_depth.increment()?;
1575                }
1576                let val_ref =
1577                self.vdso.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
1578                fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
1579                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1580                {
1581                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1582                }
1583                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1584                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1585                }
1586            }
1587
1588            next_offset += envelope_size;
1589            _next_ordinal_to_read += 1;
1590            if next_offset >= end_offset {
1591                return Ok(());
1592            }
1593
1594            // Decode unknown envelopes for gaps in ordinals.
1595            while _next_ordinal_to_read < 5 {
1596                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1597                _next_ordinal_to_read += 1;
1598                next_offset += envelope_size;
1599            }
1600
1601            let next_out_of_line = decoder.next_out_of_line();
1602            let handles_before = decoder.remaining_handles();
1603            if let Some((inlined, num_bytes, num_handles)) =
1604                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1605            {
1606                let member_inline_size = <fidl::encoding::Endpoint<
1607                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1608                > as fidl::encoding::TypeMarker>::inline_size(
1609                    decoder.context
1610                );
1611                if inlined != (member_inline_size <= 4) {
1612                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1613                }
1614                let inner_offset;
1615                let mut inner_depth = depth.clone();
1616                if inlined {
1617                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1618                    inner_offset = next_offset;
1619                } else {
1620                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1621                    inner_depth.increment()?;
1622                }
1623                let val_ref = self.driver_host_libs.get_or_insert_with(|| {
1624                    fidl::new_empty!(
1625                        fidl::encoding::Endpoint<
1626                            fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1627                        >,
1628                        fidl::encoding::DefaultFuchsiaResourceDialect
1629                    )
1630                });
1631                fidl::decode!(
1632                    fidl::encoding::Endpoint<
1633                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1634                    >,
1635                    fidl::encoding::DefaultFuchsiaResourceDialect,
1636                    val_ref,
1637                    decoder,
1638                    inner_offset,
1639                    inner_depth
1640                )?;
1641                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1642                {
1643                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1644                }
1645                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1646                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1647                }
1648            }
1649
1650            next_offset += envelope_size;
1651            _next_ordinal_to_read += 1;
1652            if next_offset >= end_offset {
1653                return Ok(());
1654            }
1655
1656            // Decode unknown envelopes for gaps in ordinals.
1657            while _next_ordinal_to_read < 6 {
1658                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1659                _next_ordinal_to_read += 1;
1660                next_offset += envelope_size;
1661            }
1662
1663            let next_out_of_line = decoder.next_out_of_line();
1664            let handles_before = decoder.remaining_handles();
1665            if let Some((inlined, num_bytes, num_handles)) =
1666                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1667            {
1668                let member_inline_size = <fidl::encoding::Endpoint<
1669                    fidl::endpoints::ServerEnd<DriverHostMarker>,
1670                > as fidl::encoding::TypeMarker>::inline_size(
1671                    decoder.context
1672                );
1673                if inlined != (member_inline_size <= 4) {
1674                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1675                }
1676                let inner_offset;
1677                let mut inner_depth = depth.clone();
1678                if inlined {
1679                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1680                    inner_offset = next_offset;
1681                } else {
1682                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1683                    inner_depth.increment()?;
1684                }
1685                let val_ref = self.driver_host.get_or_insert_with(|| {
1686                    fidl::new_empty!(
1687                        fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<DriverHostMarker>>,
1688                        fidl::encoding::DefaultFuchsiaResourceDialect
1689                    )
1690                });
1691                fidl::decode!(
1692                    fidl::encoding::Endpoint<fidl::endpoints::ServerEnd<DriverHostMarker>>,
1693                    fidl::encoding::DefaultFuchsiaResourceDialect,
1694                    val_ref,
1695                    decoder,
1696                    inner_offset,
1697                    inner_depth
1698                )?;
1699                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1700                {
1701                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1702                }
1703                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1704                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1705                }
1706            }
1707
1708            next_offset += envelope_size;
1709
1710            // Decode the remaining unknown envelopes.
1711            while next_offset < end_offset {
1712                _next_ordinal_to_read += 1;
1713                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1714                next_offset += envelope_size;
1715            }
1716
1717            Ok(())
1718        }
1719    }
1720
1721    impl DriverHostLoadDriverRequest {
1722        #[inline(always)]
1723        fn max_ordinal_present(&self) -> u64 {
1724            if let Some(_) = self.additional_root_modules {
1725                return 4;
1726            }
1727            if let Some(_) = self.driver_libs {
1728                return 3;
1729            }
1730            if let Some(_) = self.driver_binary {
1731                return 2;
1732            }
1733            if let Some(_) = self.driver_soname {
1734                return 1;
1735            }
1736            0
1737        }
1738    }
1739
1740    impl fidl::encoding::ResourceTypeMarker for DriverHostLoadDriverRequest {
1741        type Borrowed<'a> = &'a mut Self;
1742        fn take_or_borrow<'a>(
1743            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1744        ) -> Self::Borrowed<'a> {
1745            value
1746        }
1747    }
1748
1749    unsafe impl fidl::encoding::TypeMarker for DriverHostLoadDriverRequest {
1750        type Owned = Self;
1751
1752        #[inline(always)]
1753        fn inline_align(_context: fidl::encoding::Context) -> usize {
1754            8
1755        }
1756
1757        #[inline(always)]
1758        fn inline_size(_context: fidl::encoding::Context) -> usize {
1759            16
1760        }
1761    }
1762
1763    unsafe impl
1764        fidl::encoding::Encode<
1765            DriverHostLoadDriverRequest,
1766            fidl::encoding::DefaultFuchsiaResourceDialect,
1767        > for &mut DriverHostLoadDriverRequest
1768    {
1769        unsafe fn encode(
1770            self,
1771            encoder: &mut fidl::encoding::Encoder<
1772                '_,
1773                fidl::encoding::DefaultFuchsiaResourceDialect,
1774            >,
1775            offset: usize,
1776            mut depth: fidl::encoding::Depth,
1777        ) -> fidl::Result<()> {
1778            encoder.debug_check_bounds::<DriverHostLoadDriverRequest>(offset);
1779            // Vector header
1780            let max_ordinal: u64 = self.max_ordinal_present();
1781            encoder.write_num(max_ordinal, offset);
1782            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1783            // Calling encoder.out_of_line_offset(0) is not allowed.
1784            if max_ordinal == 0 {
1785                return Ok(());
1786            }
1787            depth.increment()?;
1788            let envelope_size = 8;
1789            let bytes_len = max_ordinal as usize * envelope_size;
1790            #[allow(unused_variables)]
1791            let offset = encoder.out_of_line_offset(bytes_len);
1792            let mut _prev_end_offset: usize = 0;
1793            if 1 > max_ordinal {
1794                return Ok(());
1795            }
1796
1797            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1798            // are envelope_size bytes.
1799            let cur_offset: usize = (1 - 1) * envelope_size;
1800
1801            // Zero reserved fields.
1802            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1803
1804            // Safety:
1805            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1806            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1807            //   envelope_size bytes, there is always sufficient room.
1808            fidl::encoding::encode_in_envelope_optional::<
1809                fidl::encoding::BoundedString<255>,
1810                fidl::encoding::DefaultFuchsiaResourceDialect,
1811            >(
1812                self.driver_soname.as_ref().map(
1813                    <fidl::encoding::BoundedString<255> as fidl::encoding::ValueTypeMarker>::borrow,
1814                ),
1815                encoder,
1816                offset + cur_offset,
1817                depth,
1818            )?;
1819
1820            _prev_end_offset = cur_offset + envelope_size;
1821            if 2 > max_ordinal {
1822                return Ok(());
1823            }
1824
1825            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1826            // are envelope_size bytes.
1827            let cur_offset: usize = (2 - 1) * envelope_size;
1828
1829            // Zero reserved fields.
1830            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1831
1832            // Safety:
1833            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1834            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1835            //   envelope_size bytes, there is always sufficient room.
1836            fidl::encoding::encode_in_envelope_optional::<
1837                fidl::encoding::HandleType<
1838                    fidl::Vmo,
1839                    { fidl::ObjectType::VMO.into_raw() },
1840                    2147483648,
1841                >,
1842                fidl::encoding::DefaultFuchsiaResourceDialect,
1843            >(
1844                self.driver_binary.as_mut().map(
1845                    <fidl::encoding::HandleType<
1846                        fidl::Vmo,
1847                        { fidl::ObjectType::VMO.into_raw() },
1848                        2147483648,
1849                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1850                ),
1851                encoder,
1852                offset + cur_offset,
1853                depth,
1854            )?;
1855
1856            _prev_end_offset = cur_offset + envelope_size;
1857            if 3 > max_ordinal {
1858                return Ok(());
1859            }
1860
1861            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1862            // are envelope_size bytes.
1863            let cur_offset: usize = (3 - 1) * envelope_size;
1864
1865            // Zero reserved fields.
1866            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1867
1868            // Safety:
1869            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1870            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1871            //   envelope_size bytes, there is always sufficient room.
1872            fidl::encoding::encode_in_envelope_optional::<
1873                fidl::encoding::Endpoint<
1874                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1875                >,
1876                fidl::encoding::DefaultFuchsiaResourceDialect,
1877            >(
1878                self.driver_libs.as_mut().map(
1879                    <fidl::encoding::Endpoint<
1880                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
1881                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
1882                ),
1883                encoder,
1884                offset + cur_offset,
1885                depth,
1886            )?;
1887
1888            _prev_end_offset = cur_offset + envelope_size;
1889            if 4 > max_ordinal {
1890                return Ok(());
1891            }
1892
1893            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1894            // are envelope_size bytes.
1895            let cur_offset: usize = (4 - 1) * envelope_size;
1896
1897            // Zero reserved fields.
1898            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1899
1900            // Safety:
1901            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1902            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1903            //   envelope_size bytes, there is always sufficient room.
1904            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<RootModule>, fidl::encoding::DefaultFuchsiaResourceDialect>(
1905            self.additional_root_modules.as_mut().map(<fidl::encoding::UnboundedVector<RootModule> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
1906            encoder, offset + cur_offset, depth
1907        )?;
1908
1909            _prev_end_offset = cur_offset + envelope_size;
1910
1911            Ok(())
1912        }
1913    }
1914
1915    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1916        for DriverHostLoadDriverRequest
1917    {
1918        #[inline(always)]
1919        fn new_empty() -> Self {
1920            Self::default()
1921        }
1922
1923        unsafe fn decode(
1924            &mut self,
1925            decoder: &mut fidl::encoding::Decoder<
1926                '_,
1927                fidl::encoding::DefaultFuchsiaResourceDialect,
1928            >,
1929            offset: usize,
1930            mut depth: fidl::encoding::Depth,
1931        ) -> fidl::Result<()> {
1932            decoder.debug_check_bounds::<Self>(offset);
1933            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1934                None => return Err(fidl::Error::NotNullable),
1935                Some(len) => len,
1936            };
1937            // Calling decoder.out_of_line_offset(0) is not allowed.
1938            if len == 0 {
1939                return Ok(());
1940            };
1941            depth.increment()?;
1942            let envelope_size = 8;
1943            let bytes_len = len * envelope_size;
1944            let offset = decoder.out_of_line_offset(bytes_len)?;
1945            // Decode the envelope for each type.
1946            let mut _next_ordinal_to_read = 0;
1947            let mut next_offset = offset;
1948            let end_offset = offset + bytes_len;
1949            _next_ordinal_to_read += 1;
1950            if next_offset >= end_offset {
1951                return Ok(());
1952            }
1953
1954            // Decode unknown envelopes for gaps in ordinals.
1955            while _next_ordinal_to_read < 1 {
1956                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1957                _next_ordinal_to_read += 1;
1958                next_offset += envelope_size;
1959            }
1960
1961            let next_out_of_line = decoder.next_out_of_line();
1962            let handles_before = decoder.remaining_handles();
1963            if let Some((inlined, num_bytes, num_handles)) =
1964                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1965            {
1966                let member_inline_size =
1967                    <fidl::encoding::BoundedString<255> as fidl::encoding::TypeMarker>::inline_size(
1968                        decoder.context,
1969                    );
1970                if inlined != (member_inline_size <= 4) {
1971                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1972                }
1973                let inner_offset;
1974                let mut inner_depth = depth.clone();
1975                if inlined {
1976                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1977                    inner_offset = next_offset;
1978                } else {
1979                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1980                    inner_depth.increment()?;
1981                }
1982                let val_ref = self.driver_soname.get_or_insert_with(|| {
1983                    fidl::new_empty!(
1984                        fidl::encoding::BoundedString<255>,
1985                        fidl::encoding::DefaultFuchsiaResourceDialect
1986                    )
1987                });
1988                fidl::decode!(
1989                    fidl::encoding::BoundedString<255>,
1990                    fidl::encoding::DefaultFuchsiaResourceDialect,
1991                    val_ref,
1992                    decoder,
1993                    inner_offset,
1994                    inner_depth
1995                )?;
1996                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1997                {
1998                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1999                }
2000                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2001                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2002                }
2003            }
2004
2005            next_offset += envelope_size;
2006            _next_ordinal_to_read += 1;
2007            if next_offset >= end_offset {
2008                return Ok(());
2009            }
2010
2011            // Decode unknown envelopes for gaps in ordinals.
2012            while _next_ordinal_to_read < 2 {
2013                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2014                _next_ordinal_to_read += 1;
2015                next_offset += envelope_size;
2016            }
2017
2018            let next_out_of_line = decoder.next_out_of_line();
2019            let handles_before = decoder.remaining_handles();
2020            if let Some((inlined, num_bytes, num_handles)) =
2021                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2022            {
2023                let member_inline_size = <fidl::encoding::HandleType<
2024                    fidl::Vmo,
2025                    { fidl::ObjectType::VMO.into_raw() },
2026                    2147483648,
2027                > as fidl::encoding::TypeMarker>::inline_size(
2028                    decoder.context
2029                );
2030                if inlined != (member_inline_size <= 4) {
2031                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2032                }
2033                let inner_offset;
2034                let mut inner_depth = depth.clone();
2035                if inlined {
2036                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2037                    inner_offset = next_offset;
2038                } else {
2039                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2040                    inner_depth.increment()?;
2041                }
2042                let val_ref =
2043                self.driver_binary.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
2044                fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
2045                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2046                {
2047                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2048                }
2049                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2050                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2051                }
2052            }
2053
2054            next_offset += envelope_size;
2055            _next_ordinal_to_read += 1;
2056            if next_offset >= end_offset {
2057                return Ok(());
2058            }
2059
2060            // Decode unknown envelopes for gaps in ordinals.
2061            while _next_ordinal_to_read < 3 {
2062                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2063                _next_ordinal_to_read += 1;
2064                next_offset += envelope_size;
2065            }
2066
2067            let next_out_of_line = decoder.next_out_of_line();
2068            let handles_before = decoder.remaining_handles();
2069            if let Some((inlined, num_bytes, num_handles)) =
2070                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2071            {
2072                let member_inline_size = <fidl::encoding::Endpoint<
2073                    fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2074                > as fidl::encoding::TypeMarker>::inline_size(
2075                    decoder.context
2076                );
2077                if inlined != (member_inline_size <= 4) {
2078                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2079                }
2080                let inner_offset;
2081                let mut inner_depth = depth.clone();
2082                if inlined {
2083                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2084                    inner_offset = next_offset;
2085                } else {
2086                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2087                    inner_depth.increment()?;
2088                }
2089                let val_ref = self.driver_libs.get_or_insert_with(|| {
2090                    fidl::new_empty!(
2091                        fidl::encoding::Endpoint<
2092                            fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2093                        >,
2094                        fidl::encoding::DefaultFuchsiaResourceDialect
2095                    )
2096                });
2097                fidl::decode!(
2098                    fidl::encoding::Endpoint<
2099                        fidl::endpoints::ClientEnd<fidl_fuchsia_io::DirectoryMarker>,
2100                    >,
2101                    fidl::encoding::DefaultFuchsiaResourceDialect,
2102                    val_ref,
2103                    decoder,
2104                    inner_offset,
2105                    inner_depth
2106                )?;
2107                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2108                {
2109                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2110                }
2111                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2112                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2113                }
2114            }
2115
2116            next_offset += envelope_size;
2117            _next_ordinal_to_read += 1;
2118            if next_offset >= end_offset {
2119                return Ok(());
2120            }
2121
2122            // Decode unknown envelopes for gaps in ordinals.
2123            while _next_ordinal_to_read < 4 {
2124                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2125                _next_ordinal_to_read += 1;
2126                next_offset += envelope_size;
2127            }
2128
2129            let next_out_of_line = decoder.next_out_of_line();
2130            let handles_before = decoder.remaining_handles();
2131            if let Some((inlined, num_bytes, num_handles)) =
2132                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2133            {
2134                let member_inline_size = <fidl::encoding::UnboundedVector<RootModule> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2135                if inlined != (member_inline_size <= 4) {
2136                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2137                }
2138                let inner_offset;
2139                let mut inner_depth = depth.clone();
2140                if inlined {
2141                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2142                    inner_offset = next_offset;
2143                } else {
2144                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2145                    inner_depth.increment()?;
2146                }
2147                let val_ref = self.additional_root_modules.get_or_insert_with(|| {
2148                    fidl::new_empty!(
2149                        fidl::encoding::UnboundedVector<RootModule>,
2150                        fidl::encoding::DefaultFuchsiaResourceDialect
2151                    )
2152                });
2153                fidl::decode!(
2154                    fidl::encoding::UnboundedVector<RootModule>,
2155                    fidl::encoding::DefaultFuchsiaResourceDialect,
2156                    val_ref,
2157                    decoder,
2158                    inner_offset,
2159                    inner_depth
2160                )?;
2161                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2162                {
2163                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2164                }
2165                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2166                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2167                }
2168            }
2169
2170            next_offset += envelope_size;
2171
2172            // Decode the remaining unknown envelopes.
2173            while next_offset < end_offset {
2174                _next_ordinal_to_read += 1;
2175                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2176                next_offset += envelope_size;
2177            }
2178
2179            Ok(())
2180        }
2181    }
2182
2183    impl RootModule {
2184        #[inline(always)]
2185        fn max_ordinal_present(&self) -> u64 {
2186            if let Some(_) = self.binary {
2187                return 2;
2188            }
2189            if let Some(_) = self.name {
2190                return 1;
2191            }
2192            0
2193        }
2194    }
2195
2196    impl fidl::encoding::ResourceTypeMarker for RootModule {
2197        type Borrowed<'a> = &'a mut Self;
2198        fn take_or_borrow<'a>(
2199            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
2200        ) -> Self::Borrowed<'a> {
2201            value
2202        }
2203    }
2204
2205    unsafe impl fidl::encoding::TypeMarker for RootModule {
2206        type Owned = Self;
2207
2208        #[inline(always)]
2209        fn inline_align(_context: fidl::encoding::Context) -> usize {
2210            8
2211        }
2212
2213        #[inline(always)]
2214        fn inline_size(_context: fidl::encoding::Context) -> usize {
2215            16
2216        }
2217    }
2218
2219    unsafe impl fidl::encoding::Encode<RootModule, fidl::encoding::DefaultFuchsiaResourceDialect>
2220        for &mut RootModule
2221    {
2222        unsafe fn encode(
2223            self,
2224            encoder: &mut fidl::encoding::Encoder<
2225                '_,
2226                fidl::encoding::DefaultFuchsiaResourceDialect,
2227            >,
2228            offset: usize,
2229            mut depth: fidl::encoding::Depth,
2230        ) -> fidl::Result<()> {
2231            encoder.debug_check_bounds::<RootModule>(offset);
2232            // Vector header
2233            let max_ordinal: u64 = self.max_ordinal_present();
2234            encoder.write_num(max_ordinal, offset);
2235            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2236            // Calling encoder.out_of_line_offset(0) is not allowed.
2237            if max_ordinal == 0 {
2238                return Ok(());
2239            }
2240            depth.increment()?;
2241            let envelope_size = 8;
2242            let bytes_len = max_ordinal as usize * envelope_size;
2243            #[allow(unused_variables)]
2244            let offset = encoder.out_of_line_offset(bytes_len);
2245            let mut _prev_end_offset: usize = 0;
2246            if 1 > max_ordinal {
2247                return Ok(());
2248            }
2249
2250            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2251            // are envelope_size bytes.
2252            let cur_offset: usize = (1 - 1) * envelope_size;
2253
2254            // Zero reserved fields.
2255            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2256
2257            // Safety:
2258            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2259            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2260            //   envelope_size bytes, there is always sufficient room.
2261            fidl::encoding::encode_in_envelope_optional::<
2262                fidl::encoding::BoundedString<255>,
2263                fidl::encoding::DefaultFuchsiaResourceDialect,
2264            >(
2265                self.name.as_ref().map(
2266                    <fidl::encoding::BoundedString<255> as fidl::encoding::ValueTypeMarker>::borrow,
2267                ),
2268                encoder,
2269                offset + cur_offset,
2270                depth,
2271            )?;
2272
2273            _prev_end_offset = cur_offset + envelope_size;
2274            if 2 > max_ordinal {
2275                return Ok(());
2276            }
2277
2278            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2279            // are envelope_size bytes.
2280            let cur_offset: usize = (2 - 1) * envelope_size;
2281
2282            // Zero reserved fields.
2283            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2284
2285            // Safety:
2286            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2287            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2288            //   envelope_size bytes, there is always sufficient room.
2289            fidl::encoding::encode_in_envelope_optional::<
2290                fidl::encoding::HandleType<
2291                    fidl::Vmo,
2292                    { fidl::ObjectType::VMO.into_raw() },
2293                    2147483648,
2294                >,
2295                fidl::encoding::DefaultFuchsiaResourceDialect,
2296            >(
2297                self.binary.as_mut().map(
2298                    <fidl::encoding::HandleType<
2299                        fidl::Vmo,
2300                        { fidl::ObjectType::VMO.into_raw() },
2301                        2147483648,
2302                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
2303                ),
2304                encoder,
2305                offset + cur_offset,
2306                depth,
2307            )?;
2308
2309            _prev_end_offset = cur_offset + envelope_size;
2310
2311            Ok(())
2312        }
2313    }
2314
2315    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for RootModule {
2316        #[inline(always)]
2317        fn new_empty() -> Self {
2318            Self::default()
2319        }
2320
2321        unsafe fn decode(
2322            &mut self,
2323            decoder: &mut fidl::encoding::Decoder<
2324                '_,
2325                fidl::encoding::DefaultFuchsiaResourceDialect,
2326            >,
2327            offset: usize,
2328            mut depth: fidl::encoding::Depth,
2329        ) -> fidl::Result<()> {
2330            decoder.debug_check_bounds::<Self>(offset);
2331            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2332                None => return Err(fidl::Error::NotNullable),
2333                Some(len) => len,
2334            };
2335            // Calling decoder.out_of_line_offset(0) is not allowed.
2336            if len == 0 {
2337                return Ok(());
2338            };
2339            depth.increment()?;
2340            let envelope_size = 8;
2341            let bytes_len = len * envelope_size;
2342            let offset = decoder.out_of_line_offset(bytes_len)?;
2343            // Decode the envelope for each type.
2344            let mut _next_ordinal_to_read = 0;
2345            let mut next_offset = offset;
2346            let end_offset = offset + bytes_len;
2347            _next_ordinal_to_read += 1;
2348            if next_offset >= end_offset {
2349                return Ok(());
2350            }
2351
2352            // Decode unknown envelopes for gaps in ordinals.
2353            while _next_ordinal_to_read < 1 {
2354                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2355                _next_ordinal_to_read += 1;
2356                next_offset += envelope_size;
2357            }
2358
2359            let next_out_of_line = decoder.next_out_of_line();
2360            let handles_before = decoder.remaining_handles();
2361            if let Some((inlined, num_bytes, num_handles)) =
2362                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2363            {
2364                let member_inline_size =
2365                    <fidl::encoding::BoundedString<255> as fidl::encoding::TypeMarker>::inline_size(
2366                        decoder.context,
2367                    );
2368                if inlined != (member_inline_size <= 4) {
2369                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2370                }
2371                let inner_offset;
2372                let mut inner_depth = depth.clone();
2373                if inlined {
2374                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2375                    inner_offset = next_offset;
2376                } else {
2377                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2378                    inner_depth.increment()?;
2379                }
2380                let val_ref = self.name.get_or_insert_with(|| {
2381                    fidl::new_empty!(
2382                        fidl::encoding::BoundedString<255>,
2383                        fidl::encoding::DefaultFuchsiaResourceDialect
2384                    )
2385                });
2386                fidl::decode!(
2387                    fidl::encoding::BoundedString<255>,
2388                    fidl::encoding::DefaultFuchsiaResourceDialect,
2389                    val_ref,
2390                    decoder,
2391                    inner_offset,
2392                    inner_depth
2393                )?;
2394                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2395                {
2396                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2397                }
2398                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2399                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2400                }
2401            }
2402
2403            next_offset += envelope_size;
2404            _next_ordinal_to_read += 1;
2405            if next_offset >= end_offset {
2406                return Ok(());
2407            }
2408
2409            // Decode unknown envelopes for gaps in ordinals.
2410            while _next_ordinal_to_read < 2 {
2411                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2412                _next_ordinal_to_read += 1;
2413                next_offset += envelope_size;
2414            }
2415
2416            let next_out_of_line = decoder.next_out_of_line();
2417            let handles_before = decoder.remaining_handles();
2418            if let Some((inlined, num_bytes, num_handles)) =
2419                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2420            {
2421                let member_inline_size = <fidl::encoding::HandleType<
2422                    fidl::Vmo,
2423                    { fidl::ObjectType::VMO.into_raw() },
2424                    2147483648,
2425                > as fidl::encoding::TypeMarker>::inline_size(
2426                    decoder.context
2427                );
2428                if inlined != (member_inline_size <= 4) {
2429                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2430                }
2431                let inner_offset;
2432                let mut inner_depth = depth.clone();
2433                if inlined {
2434                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2435                    inner_offset = next_offset;
2436                } else {
2437                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2438                    inner_depth.increment()?;
2439                }
2440                let val_ref =
2441                self.binary.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect));
2442                fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
2443                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2444                {
2445                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2446                }
2447                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2448                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2449                }
2450            }
2451
2452            next_offset += envelope_size;
2453
2454            // Decode the remaining unknown envelopes.
2455            while next_offset < end_offset {
2456                _next_ordinal_to_read += 1;
2457                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2458                next_offset += envelope_size;
2459            }
2460
2461            Ok(())
2462        }
2463    }
2464}