33 #include <core/dbus/object.h>
34 #include <core/dbus/property.h>
35 #include <core/dbus/stub.h>
37 #include <core/dbus/asio/executor.h>
38 #include <core/dbus/interfaces/properties.h>
47 const std::shared_ptr<core::dbus::Bus>&
bus,
48 const std::shared_ptr<core::dbus::Object>& session)
69 auto reply = dbus::Message::make_method_return(msg);
76 auto reply = dbus::Message::make_method_return(msg);
83 auto reply = dbus::Message::make_method_return(msg);
90 auto reply = dbus::Message::make_method_return(msg);
97 auto reply = dbus::Message::make_method_return(msg);
105 case core::ubuntu::media::Player::PlaybackStatus::ready:
106 case core::ubuntu::media::Player::PlaybackStatus::paused:
107 case core::ubuntu::media::Player::PlaybackStatus::stopped:
110 case core::ubuntu::media::Player::PlaybackStatus::playing:
117 bus->send(dbus::Message::make_method_return(msg));
123 in->reader() >> ticks;
126 auto reply = dbus::Message::make_method_return(in);
137 in->reader() >> texture_id;
140 auto reply = dbus::Message::make_method_return(in);
146 if (context.empty() || uri.empty())
148 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
152 if (context ==
"unconfined")
154 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
158 size_t pos = context.find_first_of(
'_');
159 if (pos == std::string::npos)
161 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
165 const std::string pkgname = context.substr(0, pos);
166 std::cout <<
"client pkgname: " << pkgname << std::endl;
167 std::cout <<
"uri: " << uri << std::endl;
170 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
171 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
173 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
176 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
177 && uri.find(pkgname) != std::string::npos)
179 std::cout <<
"Client can access content in own opt directory" << std::endl;
182 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
183 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
184 && pkgname ==
"com.ubuntu.camera")
186 std::cout <<
"Camera app can access ui sounds" << std::endl;
194 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
195 (uri.find(std::string(
"Music/")) != std::string::npos
196 || uri.find(std::string(
"Videos/")) != std::string::npos
197 || uri.find(std::string(
"/media")) != std::string::npos))
199 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
202 else if (uri.find(std::string(
"/usr/share/sounds")) != std::string::npos)
204 std::cout <<
"Client can access content in /usr/share/sounds" << std::endl;
207 else if (uri.find(std::string(
"http://")) != std::string::npos
208 || uri.find(std::string(
"rtsp://")) != std::string::npos)
210 std::cout <<
"Client can access streaming content" << std::endl;
215 std::cout <<
"Client denied access to open_uri()" << std::endl;
222 auto reply = dbus::Message::make_method_return(in);
223 reply->writer() <<
impl->
key();
236 auto reply = dbus::Message::make_method_return(in);
237 reply->writer() << (have_access ?
impl->
open_uri(uri) :
false);
250 in->reader() >> uri >> headers;
253 auto reply = dbus::Message::make_method_return(in);
254 reply->writer() << (have_access ?
impl->
open_uri(uri, headers) :
false);
260 template<
typename Property>
262 const typename Property::ValueType& value,
265 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
266 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
269 typedef std::map<std::string, dbus::types::Variant> Dictionary;
271 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
273 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
275 signal->emit(std::make_tuple(
276 dbus::traits::Service<typename Property::Interface>::interface_name(),
278 the_empty_list_of_invalidated_properties));
293 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
294 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
295 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
296 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
298 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
299 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
300 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
301 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed)
303 seeked_to.connect([remote_seeked](std::uint64_t value)
305 remote_seeked->emit(value);
315 remote_playback_status_changed->emit(status);
320 remote_video_dimension_changed->emit(mask);
337 d->object->install_method_handler<mpris::Player::Next>(
next);
340 d->object->install_method_handler<mpris::Player::Previous>(
previous);
343 d->object->install_method_handler<mpris::Player::Pause>(
pause);
346 d->object->install_method_handler<mpris::Player::Stop>(
stop);
349 d->object->install_method_handler<mpris::Player::Play>(
play);
352 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
355 d->object->install_method_handler<mpris::Player::Seek>(seek);
358 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
361 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
364 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
367 std::placeholders::_1));
369 d->object->install_method_handler<mpris::Player::Key>(
372 std::placeholders::_1));
374 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
377 std::placeholders::_1));
384 d->object->uninstall_method_handler<mpris::Player::Next>();
385 d->object->uninstall_method_handler<mpris::Player::Previous>();
386 d->object->uninstall_method_handler<mpris::Player::Pause>();
387 d->object->uninstall_method_handler<mpris::Player::Stop>();
388 d->object->uninstall_method_handler<mpris::Player::Play>();
389 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
390 d->object->uninstall_method_handler<mpris::Player::Seek>();
391 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
392 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
393 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
394 d->object->uninstall_method_handler<mpris::Player::Key>();
395 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
400 return *d->skeleton.properties.can_play;
405 return *d->skeleton.properties.can_pause;
410 return *d->skeleton.properties.can_seek;
415 return *d->skeleton.properties.can_go_previous;
420 return *d->skeleton.properties.can_go_next;
425 return *d->skeleton.properties.is_video_source;
430 return *d->skeleton.properties.is_audio_source;
435 return *d->skeleton.properties.typed_playback_status;
440 return *d->skeleton.properties.typed_loop_status;
445 return *d->skeleton.properties.playback_rate;
450 return *d->skeleton.properties.is_shuffle;
455 return *d->skeleton.properties.typed_meta_data_for_current_track;
460 return *d->skeleton.properties.volume;
465 return *d->skeleton.properties.position;
470 return *d->skeleton.properties.duration;
475 return *d->skeleton.properties.audio_stream_role;
480 return *d->skeleton.properties.orientation;
485 return *d->skeleton.properties.lifetime;
490 return *d->skeleton.properties.minimum_playback_rate;
495 return *d->skeleton.properties.maximum_playback_rate;
500 return *d->skeleton.properties.typed_loop_status;
505 return *d->skeleton.properties.playback_rate;
510 return *d->skeleton.properties.is_shuffle;
515 return *d->skeleton.properties.volume;
520 return *d->skeleton.properties.position;
525 return *d->skeleton.properties.duration;
530 return *d->skeleton.properties.audio_stream_role;
535 return *d->skeleton.properties.orientation;
540 return *d->skeleton.properties.lifetime;
545 return *d->skeleton.properties.typed_playback_status;
550 return *d->skeleton.properties.can_play;
555 return *d->skeleton.properties.can_pause;
560 return *d->skeleton.properties.can_seek;
565 return *d->skeleton.properties.can_go_previous;
570 return *d->skeleton.properties.can_go_next;
575 return *d->skeleton.properties.is_video_source;
580 return *d->skeleton.properties.is_audio_source;
585 return *d->skeleton.properties.typed_meta_data_for_current_track;
590 return *d->skeleton.properties.minimum_playback_rate;
595 return *d->skeleton.properties.maximum_playback_rate;
600 return d->signals.seeked_to;
605 return d->signals.seeked_to;
610 return d->signals.end_of_stream;
615 return d->signals.end_of_stream;
620 return d->signals.playback_status_changed;
625 return d->signals.video_dimension_changed;
630 return d->signals.video_dimension_changed;
core::dbus::Signal< Signals::VideoDimensionChanged, Signals::VideoDimensionChanged::ArgumentType >::Ptr video_dimension_changed
void get_connection_app_armor_security_async(const std::string &name, std::function< void(const std::string &)> handler)
struct mpris::Player::Skeleton::@15 signals
core::dbus::Signal< Signals::Seeked, Signals::Seeked::ArgumentType >::Ptr seeked_to
core::dbus::Signal< Signals::EndOfStream, Signals::EndOfStream::ArgumentType >::Ptr end_of_stream
core::dbus::Signal< Signals::PlaybackStatusChanged, Signals::PlaybackStatusChanged::ArgumentType >::Ptr playback_status_changed