38 #include <core/dbus/object.h> 39 #include <core/dbus/property.h> 40 #include <core/dbus/stub.h> 42 #include <core/dbus/asio/executor.h> 43 #include <core/dbus/interfaces/properties.h> 51 const std::shared_ptr<core::dbus::Bus>&
bus,
52 const std::shared_ptr<core::dbus::Object>& session,
58 request_context_resolver{request_context_resolver},
78 auto reply = dbus::Message::make_method_return(msg);
85 auto reply = dbus::Message::make_method_return(msg);
92 auto reply = dbus::Message::make_method_return(msg);
99 auto reply = dbus::Message::make_method_return(msg);
106 auto reply = dbus::Message::make_method_return(msg);
112 switch(
impl->playback_status().get())
114 case core::ubuntu::media::Player::PlaybackStatus::ready:
115 case core::ubuntu::media::Player::PlaybackStatus::paused:
116 case core::ubuntu::media::Player::PlaybackStatus::stopped:
119 case core::ubuntu::media::Player::PlaybackStatus::playing:
126 bus->send(dbus::Message::make_method_return(msg));
132 in->reader() >> ticks;
133 impl->seek_to(std::chrono::microseconds(ticks));
135 auto reply = dbus::Message::make_method_return(in);
146 in->reader() >> texture_id;
148 core::dbus::Message::Ptr reply;
152 impl->create_gl_texture_video_sink(texture_id);
153 reply = dbus::Message::make_method_return(in);
155 catch (
const media::Player::Errors::OutOfProcessBufferStreamingNotSupported& e)
157 reply = dbus::Message::make_error(
164 reply = dbus::Message::make_error(
175 auto reply = dbus::Message::make_method_return(in);
176 reply->writer() <<
impl->key();
182 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
187 auto reply = dbus::Message::make_method_return(in);
189 const bool valid_uri = !
uri_check->is_local_file() or
193 const std::string err_str = {
"Warning: Failed to open uri " + uri +
194 " because it can't be found."};
196 reply = dbus::Message::make_error(
205 if (std::get<0>(result))
207 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri) :
false);
211 const std::string err_str = {
"Warning: Failed to authenticate necessary " 212 "apparmor permissions to open uri: " + std::get<1>(result)};
214 reply = dbus::Message::make_error(
227 request_context_resolver->resolve_context_for_dbus_name_async(in->sender(), [
this, in](
const media::apparmor::ubuntu::Context& context)
232 in->reader() >> uri >> headers;
234 auto reply = dbus::Message::make_method_return(in);
236 const bool valid_uri = !
uri_check->is_local_file() or
240 const std::string err_str = {
"Warning: Failed to open uri " + uri +
241 " because it can't be found."};
243 reply = dbus::Message::make_error(
252 if (std::get<0>(result))
254 reply->writer() << (std::get<0>(result) ?
impl->open_uri(uri, headers) :
false);
258 const std::string err_str = {
"Warning: Failed to authenticate necessary " 259 "apparmor permissions to open uri: " + std::get<1>(result)};
261 reply = dbus::Message::make_error(
272 template<
typename Property>
274 const typename Property::ValueType& value,
277 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
278 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
281 typedef std::map<std::string, dbus::types::Variant> Dictionary;
283 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
285 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
287 signal->emit(std::make_tuple(
288 dbus::traits::Service<typename Property::Interface>::interface_name(),
290 the_empty_list_of_invalidated_properties));
304 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
305 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
306 typedef core::dbus::Signal<mpris::Player::Signals::AboutToFinish, mpris::Player::Signals::AboutToFinish::ArgumentType>
DBusAboutToFinishSignal;
307 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
308 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
309 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
312 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
313 const std::shared_ptr<DBusAboutToFinishSignal>& remote_atf,
314 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
315 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
316 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed,
317 const std::shared_ptr<DBusErrorSignal>& remote_error,
318 const std::shared_ptr<DBusBufferingChangedSignal>& remote_buffering_changed)
320 seeked_to.connect([remote_seeked](std::uint64_t value)
322 remote_seeked->emit(value);
337 remote_playback_status_changed->emit(status);
342 remote_video_dimension_changed->emit(dimensions);
347 remote_error->emit(e);
352 remote_buffering_changed->emit(value);
362 core::Signal<media::Player::Error>
error;
369 : d(new
Private{
this, config.
bus, config.session, config.request_context_resolver, config.request_authenticator})
373 d->object->install_method_handler<mpris::Player::Next>(
next);
376 d->object->install_method_handler<mpris::Player::Previous>(
previous);
379 d->object->install_method_handler<mpris::Player::Pause>(
pause);
382 d->object->install_method_handler<mpris::Player::Stop>(
stop);
385 d->object->install_method_handler<mpris::Player::Play>(
play);
388 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
391 d->object->install_method_handler<mpris::Player::Seek>(seek);
394 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
397 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
400 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
403 std::placeholders::_1));
405 d->object->install_method_handler<mpris::Player::Key>(
408 std::placeholders::_1));
410 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
413 std::placeholders::_1));
420 d->object->uninstall_method_handler<mpris::Player::Next>();
421 d->object->uninstall_method_handler<mpris::Player::Previous>();
422 d->object->uninstall_method_handler<mpris::Player::Pause>();
423 d->object->uninstall_method_handler<mpris::Player::Stop>();
424 d->object->uninstall_method_handler<mpris::Player::Play>();
425 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
426 d->object->uninstall_method_handler<mpris::Player::Seek>();
427 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
428 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
429 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
430 d->object->uninstall_method_handler<mpris::Player::Key>();
431 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
436 return *d->skeleton.properties.can_play;
441 return *d->skeleton.properties.can_pause;
446 return *d->skeleton.properties.can_seek;
451 return *d->skeleton.properties.can_go_previous;
456 return *d->skeleton.properties.can_go_next;
461 return *d->skeleton.properties.is_video_source;
466 return *d->skeleton.properties.is_audio_source;
471 return *d->skeleton.properties.typed_playback_status;
476 return *d->skeleton.properties.typed_backend;
481 return *d->skeleton.properties.typed_loop_status;
486 return *d->skeleton.properties.playback_rate;
491 return *d->skeleton.properties.shuffle;
496 return *d->skeleton.properties.meta_data_for_current_track;
501 return *d->skeleton.properties.volume;
506 return *d->skeleton.properties.position;
511 return *d->skeleton.properties.duration;
516 return *d->skeleton.properties.audio_stream_role;
521 return *d->skeleton.properties.orientation;
526 return *d->skeleton.properties.lifetime;
531 return *d->skeleton.properties.minimum_playback_rate;
536 return *d->skeleton.properties.maximum_playback_rate;
541 return *d->skeleton.properties.typed_loop_status;
546 return *d->skeleton.properties.playback_rate;
551 return *d->skeleton.properties.shuffle;
556 return *d->skeleton.properties.volume;
561 return *d->skeleton.properties.position;
566 return *d->skeleton.properties.duration;
571 return *d->skeleton.properties.audio_stream_role;
576 return *d->skeleton.properties.orientation;
581 return *d->skeleton.properties.lifetime;
586 return *d->skeleton.properties.typed_playback_status;
591 return *d->skeleton.properties.typed_backend;
596 return *d->skeleton.properties.can_play;
601 return *d->skeleton.properties.can_pause;
606 return *d->skeleton.properties.can_seek;
611 return *d->skeleton.properties.can_go_previous;
616 return *d->skeleton.properties.can_go_next;
621 return *d->skeleton.properties.is_video_source;
626 return *d->skeleton.properties.is_audio_source;
631 return *d->skeleton.properties.meta_data_for_current_track;
636 return *d->skeleton.properties.minimum_playback_rate;
641 return *d->skeleton.properties.maximum_playback_rate;
646 return d->signals.seeked_to;
651 return d->signals.seeked_to;
656 return d->signals.about_to_finish;
661 return d->signals.about_to_finish;
666 return d->signals.end_of_stream;
671 return d->signals.end_of_stream;
676 return d->signals.playback_status_changed;
681 return d->signals.video_dimension_changed;
686 return d->signals.video_dimension_changed;
691 return d->signals.error;
696 return d->signals.error;
701 return d->signals.buffering_changed;
706 return d->signals.buffering_changed;
struct mpris::Player::Skeleton::@16 signals
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
static constexpr const char * name
core::dbus::Signal< Signals::Buffering, Signals::Buffering::ArgumentType >::Ptr buffering_changed
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