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();
211 std::cout << __PRETTY_FUNCTION__ << std::endl;
212 if (
tracks().
get().empty())
213 return *(d->current_track);
216 if (d->loop_status == media::Player::LoopStatus::track)
218 std::cout <<
"Looping on the current track..." << std::endl;
219 return *(d->current_track);
222 else if (d->loop_status == media::Player::LoopStatus::playlist && !
has_next())
224 std::cout <<
"Looping on the entire TrackList..." << std::endl;
225 d->current_track =
tracks().get().begin();
226 return *(d->current_track);
231 d->current_track = std::next(d->current_track);
232 std::cout << *
this << std::endl;
235 return *(d->current_track);
242 if (
tracks().
get().size() && (d->current_track == d->empty_iterator))
243 d->current_track = d->skeleton.properties.tracks->get().begin();
244 else if (
tracks().
get().empty())
245 std::cerr <<
"TrackList is empty therefore there is no valid current track" << std::endl;
247 return *(d->current_track);
252 return *d->skeleton.properties.can_edit_tracks;
257 return *d->skeleton.properties.can_edit_tracks;
262 return *d->skeleton.properties.tracks;
272 return d->loop_status;
285 return *d->skeleton.properties.tracks;
291 std::cout << *
this << std::endl;
292 return d->signals.on_track_list_replaced;
297 return d->signals.on_track_added;
302 return d->signals.on_track_removed;
307 return d->signals.on_track_changed;
312 return d->signals.on_go_to_track;
317 return d->signals.on_track_list_replaced;
322 return d->signals.on_track_added;
327 return d->signals.on_track_removed;
332 return d->signals.on_track_changed;
337 return d->signals.on_go_to_track;
344 out <<
"TrackList\n---------------" << std::endl;
349 out <<
"Track Id: " <<
id << std::endl;
353 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