use std::{fmt::Debug, os::unix::io::AsRawFd};
use serde_repr::{Deserialize_repr, Serialize_repr};
use zbus::zvariant::{Fd, Type};
use super::{DESTINATION, PATH};
use crate::{error::PortalError, helpers::call_method, Error};
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug, Type)]
#[repr(i8)]
pub enum Status {
Inactive = 0,
Active = 1,
Registered = 2,
Rejected = -1,
}
#[derive(Serialize_repr, Deserialize_repr, PartialEq, Debug, Type)]
#[repr(i8)]
enum RegisterStatus {
Success = 0,
Rejected = -1,
}
#[derive(Debug)]
#[doc(alias = "org.freedesktop.portal.GameMode")]
pub struct GameModeProxy<'a>(zbus::Proxy<'a>);
impl<'a> GameModeProxy<'a> {
pub async fn new(connection: &zbus::Connection) -> Result<GameModeProxy<'a>, Error> {
let proxy = zbus::ProxyBuilder::new_bare(connection)
.interface("org.freedesktop.portal.GameMode")?
.path(PATH)?
.destination(DESTINATION)?
.build()
.await?;
Ok(Self(proxy))
}
pub fn inner(&self) -> &zbus::Proxy<'_> {
&self.0
}
#[doc(alias = "QueryStatus")]
pub async fn query_status(&self, pid: u32) -> Result<Status, Error> {
call_method(self.inner(), "QueryStatus", &(pid)).await
}
#[doc(alias = "QueryStatusByPIDFd")]
pub async fn query_status_by_pidfd(
&self,
target: &impl AsRawFd,
requester: &impl AsRawFd,
) -> Result<Status, Error> {
call_method(
self.inner(),
"QueryStatusByPIDFd",
&(
Fd::from(target.as_raw_fd()),
Fd::from(requester.as_raw_fd()),
),
)
.await
}
#[doc(alias = "QueryStatusByPid")]
pub async fn query_status_by_pid(&self, target: u32, requester: u32) -> Result<Status, Error> {
call_method(self.inner(), "QueryStatusByPid", &(target, requester)).await
}
#[doc(alias = "RegisterGame")]
pub async fn register_game(&self, pid: u32) -> Result<(), Error> {
let status = call_method(self.inner(), "RegisterGame", &(pid)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
#[doc(alias = "RegisterGameByPIDFd")]
pub async fn register_game_by_pidfd(
&self,
target: &impl AsRawFd,
requester: &impl AsRawFd,
) -> Result<(), Error> {
let status = call_method(
self.inner(),
"RegisterGameByPIDFd",
&(
Fd::from(target.as_raw_fd()),
Fd::from(requester.as_raw_fd()),
),
)
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
#[doc(alias = "RegisterGameByPid")]
pub async fn register_game_by_pid(&self, target: u32, requester: u32) -> Result<(), Error> {
let status = call_method(self.inner(), "RegisterGameByPid", &(target, requester)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
#[doc(alias = "UnregisterGame")]
pub async fn unregister_game(&self, pid: u32) -> Result<(), Error> {
let status = call_method(self.inner(), "UnregisterGame", &(pid)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
#[doc(alias = "UnregisterGameByPIDFd")]
pub async fn unregister_game_by_pidfd(
&self,
target: &impl AsRawFd,
requester: &impl AsRawFd,
) -> Result<(), Error> {
let status = call_method(
self.inner(),
"UnregisterGameByPIDFd",
&(
Fd::from(target.as_raw_fd()),
Fd::from(requester.as_raw_fd()),
),
)
.await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
#[doc(alias = "UnregisterGameByPid")]
pub async fn unregister_game_by_pid(&self, target: u32, requester: u32) -> Result<(), Error> {
let status = call_method(self.inner(), "UnregisterGameByPid", &(target, requester)).await?;
match status {
RegisterStatus::Success => Ok(()),
RegisterStatus::Rejected => Err(Error::Portal(PortalError::Failed)),
}
}
}