runtime_capabilities/fidl/
connector.rs1use 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 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}