blob: 61cb9cb3890086e2c09ea4bb538d3b24c33ab778 [file] [edit]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Collections of methods to send D-BUS signals
use crate::{dbus_constants, dbus_wrapper::DbusConnectionTrait};
use anyhow::{anyhow, Result};
use log::debug;
use std::sync::Arc;
use system_api::shadercached::ShaderCacheMountStatus;
pub fn signal_mount_status<D: DbusConnectionTrait>(
mount_status_many: Vec<ShaderCacheMountStatus>,
dbus_conn: Arc<D>,
) -> Result<()> {
let mut errors: Vec<String> = vec![];
for status in mount_status_many {
if let Err(e) = emit_signal(
&status,
dbus_constants::MOUNT_STATUS_CHANGED_SIGNAL,
dbus_conn.clone(),
) {
errors.push(e.to_string());
}
}
if errors.is_empty() {
Ok(())
} else {
Err(anyhow!("Failed to signal some status: {:?}", errors))
}
}
fn emit_signal<D: DbusConnectionTrait>(
to_emit: &(impl protobuf::Message + std::fmt::Debug),
signal_name: &str,
dbus_conn: Arc<D>,
) -> Result<()> {
// Tell Cicerone shader cache has been (un)mounted, so that it can continue
// process calls.
let mounted_signal = dbus::Message::new_signal(
dbus_constants::PATH_NAME,
dbus_constants::INTERFACE_NAME,
signal_name,
)
.map_err(|e| anyhow!("Failed to create signal: {}", e))?
.append1(
to_emit
.write_to_bytes()
.map_err(|e| anyhow!("Failed to parse protobuf: {}", e))?,
);
debug!("Sending {} signal.. {:?}", signal_name, to_emit);
dbus_conn
.send(mounted_signal)
.map_err(|_| anyhow!("Failed to send signal"))?;
Ok(())
}