36 #include <core/dbus/object.h> 37 #include <core/dbus/property.h> 38 #include <core/dbus/stub.h> 40 #include <core/dbus/asio/executor.h> 41 #include <core/dbus/interfaces/properties.h> 49 const std::shared_ptr<core::dbus::Bus>&
bus,
50 const std::shared_ptr<core::dbus::Object>& session,
56 request_context_resolver{request_context_resolver},
75 auto reply = dbus::Message::make_method_return(msg);
82 auto reply = dbus::Message::make_method_return(msg);
89 auto reply = dbus::Message::make_method_return(msg);
96 auto reply = dbus::Message::make_method_return(msg);
103 auto reply = dbus::Message::make_method_return(msg);
109 switch(
impl->playback_status().get())
111 case core::ubuntu::media::Player::PlaybackStatus::ready:
112 case core::ubuntu::media::Player::PlaybackStatus::paused:
113 case core::ubuntu::media::Player::PlaybackStatus::stopped:
116 case core::ubuntu::media::Player::PlaybackStatus::playing:
123 bus->send(dbus::Message::make_method_return(msg));
129 in->reader() >> ticks;
130 impl->seek_to(std::chrono::microseconds(ticks));
132 auto reply = dbus::Message::make_method_return(in);
143 in->reader() >> texture_id;
145 core::dbus::Message::Ptr reply;
149 impl->create_gl_texture_video_sink(texture_id);
150 reply = dbus::Message::make_method_return(in);
152 catch (
const media::Player::Errors::OutOfProcessBufferStreamingNotSupported& e)
154 reply = dbus::Message::make_error(
161 reply = dbus::Message::make_error(
172 auto reply = dbus::Message::make_method_return(in);
173 reply->writer() <<
impl->key();
179 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
184 auto reply = dbus::Message::make_method_return(in);
186 const bool valid_uri = !
uri_check->is_local_file() or
190 const std::string err_str = {
"Warning: Failed to open uri " + uri +
191 " because it can't be found."};
192 std::cerr << err_str << std::endl;
193 reply = dbus::Message::make_error(
202 if (std::get<0>(result))
204 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri) :
false);
208 const std::string err_str = {
"Warning: Failed to authenticate necessary " 209 "apparmor permissions to open uri: " + std::get<1>(result)};
210 std::cerr << err_str << std::endl;
211 reply = dbus::Message::make_error(
224 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
229 in->reader() >> uri >> headers;
231 auto reply = dbus::Message::make_method_return(in);
233 const bool valid_uri = !
uri_check->is_local_file() or
237 const std::string err_str = {
"Warning: Failed to open uri " + uri +
238 " because it can't be found."};
239 std::cerr << err_str << std::endl;
240 reply = dbus::Message::make_error(
249 if (std::get<0>(result))
251 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri, headers) :
false);
255 const std::string err_str = {
"Warning: Failed to authenticate necessary " 256 "apparmor permissions to open uri: " + std::get<1>(result)};
257 std::cerr << err_str << std::endl;
258 reply = dbus::Message::make_error(
269 template<
typename Property>
271 const typename Property::ValueType& value,
274 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
275 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
278 typedef std::map<std::string, dbus::types::Variant> Dictionary;
280 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
282 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
284 signal->emit(std::make_tuple(
285 dbus::traits::Service<typename Property::Interface>::interface_name(),
287 the_empty_list_of_invalidated_properties));
301 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
302 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
303 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
304 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
305 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
306 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
308 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
309 const std::shared_ptr<DBusAboutToFinishSignal>& remote_atf,
310 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
311 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
312 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed,
313 const std::shared_ptr<DBusErrorSignal>& remote_error)
315 seeked_to.connect([remote_seeked](std::uint64_t value)
317 remote_seeked->emit(value);
332 remote_playback_status_changed->emit(status);
337 remote_video_dimension_changed->emit(dimensions);
342 remote_error->emit(e);
351 core::Signal<media::Player::Error>
error;
357 : d(new
Private{
this, config.
bus, config.session, config.request_context_resolver, config.request_authenticator})
361 d->object->install_method_handler<mpris::Player::Next>(
next);
364 d->object->install_method_handler<mpris::Player::Previous>(
previous);
367 d->object->install_method_handler<mpris::Player::Pause>(
pause);
370 d->object->install_method_handler<mpris::Player::Stop>(
stop);
373 d->object->install_method_handler<mpris::Player::Play>(
play);
376 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
379 d->object->install_method_handler<mpris::Player::Seek>(seek);
382 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
385 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
388 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
391 std::placeholders::_1));
393 d->object->install_method_handler<mpris::Player::Key>(
396 std::placeholders::_1));
398 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
401 std::placeholders::_1));
408 d->object->uninstall_method_handler<mpris::Player::Next>();
409 d->object->uninstall_method_handler<mpris::Player::Previous>();
410 d->object->uninstall_method_handler<mpris::Player::Pause>();
411 d->object->uninstall_method_handler<mpris::Player::Stop>();
412 d->object->uninstall_method_handler<mpris::Player::Play>();
413 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
414 d->object->uninstall_method_handler<mpris::Player::Seek>();
415 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
416 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
417 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
418 d->object->uninstall_method_handler<mpris::Player::Key>();
419 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
424 return *d->skeleton.properties.can_play;
429 return *d->skeleton.properties.can_pause;
434 return *d->skeleton.properties.can_seek;
439 return *d->skeleton.properties.can_go_previous;
444 return *d->skeleton.properties.can_go_next;
449 return *d->skeleton.properties.is_video_source;
454 return *d->skeleton.properties.is_audio_source;
459 return *d->skeleton.properties.typed_playback_status;
464 return *d->skeleton.properties.typed_loop_status;
469 return *d->skeleton.properties.playback_rate;
474 return *d->skeleton.properties.shuffle;
479 return *d->skeleton.properties.typed_meta_data_for_current_track;
484 return *d->skeleton.properties.volume;
489 return *d->skeleton.properties.position;
494 return *d->skeleton.properties.duration;
499 return *d->skeleton.properties.audio_stream_role;
504 return *d->skeleton.properties.orientation;
509 return *d->skeleton.properties.lifetime;
514 return *d->skeleton.properties.minimum_playback_rate;
519 return *d->skeleton.properties.maximum_playback_rate;
524 return *d->skeleton.properties.typed_loop_status;
529 return *d->skeleton.properties.playback_rate;
534 return *d->skeleton.properties.shuffle;
539 return *d->skeleton.properties.volume;
544 return *d->skeleton.properties.position;
549 return *d->skeleton.properties.duration;
554 return *d->skeleton.properties.audio_stream_role;
559 return *d->skeleton.properties.orientation;
564 return *d->skeleton.properties.lifetime;
569 return *d->skeleton.properties.typed_playback_status;
574 return *d->skeleton.properties.can_play;
579 return *d->skeleton.properties.can_pause;
584 return *d->skeleton.properties.can_seek;
589 return *d->skeleton.properties.can_go_previous;
594 return *d->skeleton.properties.can_go_next;
599 return *d->skeleton.properties.is_video_source;
604 return *d->skeleton.properties.is_audio_source;
609 return *d->skeleton.properties.typed_meta_data_for_current_track;
614 return *d->skeleton.properties.minimum_playback_rate;
619 return *d->skeleton.properties.maximum_playback_rate;
624 return d->signals.seeked_to;
629 return d->signals.seeked_to;
634 return d->signals.about_to_finish;
639 return d->signals.about_to_finish;
644 return d->signals.end_of_stream;
649 return d->signals.end_of_stream;
654 return d->signals.playback_status_changed;
659 return d->signals.video_dimension_changed;
664 return d->signals.video_dimension_changed;
669 return d->signals.error;
674 return d->signals.error;
struct mpris::Player::Skeleton::@16 signals
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
static constexpr const char * name
static constexpr const char * name
core::dbus::Signal< Signals::AboutToFinish, Signals::AboutToFinish::ArgumentType >::Ptr about_to_finish
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
static constexpr const char * name
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error