1use anyhow::Error;
6use fidl::endpoints::{ClientEnd, create_endpoints};
7use fsysmem2::BufferCollectionTokenDuplicateRequest;
8use {fidl_fuchsia_sysmem2 as fsysmem2, fidl_fuchsia_ui_composition as fland};
9
10pub struct BufferCollectionTokenPair {
12 pub export_token: fland::BufferCollectionExportToken,
13 pub import_token: fland::BufferCollectionImportToken,
14}
15
16impl BufferCollectionTokenPair {
17 pub fn new() -> BufferCollectionTokenPair {
18 let (raw_export_token, raw_import_token) = zx::EventPair::create();
19 BufferCollectionTokenPair {
20 export_token: fland::BufferCollectionExportToken { value: raw_export_token },
21 import_token: fland::BufferCollectionImportToken { value: raw_import_token },
22 }
23 }
24}
25
26pub fn duplicate_buffer_collection_import_token(
28 import_token: &fland::BufferCollectionImportToken,
29) -> Result<fland::BufferCollectionImportToken, Error> {
30 let handle = import_token.value.as_handle_ref().duplicate(zx::Rights::SAME_RIGHTS)?;
31 Ok(fland::BufferCollectionImportToken { value: handle.into() })
32}
33
34pub async fn duplicate_buffer_collection_token(
39 token: &mut fsysmem2::BufferCollectionTokenProxy,
40) -> Result<ClientEnd<fsysmem2::BufferCollectionTokenMarker>, Error> {
41 let (duplicate_token, duplicate_token_server_end) =
42 create_endpoints::<fsysmem2::BufferCollectionTokenMarker>();
43
44 token.duplicate(BufferCollectionTokenDuplicateRequest {
45 rights_attenuation_mask: Some(fidl::Rights::SAME_RIGHTS),
46 token_request: Some(duplicate_token_server_end),
47 ..Default::default()
48 })?;
49 token.sync().await?;
50
51 Ok(duplicate_token)
52}