| // 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. |
| |
| pub mod dbus_constants; |
| |
| use std::{future::Future, pin::Pin, sync::Arc, time::Duration}; |
| |
| use dbus::{ |
| arg::{AppendAll, ReadAll}, |
| channel::Sender, |
| nonblock::SyncConnection, |
| Message, |
| }; |
| |
| #[cfg(test)] |
| use mockall::{automock, predicate::*}; |
| |
| const DEFAULT_DBUS_TIMEOUT: Duration = Duration::from_secs(5); |
| |
| #[cfg_attr(test, automock)] |
| pub trait DbusConnectionTrait { |
| fn call_dbus_method<T: ReadAll + 'static, A: AppendAll + 'static>( |
| &self, |
| service: &str, |
| path: &str, |
| interface: &str, |
| method: &str, |
| method_args: A, |
| ) -> Pin<Box<dyn Future<Output = Result<T, dbus::Error>> + Send + 'static>>; |
| |
| fn send(&self, msg: Message) -> Result<u32, ()>; |
| } |
| |
| pub struct DbusConnection { |
| conn: Arc<SyncConnection>, |
| } |
| |
| impl DbusConnection { |
| pub fn new(conn: Arc<SyncConnection>) -> Arc<DbusConnection> { |
| Arc::new(DbusConnection { conn }) |
| } |
| } |
| |
| impl DbusConnectionTrait for DbusConnection { |
| fn call_dbus_method<T: ReadAll + 'static, A: AppendAll + 'static>( |
| &self, |
| service: &str, |
| path: &str, |
| interface: &str, |
| method: &str, |
| method_args: A, |
| ) -> Pin<Box<dyn Future<Output = Result<T, dbus::Error>> + Send + 'static>> { |
| let proxy = |
| dbus::nonblock::Proxy::new(service, path, DEFAULT_DBUS_TIMEOUT, self.conn.clone()); |
| Box::pin(proxy.method_call(interface, method, method_args)) |
| } |
| |
| fn send(&self, msg: Message) -> Result<u32, ()> { |
| self.conn.send(msg) |
| } |
| } |