Music Hub  ..
A session-wide music playback service
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
track_list_skeleton.cpp
Go to the documentation of this file.
1 /*
2  * Copyright © 2013 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser General Public License version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY {} without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Thomas Voß <thomas.voss@canonical.com>
17  */
18 
19 #include "track_list_skeleton.h"
20 
21 #include <core/media/player.h>
22 #include <core/media/track_list.h>
23 
24 #include "codec.h"
25 #include "property_stub.h"
26 #include "track_list_traits.h"
27 #include "the_session_bus.h"
28 
29 #include "mpris/track_list.h"
30 
31 #include <core/dbus/object.h>
32 #include <core/dbus/property.h>
33 #include <core/dbus/types/object_path.h>
34 #include <core/dbus/types/variant.h>
35 #include <core/dbus/types/stl/map.h>
36 #include <core/dbus/types/stl/vector.h>
37 
38 #include <limits>
39 
40 namespace dbus = core::dbus;
41 namespace media = core::ubuntu::media;
42 
44 {
46  dbus::Object::Ptr object)
47  : impl(impl),
48  object(object),
49  can_edit_tracks(object->get_property<mpris::TrackList::Properties::CanEditTracks>()),
50  tracks(object->get_property<mpris::TrackList::Properties::Tracks>()),
51  current_track(tracks->get().begin()),
52  empty_iterator(tracks->get().begin())
53  {
54  }
55 
56  void handle_get_tracks_metadata(const core::dbus::Message::Ptr& msg)
57  {
58  media::Track::Id track;
59  msg->reader() >> track;
60 
61  auto meta_data = impl->query_meta_data_for_track(track);
62 
63  auto reply = dbus::Message::make_method_return(msg);
64  reply->writer() << *meta_data;
65  impl->access_bus()->send(reply);
66  }
67 
68  void handle_add_track_with_uri_at(const core::dbus::Message::Ptr& msg)
69  {
70  Track::UriType uri; media::Track::Id after; bool make_current;
71  msg->reader() >> uri >> after >> make_current;
72 
73  impl->add_track_with_uri_at(uri, after, make_current);
74 
75  auto reply = dbus::Message::make_method_return(msg);
76  impl->access_bus()->send(reply);
77  }
78 
79  void handle_remove_track(const core::dbus::Message::Ptr& msg)
80  {
81  media::Track::Id track;
82  msg->reader() >> track;
83 
84  impl->remove_track(track);
85 
86  auto reply = dbus::Message::make_method_return(msg);
87  impl->access_bus()->send(reply);
88  }
89 
90  void handle_go_to(const core::dbus::Message::Ptr& msg)
91  {
92  media::Track::Id track;
93  msg->reader() >> track;
94 
95  impl->go_to(track);
96 
97  auto reply = dbus::Message::make_method_return(msg);
98  impl->access_bus()->send(reply);
99  }
100 
102  dbus::Object::Ptr object;
103 
104  std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::CanEditTracks>> can_edit_tracks;
105  std::shared_ptr<core::dbus::Property<mpris::TrackList::Properties::Tracks>> tracks;
108 
109  core::Signal<void> on_track_list_replaced;
110  core::Signal<Track::Id> on_track_added;
111  core::Signal<Track::Id> on_track_removed;
112  core::Signal<Track::Id> on_track_changed;
113 };
114 
116  const dbus::types::ObjectPath& op)
117  : dbus::Skeleton<media::TrackList>(the_session_bus()),
118  d(new Private(this, access_service()->add_object_for_path(op)))
119 {
120  d->object->install_method_handler<mpris::TrackList::GetTracksMetadata>(
122  std::ref(d),
123  std::placeholders::_1));
124 
125  d->object->install_method_handler<mpris::TrackList::AddTrack>(
127  std::ref(d),
128  std::placeholders::_1));
129 
130  d->object->install_method_handler<mpris::TrackList::RemoveTrack>(
131  std::bind(&Private::handle_remove_track,
132  std::ref(d),
133  std::placeholders::_1));
134 
135  d->object->install_method_handler<mpris::TrackList::GoTo>(
136  std::bind(&Private::handle_go_to,
137  std::ref(d),
138  std::placeholders::_1));
139 }
140 
142 {
143 }
144 
146 {
147  return d->current_track != d->tracks->get().end();
148 }
149 
151 {
152  if (d->tracks->get().empty())
153  return *(d->current_track);
154 
155  if (d->tracks->get().size() && (d->current_track == d->empty_iterator))
156  {
157  d->current_track = d->tracks->get().begin();
158  return *(d->current_track = std::next(d->current_track));
159  }
160 
161  d->current_track = std::next(d->current_track);
162  return *(d->current_track);
163 }
164 
165 const core::Property<bool>& media::TrackListSkeleton::can_edit_tracks() const
166 {
167  return *d->can_edit_tracks;
168 }
169 
170 core::Property<bool>& media::TrackListSkeleton::can_edit_tracks()
171 {
172  return *d->can_edit_tracks;
173 }
174 
175 core::Property<media::TrackList::Container>& media::TrackListSkeleton::tracks()
176 {
177  return *d->tracks;
178 }
179 
180 const core::Property<media::TrackList::Container>& media::TrackListSkeleton::tracks() const
181 {
182  return *d->tracks;
183 }
184 
185 const core::Signal<void>& media::TrackListSkeleton::on_track_list_replaced() const
186 {
187  return d->on_track_list_replaced;
188 }
189 
190 const core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_added() const
191 {
192  return d->on_track_added;
193 }
194 
195 const core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_removed() const
196 {
197  return d->on_track_removed;
198 }
199 
200 const core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_changed() const
201 {
202  return d->on_track_changed;
203 }
204 
206 {
207  return d->on_track_list_replaced;
208 }
209 
210 core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_added()
211 {
212  return d->on_track_added;
213 }
214 
215 core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_removed()
216 {
217  return d->on_track_removed;
218 }
219 
220 core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_changed()
221 {
222  return d->on_track_changed;
223 }
const core::Property< Container > & tracks() const
std::shared_ptr< core::dbus::Property< mpris::TrackList::Properties::Tracks > > tracks
core::dbus::Bus::Ptr the_session_bus()
const core::Signal< Track::Id > & on_track_changed() const
Definition: player.h:40
const core::Signal< Track::Id > & on_track_removed() const
void handle_remove_track(const core::dbus::Message::Ptr &msg)
std::shared_ptr< core::dbus::Property< mpris::TrackList::Properties::CanEditTracks > > can_edit_tracks
void handle_get_tracks_metadata(const core::dbus::Message::Ptr &msg)
const core::Signal< void > & on_track_list_replaced() const
void handle_go_to(const core::dbus::Message::Ptr &msg)
void handle_add_track_with_uri_at(const core::dbus::Message::Ptr &msg)
core::Signal< Track::Id > on_track_changed
const core::Signal< Track::Id > & on_track_added() const
TrackList::ConstIterator current_track
core::Signal< Track::Id > on_track_added
core::Signal< Track::Id > on_track_removed
std::string UriType
Definition: track.h:40
Private(media::TrackListSkeleton *impl, dbus::Object::Ptr object)
TrackListSkeleton(const core::dbus::types::ObjectPath &op)
const core::Property< bool > & can_edit_tracks() const
Container::const_iterator ConstIterator
Definition: track_list.h:43
TrackList::ConstIterator empty_iterator