From 0f14facac980ee9740d20d28926a3be4b27e520c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 17 Jun 2024 21:12:07 -0700 Subject: [PATCH] manager/user: Add ReloadConfig method --- com.steampowered.SteamOSManager1.xml | 9 +++++++++ src/daemon/user.rs | 13 ++++++++----- src/manager/user.rs | 22 ++++++++++++++++++++-- src/proxy.rs | 3 +++ 4 files changed, 40 insertions(+), 7 deletions(-) diff --git a/com.steampowered.SteamOSManager1.xml b/com.steampowered.SteamOSManager1.xml index b275bc6..d33c09d 100644 --- a/com.steampowered.SteamOSManager1.xml +++ b/com.steampowered.SteamOSManager1.xml @@ -296,6 +296,15 @@ Version available: 9 --> + + + diff --git a/src/daemon/user.rs b/src/daemon/user.rs index 6b59da6..74a86b3 100644 --- a/src/daemon/user.rs +++ b/src/daemon/user.rs @@ -8,6 +8,7 @@ use anyhow::{bail, Result}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; +use tokio::sync::mpsc::Sender; use tracing::error; use tracing_subscriber::prelude::*; use tracing_subscriber::{fmt, Registry}; @@ -16,7 +17,7 @@ use xdg::BaseDirectories; use zbus::connection::Connection; use zbus::ConnectionBuilder; -use crate::daemon::{channel, Daemon, DaemonContext}; +use crate::daemon::{channel, Daemon, DaemonCommand, DaemonContext}; use crate::manager::user::SteamOSManager; use crate::path; use crate::udev::UdevMonitor; @@ -98,14 +99,16 @@ impl DaemonContext for UserContext { } } -async fn create_connections() -> Result<(Connection, Connection)> { +pub(crate) type Command = DaemonCommand<()>; + +async fn create_connections(channel: Sender) -> Result<(Connection, Connection)> { let system = Connection::system().await?; let connection = ConnectionBuilder::session()? .name("com.steampowered.SteamOSManager1")? .build() .await?; - let manager = SteamOSManager::new(connection.clone(), &system).await?; + let manager = SteamOSManager::new(connection.clone(), &system, channel).await?; connection .object_server() .at("/com/steampowered/SteamOSManager1", manager) @@ -120,9 +123,9 @@ pub async fn daemon() -> Result<()> { let stdout_log = fmt::layer(); let subscriber = Registry::default().with(stdout_log); - let (_tx, rx) = channel::(); + let (tx, rx) = channel::(); - let (session, system) = match create_connections().await { + let (session, system) = match create_connections(tx).await { Ok(c) => c, Err(e) => { let _guard = tracing::subscriber::set_default(subscriber); diff --git a/src/manager/user.rs b/src/manager/user.rs index 2a8e4dc..5e2c328 100644 --- a/src/manager/user.rs +++ b/src/manager/user.rs @@ -8,12 +8,15 @@ use anyhow::Result; use std::collections::HashMap; +use tokio::sync::mpsc::Sender; use tracing::error; use zbus::proxy::Builder; use zbus::zvariant::Fd; use zbus::{fdo, interface, Connection, Proxy, SignalContext}; use crate::cec::{HdmiCecControl, HdmiCecState}; +use crate::daemon::user::Command; +use crate::daemon::DaemonCommand; use crate::error::{to_zbus_error, to_zbus_fdo_error, zbus_to_zbus_fdo}; use crate::hardware::check_support; use crate::power::{ @@ -61,10 +64,11 @@ macro_rules! setter { pub struct SteamOSManager { proxy: Proxy<'static>, hdmi_cec: HdmiCecControl<'static>, + channel: Sender, } impl SteamOSManager { - pub async fn new(connection: Connection, system_conn: &Connection) -> Result { + pub async fn new(connection: Connection, system_conn: &Connection, channel: Sender) -> Result { Ok(SteamOSManager { hdmi_cec: HdmiCecControl::new(&connection).await?, proxy: Builder::new(system_conn) @@ -74,6 +78,7 @@ impl SteamOSManager { .cache_properties(zbus::CacheProperties::No) .build() .await?, + channel, }) } } @@ -308,12 +313,24 @@ impl SteamOSManager { .await .map_err(to_zbus_error) } + + async fn reload_config(&self) -> fdo::Result<()> { + self.channel + .send(DaemonCommand::ReadConfig) + .await + .inspect_err(|message| error!("Error sending ReadConfig command: {message}")) + .map_err(to_zbus_fdo_error)?; + method!(self, "ReloadConfig") + } } #[cfg(test)] mod test { use super::*; use crate::testing; + use crate::daemon::channel; + use crate::daemon::user::UserContext; + use std::collections::{HashMap, HashSet}; use std::iter::zip; use tokio::fs::read; @@ -327,8 +344,9 @@ mod test { async fn start() -> Result { let handle = testing::start(); + let (tx, _rx) = channel::(); let connection = ConnectionBuilder::session()?.build().await?; - let manager = SteamOSManager::new(connection.clone(), &connection).await?; + let manager = SteamOSManager::new(connection.clone(), &connection, tx).await?; connection .object_server() .at("/com/steampowered/SteamOSManager1", manager) diff --git a/src/proxy.rs b/src/proxy.rs index ac118ac..df8fcf6 100644 --- a/src/proxy.rs +++ b/src/proxy.rs @@ -46,6 +46,9 @@ trait Manager { /// UpdateDock method fn update_dock(&self) -> zbus::Result; + /// ReloadConfig method + fn reload_config(&self) -> zbus::Result<()>; + /// AlsCalibrationGain property #[zbus(property)] fn als_calibration_gain(&self) -> zbus::Result;