Merge lp:~thomas-voss/media-hub/rebuild-against-dbus-cpp into lp:media-hub
- rebuild-against-dbus-cpp
- Merge into trunk
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 |
Related bugs: |
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; |