sandbox/fidl/
dir_connector_router.rs1use crate::fidl::router;
6use crate::{ConversionError, DirConnector, Router, RouterResponse, WeakInstanceToken};
7use fidl::handle::AsHandleRef;
8use futures::TryStreamExt;
9use std::sync::Arc;
10use vfs::directory::entry::DirectoryEntry;
11use vfs::execution_scope::ExecutionScope;
12use {fidl_fuchsia_component_sandbox as fsandbox, fidl_fuchsia_io as fio};
13
14impl crate::RemotableCapability for Router<DirConnector> {
15 fn try_into_directory_entry(
16 self,
17 scope: ExecutionScope,
18 token: WeakInstanceToken,
19 ) -> Result<Arc<dyn DirectoryEntry>, ConversionError> {
20 Ok(self.into_directory_entry(fio::DirentType::Directory, scope, token))
21 }
22}
23
24impl TryFrom<RouterResponse<DirConnector>> for fsandbox::DirConnectorRouterRouteResponse {
25 type Error = fsandbox::RouterError;
26
27 fn try_from(resp: RouterResponse<DirConnector>) -> Result<Self, Self::Error> {
28 match resp {
29 RouterResponse::<DirConnector>::Capability(c) => {
30 Ok(fsandbox::DirConnectorRouterRouteResponse::DirConnector(c.into()))
31 }
32 RouterResponse::<DirConnector>::Unavailable => {
33 Ok(fsandbox::DirConnectorRouterRouteResponse::Unavailable(fsandbox::Unit {}))
34 }
35 RouterResponse::<DirConnector>::Debug(_) => Err(fsandbox::RouterError::NotSupported),
36 }
37 }
38}
39
40impl crate::fidl::IntoFsandboxCapability for Router<DirConnector> {
41 fn into_fsandbox_capability(self, token: WeakInstanceToken) -> fsandbox::Capability {
42 let (client_end, sender_stream) =
43 fidl::endpoints::create_request_stream::<fsandbox::DirConnectorRouterMarker>();
44 self.serve_and_register(sender_stream, client_end.get_koid().unwrap(), token);
45 fsandbox::Capability::DirConnectorRouter(client_end)
46 }
47}
48
49impl Router<DirConnector> {
50 async fn serve_router(
51 self,
52 mut stream: fsandbox::DirConnectorRouterRequestStream,
53 token: WeakInstanceToken,
54 ) -> Result<(), fidl::Error> {
55 while let Ok(Some(request)) = stream.try_next().await {
56 match request {
57 fsandbox::DirConnectorRouterRequest::Route { payload, responder } => {
58 responder.send(router::route_from_fidl(&self, payload, token.clone()).await)?;
59 }
60 fsandbox::DirConnectorRouterRequest::_UnknownMethod { ordinal, .. } => {
61 log::warn!(
62 ordinal:%;
63 "Received unknown DirConnectorRouter request"
64 );
65 }
66 }
67 }
68 Ok(())
69 }
70
71 pub fn serve_and_register(
73 self,
74 stream: fsandbox::DirConnectorRouterRequestStream,
75 koid: zx::Koid,
76 token: WeakInstanceToken,
77 ) {
78 let router = self.clone();
79
80 crate::fidl::registry::insert(self.into(), koid, async move {
82 router.serve_router(stream, token).await.expect("failed to serve Router");
83 });
84 }
85}