use super::{HandleToken, DESTINATION, PATH};
use crate::{
helpers::{call_basic_response_method, call_method},
Error,
};
use std::{
collections::HashMap,
os::unix::prelude::{AsRawFd, RawFd},
};
use zvariant::{Fd, Value};
use zvariant_derive::{DeserializeDict, SerializeDict, TypeDict};
#[derive(SerializeDict, DeserializeDict, TypeDict, Clone, Debug, Default)]
struct CameraAccessOptions {
handle_token: HandleToken,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.Camera")]
pub struct CameraProxy<'a>(zbus::azync::Proxy<'a>);
impl<'a> CameraProxy<'a> {
pub async fn new(connection: &zbus::azync::Connection) -> Result<CameraProxy<'a>, Error> {
let proxy = zbus::ProxyBuilder::new_bare(connection)
.interface("org.freedesktop.portal.Camera")
.path(PATH)?
.destination(DESTINATION)
.build_async()
.await?;
Ok(Self(proxy))
}
pub fn inner(&self) -> &zbus::azync::Proxy<'_> {
&self.0
}
#[doc(alias = "AccessCamera")]
pub async fn access_camera(&self) -> Result<(), Error> {
let options = CameraAccessOptions::default();
call_basic_response_method(&self.0, &options.handle_token, "AccessCamera", &(&options))
.await
}
#[doc(alias = "OpenPipeWireRemote")]
pub async fn open_pipe_wire_remote(&self) -> Result<RawFd, Error> {
let options: HashMap<&str, Value<'_>> = HashMap::new();
let fd: Fd = call_method(&self.0, "OpenPipeWireRemote", &(options)).await?;
Ok(fd.as_raw_fd())
}
#[doc(alias = "IsCameraPresent")]
pub async fn is_camera_present(&self) -> Result<bool, Error> {
self.0
.get_property::<bool>("IsCameraPresent")
.await
.map_err(From::from)
}
}