Merge lp:~thomas-voss/media-hub/rebuild-against-dbus-cpp into lp:media-hub

Proposed by Thomas Voß
Status: Superseded
Proposed branch: lp:~thomas-voss/media-hub/rebuild-against-dbus-cpp
Merge into: lp:media-hub
Diff against target: 678 lines (+292/-32) (has conflicts)
13 files modified
CMakeLists.txt (+5/-0)
README (+4/-0)
debian/changelog (+20/-0)
include/core/media/track_list.h (+18/-1)
src/core/media/mpris/track_list.h (+21/-0)
src/core/media/player_implementation.cpp (+12/-0)
src/core/media/track_list.cpp (+5/-0)
src/core/media/track_list_implementation.cpp (+74/-23)
src/core/media/track_list_implementation.h (+1/-0)
src/core/media/track_list_skeleton.cpp (+85/-5)
src/core/media/track_list_skeleton.h (+2/-0)
src/core/media/track_list_stub.cpp (+43/-3)
src/core/media/track_list_stub.h (+2/-0)
Text conflict in CMakeLists.txt
Text conflict in debian/changelog
To merge this branch: bzr merge lp:~thomas-voss/media-hub/rebuild-against-dbus-cpp
Reviewer Review Type Date Requested Status
Ubuntu Phablet Team Pending
Review via email: mp+277222@code.launchpad.net

This proposal has been superseded by a proposal from 2015-11-11.

Commit message

Version bump to force rebuild.

Description of the change

Version bump to force rebuild.

To post a comment you must log in.

Unmerged revisions

163. By Thomas Voß

Version bump to force rebuild.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'CMakeLists.txt'
2--- CMakeLists.txt 2015-10-16 08:32:58 +0000
3+++ CMakeLists.txt 2015-11-11 09:47:06 +0000
4@@ -2,8 +2,13 @@
5
6 project(ubuntu-media-hub)
7
8+<<<<<<< TREE
9 set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 4)
10 set(UBUNTU_MEDIA_HUB_VERSION_MINOR 1)
11+=======
12+set(UBUNTU_MEDIA_HUB_VERSION_MAJOR 3)
13+set(UBUNTU_MEDIA_HUB_VERSION_MINOR 3)
14+>>>>>>> MERGE-SOURCE
15 set(UBUNTU_MEDIA_HUB_VERSION_PATCH 0)
16
17 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -fPIC -pthread")
18
19=== modified file 'README'
20--- README 2015-09-09 14:08:12 +0000
21+++ README 2015-11-11 09:47:06 +0000
22@@ -6,6 +6,10 @@
23
24 https://google-styleguide.googlecode.com/svn/trunk/cppguide.html
25
26+Deviations from the Google Style Guide above:
27+
28+1. We will agree to maximum of 100 characters in a single line instead of 80.
29+
30
31 To Build:
32 ---------
33
34=== modified file 'debian/changelog'
35--- debian/changelog 2015-10-16 08:42:28 +0000
36+++ debian/changelog 2015-11-11 09:47:06 +0000
37@@ -1,3 +1,4 @@
38+<<<<<<< TREE
39 media-hub (4.1.0+15.10.20151016.1-0ubuntu1) wily; urgency=medium
40
41 [ Simon Fels ]
42@@ -9,6 +10,25 @@
43 being freed. Also, remove unneeded unrefs that must be performed in
44 gstreamer instead.
45 * Emit CanPlay, CanPause, and CanGo[Next|Previous] in the mpris object path
46+=======
47+media-hub (3.3.0+15.04.20151023.3-0ubuntu2) UNRELEASED; urgency=medium
48+
49+ * Version bump to force rebuild.
50+
51+ -- Thomas Voß <thomas.voss@canonical.com> Wed, 11 Nov 2015 10:34:27 +0100
52+
53+media-hub (3.3.0+15.04.20151023.3-0ubuntu1) vivid; urgency=medium
54+
55+ [ Jim Hodapp ]
56+ * Add batch adding of tracks to the TrackList.
57+
58+ [ CI Train Bot ]
59+ * New rebuild forced.
60+
61+ -- Jim Hodapp <ci-train-bot@canonical.com> Fri, 23 Oct 2015 19:07:52 +0000
62+
63+media-hub (3.2.0+15.04.20151014-0ubuntu1) vivid; urgency=medium
64+>>>>>>> MERGE-SOURCE
65
66 [ Jim Hodapp ]
67 * Make sure the correct player is set as the current player controled by
68
69=== modified file 'include/core/media/track_list.h'
70--- include/core/media/track_list.h 2015-07-20 20:39:42 +0000
71+++ include/core/media/track_list.h 2015-11-11 09:47:06 +0000
72@@ -41,10 +41,21 @@
73 {
74 public:
75 typedef std::vector<Track::Id> Container;
76+ typedef std::vector<Track::UriType> ContainerURI;
77 typedef std::tuple<std::vector<Track::Id>, Track::Id> ContainerTrackIdTuple;
78 typedef Container::iterator Iterator;
79 typedef Container::const_iterator ConstIterator;
80
81+ struct Errors
82+ {
83+ Errors() = delete;
84+
85+ struct InsufficientPermissionsToAddTrack : public std::runtime_error
86+ {
87+ InsufficientPermissionsToAddTrack();
88+ };
89+ };
90+
91 static const Track::Id& after_empty_track();
92
93 TrackList(const TrackList&) = delete;
94@@ -65,9 +76,12 @@
95 /** Gets the URI for a given Track. */
96 virtual Track::UriType query_uri_for_track(const Track::Id& id) = 0;
97
98- /** Adds a URI in the TrackList. */
99+ /** Adds a URI into the TrackList. */
100 virtual void add_track_with_uri_at(const Track::UriType& uri, const Track::Id& position, bool make_current) = 0;
101
102+ /** Adds a list of URIs into the TrackList. */
103+ virtual void add_tracks_with_uri_at(const ContainerURI& uris, const Track::Id& position) = 0;
104+
105 /** Removes a Track from the TrackList. */
106 virtual void remove_track(const Track::Id& id) = 0;
107
108@@ -103,6 +117,9 @@
109 /** Indicates that a track has been added to the track list. */
110 virtual const core::Signal<Track::Id>& on_track_added() const = 0;
111
112+ /** Indicates that one or more tracks have been added to the track list. */
113+ virtual const core::Signal<ContainerURI>& on_tracks_added() const = 0;
114+
115 /** Indicates that a track has been removed from the track list. */
116 virtual const core::Signal<Track::Id>& on_track_removed() const = 0;
117
118
119=== modified file 'src/core/media/mpris/track_list.h'
120--- src/core/media/mpris/track_list.h 2015-07-27 22:15:33 +0000
121+++ src/core/media/mpris/track_list.h 2015-11-11 09:47:06 +0000
122@@ -48,9 +48,21 @@
123 return s;
124 }
125
126+ struct Error
127+ {
128+ struct InsufficientPermissionsToAddTrack
129+ {
130+ static constexpr const char* name
131+ {
132+ "mpris.TrackList.Error.InsufficientPermissionsToAddTrack"
133+ };
134+ };
135+ };
136+
137 DBUS_CPP_METHOD_DEF(GetTracksMetadata, TrackList)
138 DBUS_CPP_METHOD_DEF(GetTracksUri, TrackList)
139 DBUS_CPP_METHOD_DEF(AddTrack, TrackList)
140+ DBUS_CPP_METHOD_DEF(AddTracks, TrackList)
141 DBUS_CPP_METHOD_DEF(RemoveTrack, TrackList)
142 DBUS_CPP_METHOD_DEF(GoTo, TrackList)
143 DBUS_CPP_METHOD_DEF(Reset, TrackList)
144@@ -75,6 +87,13 @@
145
146 DBUS_CPP_SIGNAL_DEF
147 (
148+ TracksAdded,
149+ TrackList,
150+ core::ubuntu::media::TrackList::ContainerURI
151+ )
152+
153+ DBUS_CPP_SIGNAL_DEF
154+ (
155 TrackRemoved,
156 TrackList,
157 core::ubuntu::media::Track::Id
158@@ -134,6 +153,7 @@
159 {
160 configuration.object->template get_signal<Signals::TrackListReplaced>(),
161 configuration.object->template get_signal<Signals::TrackAdded>(),
162+ configuration.object->template get_signal<Signals::TracksAdded>(),
163 configuration.object->template get_signal<Signals::TrackRemoved>(),
164 configuration.object->template get_signal<Signals::TrackChanged>(),
165 configuration.object->template get_signal<Signals::TrackMetadataChanged>(),
166@@ -178,6 +198,7 @@
167 {
168 core::dbus::Signal<Signals::TrackListReplaced, Signals::TrackListReplaced::ArgumentType>::Ptr tracklist_replaced;
169 core::dbus::Signal<Signals::TrackAdded, Signals::TrackAdded::ArgumentType>::Ptr track_added;
170+ core::dbus::Signal<Signals::TracksAdded, Signals::TracksAdded::ArgumentType>::Ptr tracks_added;
171 core::dbus::Signal<Signals::TrackRemoved, Signals::TrackRemoved::ArgumentType>::Ptr track_removed;
172 core::dbus::Signal<Signals::TrackChanged, Signals::TrackChanged::ArgumentType>::Ptr track_changed;
173 core::dbus::Signal<Signals::TrackMetadataChanged, Signals::TrackMetadataChanged::ArgumentType>::Ptr track_metadata_changed;
174
175=== modified file 'src/core/media/player_implementation.cpp'
176--- src/core/media/player_implementation.cpp 2015-09-29 11:07:54 +0000
177+++ src/core/media/player_implementation.cpp 2015-11-11 09:47:06 +0000
178@@ -547,6 +547,18 @@
179 d->update_mpris_properties();
180 });
181
182+ d->track_list->on_tracks_added().connect([this](const media::TrackList::ContainerURI& tracks)
183+ {
184+ std::cout << "** Track was added, handling in PlayerImplementation" << std::endl;
185+ // If the two sizes are the same, that means the TrackList was previously empty and we need
186+ // to open the first track in the TrackList so that is_audio_source() and is_video_source()
187+ // will function correctly.
188+ if (tracks.size() >= 1 and d->track_list->tracks()->size() == tracks.size())
189+ d->open_first_track_from_tracklist(tracks.front());
190+
191+ d->update_mpris_properties();
192+ });
193+
194 d->track_list->on_track_removed().connect([this](const media::Track::Id&)
195 {
196 d->update_mpris_properties();
197
198=== modified file 'src/core/media/track_list.cpp'
199--- src/core/media/track_list.cpp 2015-07-20 20:39:42 +0000
200+++ src/core/media/track_list.cpp 2015-11-11 09:47:06 +0000
201@@ -20,6 +20,11 @@
202
203 namespace media = core::ubuntu::media;
204
205+media::TrackList::Errors::InsufficientPermissionsToAddTrack::InsufficientPermissionsToAddTrack()
206+ : std::runtime_error{"Insufficient client permissions for adding track to TrackList"}
207+{
208+}
209+
210 const media::Track::Id& media::TrackList::after_empty_track()
211 {
212 static const media::Track::Id id{"/org/mpris/MediaPlayer2/TrackList/NoTrack"};
213
214=== modified file 'src/core/media/track_list_implementation.cpp'
215--- src/core/media/track_list_implementation.cpp 2015-09-28 13:20:01 +0000
216+++ src/core/media/track_list_implementation.cpp 2015-11-11 09:47:06 +0000
217@@ -20,6 +20,9 @@
218 #include <stdio.h>
219 #include <stdlib.h>
220 #include <tuple>
221+#include <unistd.h>
222+
223+#include <dbus/dbus.h>
224
225 #include "track_list_implementation.h"
226
227@@ -39,6 +42,30 @@
228 // Used for caching the original tracklist order to be used to restore the order
229 // to the live TrackList after shuffle is turned off
230 media::TrackList::Container original_tracklist;
231+
232+ void updateCachedTrackMetadata(const media::Track::Id& id, const media::Track::UriType& uri)
233+ {
234+ if (meta_data_cache.count(id) == 0)
235+ {
236+ // FIXME: This code seems to conflict badly when called multiple times in a row: causes segfaults
237+#if 0
238+ try {
239+ meta_data_cache[id] = std::make_tuple(
240+ uri,
241+ extractor->meta_data_for_track_with_uri(uri));
242+ } catch (const std::runtime_error &e) {
243+ std::cerr << "Failed to retrieve metadata for track '" << uri << "' (" << e.what() << ")" << std::endl;
244+ }
245+#else
246+ meta_data_cache[id] = std::make_tuple(
247+ uri,
248+ core::ubuntu::media::Track::MetaData{});
249+#endif
250+ } else
251+ {
252+ std::get<0>(meta_data_cache[id]) = uri;
253+ }
254+ }
255 };
256
257 media::TrackListImplementation::TrackListImplementation(
258@@ -84,7 +111,8 @@
259 {
260 std::cout << __PRETTY_FUNCTION__ << std::endl;
261
262- std::stringstream ss; ss << d->object->path().as_string() << "/" << d->track_counter++;
263+ std::stringstream ss;
264+ ss << d->object->path().as_string() << "/" << d->track_counter++;
265 Track::Id id{ss.str()};
266
267 std::cout << "Adding Track::Id: " << id << std::endl;
268@@ -101,26 +129,7 @@
269
270 if (result)
271 {
272- if (d->meta_data_cache.count(id) == 0)
273- {
274- // FIXME: This code seems to conflict badly when called multiple times in a row: causes segfaults
275-#if 0
276- try {
277- d->meta_data_cache[id] = std::make_tuple(
278- uri,
279- d->extractor->meta_data_for_track_with_uri(uri));
280- } catch (const std::runtime_error &e) {
281- std::cerr << "Failed to retrieve metadata for track '" << uri << "' (" << e.what() << ")" << std::endl;
282- }
283-#else
284- d->meta_data_cache[id] = std::make_tuple(
285- uri,
286- core::ubuntu::media::Track::MetaData{});
287-#endif
288- } else
289- {
290- std::get<0>(d->meta_data_cache[id]) = uri;
291- }
292+ d->updateCachedTrackMetadata(id, uri);
293
294 if (make_current)
295 {
296@@ -138,8 +147,50 @@
297 std::cout << "Signaling that we just added track id: " << id << std::endl;
298 // Signal to the client that a track was added to the TrackList
299 on_track_added()(id);
300- std::cout << "Signaled that we just added track id: " << id << std::endl;
301- }
302+ }
303+}
304+
305+void media::TrackListImplementation::add_tracks_with_uri_at(const ContainerURI& uris, const Track::Id& position)
306+{
307+ std::cout << __PRETTY_FUNCTION__ << std::endl;
308+
309+ ContainerURI tmp;
310+ for (const auto uri : uris)
311+ {
312+ // TODO: Refactor this code to use a smaller common function shared with add_track_with_uri_at()
313+ std::stringstream ss;
314+ ss << d->object->path().as_string() << "/" << d->track_counter++;
315+ Track::Id id{ss.str()};
316+ std::cout << "Adding Track::Id: " << id << std::endl;
317+ std::cout << "\tURI: " << uri << std::endl;
318+
319+ tmp.push_back(id);
320+
321+ Track::Id insert_position = position;
322+
323+ auto it = std::find(tracks().get().begin(), tracks().get().end(), insert_position);
324+ auto result = tracks().update([this, id, position, it, &insert_position](TrackList::Container& container)
325+ {
326+ container.insert(it, id);
327+ // Make sure the next insert position is after the current insert position
328+ // Update the Track::Id after which to insert the next one from uris
329+ insert_position = id;
330+
331+ return true;
332+ });
333+
334+ if (result)
335+ {
336+ d->updateCachedTrackMetadata(id, uri);
337+
338+ // Signal to the client that the current track has changed for the first track added to the TrackList
339+ if (tracks().get().size() == 1)
340+ on_track_changed()(id);
341+ }
342+ }
343+
344+ std::cout << "Signaling that we just added " << tmp.size() << " tracks to the TrackList" << std::endl;
345+ on_tracks_added()(tmp);
346 }
347
348 void media::TrackListImplementation::remove_track(const media::Track::Id& id)
349
350=== modified file 'src/core/media/track_list_implementation.h'
351--- src/core/media/track_list_implementation.h 2015-05-22 21:19:28 +0000
352+++ src/core/media/track_list_implementation.h 2015-11-11 09:47:06 +0000
353@@ -43,6 +43,7 @@
354 Track::MetaData query_meta_data_for_track(const Track::Id& id);
355
356 void add_track_with_uri_at(const Track::UriType& uri, const Track::Id& position, bool make_current);
357+ void add_tracks_with_uri_at(const ContainerURI& uris, const Track::Id& position);
358 void remove_track(const Track::Id& id);
359
360 void go_to(const Track::Id& track, bool toggle_player_state);
361
362=== modified file 'src/core/media/track_list_skeleton.cpp'
363--- src/core/media/track_list_skeleton.cpp 2015-09-28 15:31:46 +0000
364+++ src/core/media/track_list_skeleton.cpp 2015-11-11 09:47:06 +0000
365@@ -59,6 +59,7 @@
366 signals
367 {
368 skeleton.signals.track_added,
369+ skeleton.signals.tracks_added,
370 skeleton.signals.track_removed,
371 skeleton.signals.track_changed,
372 skeleton.signals.tracklist_replaced
373@@ -93,9 +94,12 @@
374 void handle_add_track_with_uri_at(const core::dbus::Message::Ptr& msg)
375 {
376 std::cout << "*** " << __PRETTY_FUNCTION__ << std::endl;
377- request_context_resolver->resolve_context_for_dbus_name_async(msg->sender(), [this, msg](const media::apparmor::ubuntu::Context& context)
378+ request_context_resolver->resolve_context_for_dbus_name_async
379+ (msg->sender(), [this, msg](const media::apparmor::ubuntu::Context& context)
380 {
381- Track::UriType uri; media::Track::Id after; bool make_current;
382+ Track::UriType uri;
383+ media::Track::Id after;
384+ bool make_current;
385 msg->reader() >> uri >> after >> make_current;
386
387 // Make sure the client has adequate apparmor permissions to open the URI
388@@ -104,10 +108,63 @@
389 auto reply = dbus::Message::make_method_return(msg);
390 // Only add the track to the TrackList if it passes the apparmor permissions check
391 if (std::get<0>(result))
392+ {
393 impl->add_track_with_uri_at(uri, after, make_current);
394- else
395- std::cerr << "Warning: Not adding track " << uri <<
396- " to TrackList because of inadequate client apparmor permissions." << std::endl;
397+ }
398+ else
399+ {
400+ const std::string err_str = {"Warning: Not adding track " + uri +
401+ " to TrackList because of inadequate client apparmor permissions."};
402+ std::cerr << err_str << std::endl;
403+ reply = dbus::Message::make_error(
404+ msg,
405+ mpris::TrackList::Error::InsufficientPermissionsToAddTrack::name,
406+ err_str);
407+ }
408+
409+ bus->send(reply);
410+ });
411+ }
412+
413+ void handle_add_tracks_with_uri_at(const core::dbus::Message::Ptr& msg)
414+ {
415+ std::cout << "*** " << __PRETTY_FUNCTION__ << std::endl;
416+ request_context_resolver->resolve_context_for_dbus_name_async
417+ (msg->sender(), [this, msg](const media::apparmor::ubuntu::Context& context)
418+ {
419+ ContainerURI uris;
420+ media::Track::Id after;
421+ msg->reader() >> uris >> after;
422+
423+ media::apparmor::ubuntu::RequestAuthenticator::Result result;
424+ std::string err_str;
425+ for (const auto uri : uris)
426+ {
427+ // Make sure the client has adequate apparmor permissions to open the URI
428+ result = request_authenticator->authenticate_open_uri_request(context, uri);
429+ if (not std::get<0>(result))
430+ {
431+ err_str = {"Warning: Not adding track " + uri +
432+ " to TrackList because of inadequate client apparmor permissions."};
433+ break;
434+ }
435+ }
436+
437+ core::dbus::Message::Ptr reply;
438+ // Only add the track to the TrackList if it passes the apparmor permissions check
439+ if (std::get<0>(result))
440+ {
441+ reply = dbus::Message::make_method_return(msg);
442+ impl->add_tracks_with_uri_at(uris, after);
443+ }
444+ else
445+ {
446+ std::cerr << err_str << std::endl;
447+ reply = dbus::Message::make_error(
448+ msg,
449+ mpris::TrackList::Error::InsufficientPermissionsToAddTrack::name,
450+ err_str);
451+ }
452
453 bus->send(reply);
454 });
455@@ -159,11 +216,13 @@
456 struct Signals
457 {
458 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackAdded, mpris::TrackList::Signals::TrackAdded::ArgumentType> DBusTrackAddedSignal;
459+ typedef core::dbus::Signal<mpris::TrackList::Signals::TracksAdded, mpris::TrackList::Signals::TracksAdded::ArgumentType> DBusTracksAddedSignal;
460 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackRemoved, mpris::TrackList::Signals::TrackRemoved::ArgumentType> DBusTrackRemovedSignal;
461 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackChanged, mpris::TrackList::Signals::TrackChanged::ArgumentType> DBusTrackChangedSignal;
462 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackListReplaced, mpris::TrackList::Signals::TrackListReplaced::ArgumentType> DBusTrackListReplacedSignal;
463
464 Signals(const std::shared_ptr<DBusTrackAddedSignal>& remote_track_added,
465+ const std::shared_ptr<DBusTracksAddedSignal>& remote_tracks_added,
466 const std::shared_ptr<DBusTrackRemovedSignal>& remote_track_removed,
467 const std::shared_ptr<DBusTrackChangedSignal>& remote_track_changed,
468 const std::shared_ptr<DBusTrackListReplacedSignal>& remote_track_list_replaced)
469@@ -174,6 +233,11 @@
470 remote_track_added->emit(id);
471 });
472
473+ on_tracks_added.connect([remote_tracks_added](const media::TrackList::ContainerURI &tracks)
474+ {
475+ remote_tracks_added->emit(tracks);
476+ });
477+
478 on_track_removed.connect([remote_track_removed](const media::Track::Id &id)
479 {
480 remote_track_removed->emit(id);
481@@ -191,6 +255,7 @@
482 }
483
484 core::Signal<Track::Id> on_track_added;
485+ core::Signal<TrackList::ContainerURI> on_tracks_added;
486 core::Signal<Track::Id> on_track_removed;
487 core::Signal<Track::Id> on_track_changed;
488 core::Signal<TrackList::ContainerTrackIdTuple> on_track_list_replaced;
489@@ -219,6 +284,11 @@
490 std::ref(d),
491 std::placeholders::_1));
492
493+ d->object->install_method_handler<mpris::TrackList::AddTracks>(
494+ std::bind(&Private::handle_add_tracks_with_uri_at,
495+ std::ref(d),
496+ std::placeholders::_1));
497+
498 d->object->install_method_handler<mpris::TrackList::RemoveTrack>(
499 std::bind(&Private::handle_remove_track,
500 std::ref(d),
501@@ -490,6 +560,11 @@
502 return d->signals.on_track_added;
503 }
504
505+const core::Signal<media::TrackList::ContainerURI>& media::TrackListSkeleton::on_tracks_added() const
506+{
507+ return d->signals.on_tracks_added;
508+}
509+
510 const core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_removed() const
511 {
512 return d->signals.on_track_removed;
513@@ -520,6 +595,11 @@
514 return d->signals.on_track_added;
515 }
516
517+core::Signal<media::TrackList::ContainerURI>& media::TrackListSkeleton::on_tracks_added()
518+{
519+ return d->signals.on_tracks_added;
520+}
521+
522 core::Signal<media::Track::Id>& media::TrackListSkeleton::on_track_removed()
523 {
524 return d->signals.on_track_removed;
525
526=== modified file 'src/core/media/track_list_skeleton.h'
527--- src/core/media/track_list_skeleton.h 2015-09-28 13:20:01 +0000
528+++ src/core/media/track_list_skeleton.h 2015-11-11 09:47:06 +0000
529@@ -54,6 +54,8 @@
530 core::Signal<ContainerTrackIdTuple>& on_track_list_replaced();
531 const core::Signal<Track::Id>& on_track_added() const;
532 core::Signal<Track::Id>& on_track_added();
533+ const core::Signal<ContainerURI>& on_tracks_added() const;
534+ core::Signal<ContainerURI>& on_tracks_added();
535 const core::Signal<Track::Id>& on_track_removed() const;
536 const core::Signal<Track::Id>& on_track_changed() const;
537 core::Signal<Track::Id>& on_track_changed();
538
539=== modified file 'src/core/media/track_list_stub.cpp'
540--- src/core/media/track_list_stub.cpp 2015-07-27 22:15:33 +0000
541+++ src/core/media/track_list_stub.cpp 2015-11-11 09:47:06 +0000
542@@ -52,6 +52,7 @@
543 signals
544 {
545 object->get_signal<mpris::TrackList::Signals::TrackAdded>(),
546+ object->get_signal<mpris::TrackList::Signals::TracksAdded>(),
547 object->get_signal<mpris::TrackList::Signals::TrackRemoved>(),
548 object->get_signal<mpris::TrackList::Signals::TrackListReplaced>(),
549 object->get_signal<mpris::TrackList::Signals::TrackChanged>()
550@@ -70,21 +71,25 @@
551 struct Signals
552 {
553 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackAdded, mpris::TrackList::Signals::TrackAdded::ArgumentType> DBusTrackAddedSignal;
554+ typedef core::dbus::Signal<mpris::TrackList::Signals::TracksAdded, mpris::TrackList::Signals::TracksAdded::ArgumentType> DBusTracksAddedSignal;
555 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackRemoved, mpris::TrackList::Signals::TrackRemoved::ArgumentType> DBusTrackRemovedSignal;
556 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackListReplaced, mpris::TrackList::Signals::TrackListReplaced::ArgumentType> DBusTrackListReplacedSignal;
557 typedef core::dbus::Signal<mpris::TrackList::Signals::TrackChanged, mpris::TrackList::Signals::TrackChanged::ArgumentType> DBusTrackChangedSignal;
558
559 Signals(const std::shared_ptr<DBusTrackAddedSignal>& track_added,
560+ const std::shared_ptr<DBusTracksAddedSignal>& tracks_added,
561 const std::shared_ptr<DBusTrackRemovedSignal>& track_removed,
562 const std::shared_ptr<DBusTrackListReplacedSignal>& track_list_replaced,
563 const std::shared_ptr<DBusTrackChangedSignal>& track_changed)
564 : on_track_added(),
565+ on_tracks_added(),
566 on_track_removed(),
567 on_track_list_replaced(),
568 on_track_changed(),
569 dbus
570 {
571 track_added,
572+ tracks_added,
573 track_removed,
574 track_list_replaced,
575 track_changed,
576@@ -96,6 +101,12 @@
577 on_track_added(id);
578 });
579
580+ dbus.on_tracks_added->connect([this](const media::TrackList::ContainerURI& tracks)
581+ {
582+ std::cout << "OnTracksAdded signal arrived via the bus." << std::endl;
583+ on_tracks_added(tracks);
584+ });
585+
586 dbus.on_track_removed->connect([this](const Track::Id& id)
587 {
588 std::cout << "OnTrackRemoved signal arrived via the bus." << std::endl;
589@@ -116,6 +127,7 @@
590 }
591
592 core::Signal<Track::Id> on_track_added;
593+ core::Signal<media::TrackList::ContainerURI> on_tracks_added;
594 core::Signal<Track::Id> on_track_removed;
595 core::Signal<media::TrackList::ContainerTrackIdTuple> on_track_list_replaced;
596 core::Signal<Track::Id> on_track_changed;
597@@ -125,6 +137,7 @@
598 struct DBus
599 {
600 std::shared_ptr<DBusTrackAddedSignal> on_track_added;
601+ std::shared_ptr<DBusTracksAddedSignal> on_tracks_added;
602 std::shared_ptr<DBusTrackRemovedSignal> on_track_removed;
603 std::shared_ptr<DBusTrackListReplacedSignal> on_track_list_replaced;
604 std::shared_ptr<DBusTrackChangedSignal> on_track_changed;
605@@ -184,16 +197,38 @@
606
607 void media::TrackListStub::add_track_with_uri_at(
608 const media::Track::UriType& uri,
609- const media::Track::Id& id,
610+ const media::Track::Id& position,
611 bool make_current)
612 {
613 auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTrack, void>(
614 uri,
615- id,
616+ position,
617 make_current);
618
619 if (op.is_error())
620- throw std::runtime_error("Problem adding track: " + op.error());
621+ {
622+ if (op.error().name() ==
623+ mpris::TrackList::Error::InsufficientPermissionsToAddTrack::name)
624+ throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
625+ else
626+ throw std::runtime_error{op.error().print()};
627+ }
628+}
629+
630+void media::TrackListStub::add_tracks_with_uri_at(const ContainerURI& uris, const Track::Id& position)
631+{
632+ auto op = d->object->invoke_method_synchronously<mpris::TrackList::AddTracks, void>(
633+ uris,
634+ position);
635+
636+ if (op.is_error())
637+ {
638+ if (op.error().name() ==
639+ mpris::TrackList::Error::InsufficientPermissionsToAddTrack::name)
640+ throw media::TrackList::Errors::InsufficientPermissionsToAddTrack{};
641+ else
642+ throw std::runtime_error{op.error().print()};
643+ }
644 }
645
646 void media::TrackListStub::remove_track(const media::Track::Id& track)
647@@ -255,6 +290,11 @@
648 return d->signals.on_track_added;
649 }
650
651+const core::Signal<media::TrackList::ContainerURI>& media::TrackListStub::on_tracks_added() const
652+{
653+ return d->signals.on_tracks_added;
654+}
655+
656 const core::Signal<media::Track::Id>& media::TrackListStub::on_track_removed() const
657 {
658 return d->signals.on_track_removed;
659
660=== modified file 'src/core/media/track_list_stub.h'
661--- src/core/media/track_list_stub.h 2015-07-20 20:39:42 +0000
662+++ src/core/media/track_list_stub.h 2015-11-11 09:47:06 +0000
663@@ -48,6 +48,7 @@
664 Track::UriType query_uri_for_track(const Track::Id& id);
665
666 void add_track_with_uri_at(const Track::UriType& uri, const Track::Id& position, bool make_current);
667+ void add_tracks_with_uri_at(const ContainerURI& uris, const Track::Id& position);
668 void remove_track(const Track::Id& id);
669
670 void go_to(const Track::Id& track, bool toggle_player_state);
671@@ -62,6 +63,7 @@
672
673 const core::Signal<ContainerTrackIdTuple>& on_track_list_replaced() const;
674 const core::Signal<Track::Id>& on_track_added() const;
675+ const core::Signal<ContainerURI>& on_tracks_added() const;
676 const core::Signal<Track::Id>& on_track_removed() const;
677 const core::Signal<Track::Id>& on_track_changed() const;
678 const core::Signal<std::pair<Track::Id, bool>>& on_go_to_track() const;

Subscribers

People subscribed via source and target branches