use crate::Result as DefaultResult;
use dbus::{
channel::Token,
message::{MatchRule, Message},
nonblock::{MsgMatch, SyncConnection},
strings::{Member, Path},
};
use std::error::Error;
pub enum EventType {
PropertiesChanged,
Seeked,
}
pub struct EventManager<'a> {
conn: &'a SyncConnection,
callback_tokens: Vec<Token>,
}
impl EventManager<'_> {
pub fn new(conn: &SyncConnection) -> EventManager {
EventManager {
conn,
callback_tokens: Vec::new(),
}
}
pub async fn add_callback<F>(
&mut self,
event_type: EventType,
mut callback: F,
) -> Result<MsgMatch, Box<dyn Error>>
where
F: FnMut(Message) -> bool + Send + 'static,
{
let mut rule = MatchRule::new();
rule.member = Some(Member::new(match event_type {
EventType::PropertiesChanged => "PropertiesChanged",
EventType::Seeked => "Seeked",
})?);
rule.path = Some(Path::new("/org/mpris/MediaPlayer2")?);
let msg_match = self.conn.add_match(rule).await?;
let registered_callback = msg_match.cb(move |msg, _: ()| callback(msg));
self.callback_tokens.push(registered_callback.token());
Ok(registered_callback)
}
pub async fn clear_callbacks(&mut self) -> DefaultResult<()> {
for token in &self.callback_tokens {
self.conn.remove_match(*token).await?;
}
Ok(())
}
}