32 #include <core/dbus/object.h>
33 #include <core/dbus/property.h>
34 #include <core/dbus/types/object_path.h>
35 #include <core/dbus/types/variant.h>
36 #include <core/dbus/types/stl/map.h>
37 #include <core/dbus/types/stl/vector.h>
53 request_context_resolver(request_context_resolver),
54 request_authenticator(request_authenticator),
71 msg->reader() >> track;
73 auto meta_data =
impl->query_meta_data_for_track(track);
75 auto reply = dbus::Message::make_method_return(msg);
76 reply->writer() << *meta_data;
82 request_context_resolver->resolve_context_for_dbus_name_async(msg->sender(), [
this, msg](
const media::apparmor::ubuntu::Context& context)
85 msg->reader() >> uri >> after >> make_current;
90 auto reply = dbus::Message::make_method_return(msg);
92 if (std::get<0>(result))
93 impl->add_track_with_uri_at(uri, after, make_current);
95 std::cerr <<
"Warning: Not adding track " << uri <<
96 " to TrackList because of inadequate client apparmor permissions." << std::endl;
105 msg->reader() >> track;
107 impl->remove_track(track);
109 auto reply = dbus::Message::make_method_return(msg);
116 msg->reader() >> track;
119 const bool toggle_player_state =
true;
120 impl->go_to(track, toggle_player_state);
122 auto reply = dbus::Message::make_method_return(msg);
139 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackAdded, mpris::TrackList::Signals::TrackAdded::ArgumentType>
DBusTrackAddedSignal;
140 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackRemoved, mpris::TrackList::Signals::TrackRemoved::ArgumentType>
DBusTrackRemovedSignal;
141 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackListReplaced, mpris::TrackList::Signals::TrackListReplaced::ArgumentType>
DBusTrackListReplacedSignal;
143 Signals(
const std::shared_ptr<DBusTrackAddedSignal>& remote_track_added,
144 const std::shared_ptr<DBusTrackRemovedSignal>& remote_track_removed,
145 const std::shared_ptr<DBusTrackListReplacedSignal>& remote_track_list_replaced)
150 remote_track_added->emit(
id);
155 remote_track_removed->emit(
id);
160 remote_track_list_replaced->emit(tltuple);
173 const media::apparmor::ubuntu::RequestContextResolver::Ptr& request_context_resolver,
174 const media::apparmor::ubuntu::RequestAuthenticator::Ptr& request_authenticator)
175 : d(new
Private(this, bus, object, request_context_resolver, request_authenticator))
177 d->object->install_method_handler<mpris::TrackList::GetTracksMetadata>(
180 std::placeholders::_1));
182 d->object->install_method_handler<mpris::TrackList::AddTrack>(
185 std::placeholders::_1));
187 d->object->install_method_handler<mpris::TrackList::RemoveTrack>(
190 std::placeholders::_1));
192 d->object->install_method_handler<mpris::TrackList::GoTo>(
195 std::placeholders::_1));
204 const auto next_track = std::next(d->current_track);
205 std::cout <<
"has_next track? " << (next_track !=
tracks().get().end() ?
"yes" :
"no") << std::endl;
206 return next_track !=
tracks().get().end();
212 if (d->loop_status == media::Player::LoopStatus::playlist)
215 std::cout <<
"has_previous track? " << (d->current_track !=
tracks().get().begin() ?
"yes" :
"no") << std::endl;
216 return d->current_track !=
tracks().get().begin();
221 std::cout << __PRETTY_FUNCTION__ << std::endl;
222 if (
tracks().
get().empty())
223 return *(d->current_track);
226 if (d->loop_status == media::Player::LoopStatus::track)
228 std::cout <<
"Looping on the current track..." << std::endl;
229 return *(d->current_track);
232 else if (d->loop_status == media::Player::LoopStatus::playlist && !
has_next())
234 std::cout <<
"Looping on the entire TrackList..." << std::endl;
235 d->current_track =
tracks().get().begin();
236 return *(d->current_track);
241 d->current_track = std::next(d->current_track);
242 std::cout << *
this << std::endl;
245 return *(d->current_track);
251 return *(d->current_track);
258 if (
tracks().
get().size() && (d->current_track == d->empty_iterator))
259 d->current_track = d->skeleton.properties.tracks->get().begin();
260 else if (
tracks().
get().empty())
261 std::cerr <<
"TrackList is empty therefore there is no valid current track" << std::endl;
263 return *(d->current_track);
268 return *d->skeleton.properties.can_edit_tracks;
273 return *d->skeleton.properties.can_edit_tracks;
278 return *d->skeleton.properties.tracks;
288 return d->loop_status;
301 return *d->skeleton.properties.tracks;
307 std::cout << *
this << std::endl;
308 return d->signals.on_track_list_replaced;
313 return d->signals.on_track_added;
318 return d->signals.on_track_removed;
323 return d->signals.on_track_changed;
328 return d->signals.on_go_to_track;
333 return d->signals.on_track_list_replaced;
338 return d->signals.on_track_added;
343 return d->signals.on_track_removed;
348 return d->signals.on_track_changed;
353 return d->signals.on_go_to_track;
360 out <<
"TrackList\n---------------" << std::endl;
365 out <<
"Track Id: " <<
id << std::endl;
369 out <<
"---------------\nEnd TrackList" << std::endl;
struct mpris::TrackList::Skeleton::@20 signals
std::shared_ptr< core::dbus::Property< Properties::Tracks > > tracks
core::dbus::Signal< Signals::TrackListReplaced, Signals::TrackListReplaced::ArgumentType >::Ptr tracklist_replaced
core::dbus::Signal< Signals::TrackAdded, Signals::TrackAdded::ArgumentType >::Ptr track_added
core::dbus::Signal< Signals::TrackRemoved, Signals::TrackRemoved::ArgumentType >::Ptr track_removed
struct mpris::TrackList::Skeleton::@19 properties