Skip to main content

runtime_capabilities/fidl/
connector.rs

1// Copyright 2024 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::fidl::registry;
6use crate::{Connector, ConversionError, Receiver, WeakInstanceToken};
7use fidl::endpoints::ClientEnd;
8use fidl_fuchsia_component_sandbox as fsandbox;
9use fuchsia_async as fasync;
10use futures::channel::mpsc;
11use std::sync::Arc;
12use vfs::directory::entry::DirectoryEntry;
13use vfs::execution_scope::ExecutionScope;
14
15impl Connector {
16    pub(crate) fn new_with_fidl_receiver(
17        receiver_client: ClientEnd<fsandbox::ReceiverMarker>,
18        scope: &fasync::Scope,
19    ) -> Self {
20        let (sender, receiver) = mpsc::unbounded();
21        let receiver = Receiver::new(receiver);
22        // Exits when ServerEnd<Receiver> is closed
23        scope.spawn(receiver.handle_receiver(receiver_client.into_proxy()));
24        Self::new_sendable(sender)
25    }
26}
27
28impl crate::RemotableCapability for Connector {
29    fn try_into_directory_entry(
30        self,
31        _scope: ExecutionScope,
32        _token: WeakInstanceToken,
33    ) -> Result<Arc<dyn DirectoryEntry>, ConversionError> {
34        Ok(vfs::service::endpoint(move |_scope, server_end| {
35            let _ = self.send(server_end.into_zx_channel().into());
36        }))
37    }
38}
39
40impl From<Connector> for fsandbox::Connector {
41    fn from(value: Connector) -> Self {
42        fsandbox::Connector { token: registry::insert_token(value.into()) }
43    }
44}
45
46impl crate::fidl::IntoFsandboxCapability for Connector {
47    fn into_fsandbox_capability(self, _token: WeakInstanceToken) -> fsandbox::Capability {
48        fsandbox::Capability::Connector(self.into())
49    }
50}