diff --git a/src/rust/mpris/src/main.rs b/src/rust/mpris/src/main.rs index 1e9858e9b21966001739fddcfe6a1051d13c2ff4..cd23ce4e42fbb2b3de1ef0d93cf9bc49a99f3fdf 100644 --- a/src/rust/mpris/src/main.rs +++ b/src/rust/mpris/src/main.rs @@ -1,18 +1,8 @@ -use std::future::pending; -use zbus::ConnectionBuilder; - #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { - let (main, player) = mpris::server::build("mpris"); - - let _ = ConnectionBuilder::session()? - .name("org.mpris.MediaPlayer2.mpris")? - .serve_at("/org/mpris/MediaPlayer2", main)? - .serve_at("/org/mpris/MediaPlayer2", player)? - .build() - .await?; + let _ = mpris::server::build_session("mpris").await?; // Do other things or go to wait forever - pending::<()>().await; + std::future::pending::<()>().await; Ok(()) } diff --git a/src/rust/mpris/src/server.rs b/src/rust/mpris/src/server.rs index b748bd65d2ea709c4e1e82d79f639d98ae647976..4b2f86b7ecfea2f4d9682c8355454aaa4e84e7cb 100644 --- a/src/rust/mpris/src/server.rs +++ b/src/rust/mpris/src/server.rs @@ -1,9 +1,8 @@ //! # DBus interface for: `org.mpris.MediaPlayer2`, `org.mpris.MediaPlayer2.Player` -// use crate::types::*; use crate::types::*; use commons::log; -use zbus::dbus_interface; +use zbus::{dbus_interface, Connection, ConnectionBuilder, SignalContext as ZSignalCtx}; macro_rules! str { ($str: literal) => { @@ -11,25 +10,31 @@ macro_rules! str { }; } -pub fn build(identity: impl ToString) -> (MediaPlayer2, MediaPlayer2Player) { - ( - MediaPlayer2 { - identity: identity.to_string(), - }, - MediaPlayer2Player {}, - ) +pub async fn build_session(identity: impl ToString) -> zbus::Result<Connection> { + let main = Main { + identity: identity.to_string(), + }; + let player = Player {}; + let track_list = TrackList {}; + ConnectionBuilder::session()? + .name("org.mpris.MediaPlayer2.mpris")? + .serve_at("/org/mpris/MediaPlayer2", main)? + .serve_at("/org/mpris/MediaPlayer2", player)? + .serve_at("/org/mpris/MediaPlayer2", track_list)? + .build() + .await } -/// Should be served at "/org/mpris/MediaPlayer2" -pub struct MediaPlayer2 { +struct Main { identity: String, } -/// Should be served at "/org/mpris/MediaPlayer2" -pub struct MediaPlayer2Player {} +struct Player {} + +struct TrackList {} #[dbus_interface(name = "org.mpris.MediaPlayer2")] -impl MediaPlayer2 { +impl Main { /// Quit method #[dbus_interface(name = "Quit")] fn quit(&self) {} @@ -98,7 +103,7 @@ impl MediaPlayer2 { } #[dbus_interface(name = "org.mpris.MediaPlayer2.Player")] -impl MediaPlayer2Player { +impl Player { /// Next method fn next(&self) {} @@ -222,3 +227,72 @@ impl MediaPlayer2Player { MediaPlayerMetadata::from_iter([]) } } + +#[dbus_interface(name = "org.mpris.MediaPlayer2.TrackList")] +impl TrackList { + /// AddTrack method + fn add_track(&self, uri: &str, after: MediaPlayerObjectPath, set_as_current: bool) { + todo!("handle add {uri} after {after:?} with set as current: {set_as_current}") + } + + /// GetTracksMetadata method + fn get_tracks_metadata( + &self, + tracks_ids: Vec<MediaPlayerObjectPath>, + ) -> Vec<MediaPlayerMetadata> { + todo!("handle track ids: {tracks_ids:?}") + } + + /// GoTo method + fn go_to(&self, track_id: MediaPlayerObjectPath) { + todo!("handle track id {track_id:?}") + } + + /// RemoveTrack method + fn remove_track(&self, track_id: MediaPlayerObjectPath) { + todo!("handle track id {track_id:?}") + } + + /// CanEditTracks property + #[dbus_interface(property)] + fn can_edit_tracks(&self) -> bool { + true + } + + /// Tracks property + #[dbus_interface(property)] + fn tracks(&self) -> Vec<MediaPlayerObjectPath> { + vec![] + } + + /// TrackAdded signal + #[dbus_interface(signal)] + async fn track_added( + #[zbus(signal_context)] ctxt: ZSignalCtx<'_>, + metadata: MediaPlayerMetadata, + after: MediaPlayerObjectPath, + ) -> zbus::Result<()>; + + /// TrackListReplaced signal + #[dbus_interface(signal)] + async fn track_list_replaced( + #[zbus(signal_context)] ctxt: ZSignalCtx<'_>, + tracks: Vec<MediaPlayerObjectPath>, + current: MediaPlayerObjectPath, + ) -> zbus::Result<()>; + + /// TrackMetadataChanged signal + #[dbus_interface(signal)] + async fn track_metadata_changed( + #[zbus(signal_context)] ctxt: ZSignalCtx<'_>, + track_id: MediaPlayerObjectPath, + metadata: MediaPlayerMetadata, + ) -> zbus::Result<()>; + + /// TrackRemoved signal + #[dbus_interface(signal)] + async fn track_removed( + #[zbus(signal_context)] ctxt: ZSignalCtx<'_>, + track_id: MediaPlayerObjectPath, + ) -> zbus::Result<()>; +}