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);
243 template<
typename Property>
245 const typename Property::ValueType& value,
248 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
249 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
252 typedef std::map<std::string, dbus::types::Variant> Dictionary;
254 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
256 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
258 signal->emit(std::make_tuple(
259 dbus::traits::Service<typename Property::Interface>::interface_name(),
261 the_empty_list_of_invalidated_properties));
276 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
277 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
278 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
279 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
281 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
282 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
283 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
284 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed)
286 seeked_to.connect([remote_seeked](std::uint64_t value)
288 remote_seeked->emit(value);
298 remote_playback_status_changed->emit(status);
303 remote_video_dimension_changed->emit(mask);
320 d->object->install_method_handler<mpris::Player::Next>(
next);
323 d->object->install_method_handler<mpris::Player::Previous>(
previous);
326 d->object->install_method_handler<mpris::Player::Pause>(
pause);
329 d->object->install_method_handler<mpris::Player::Stop>(
stop);
332 d->object->install_method_handler<mpris::Player::Play>(
play);
335 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
338 d->object->install_method_handler<mpris::Player::Seek>(seek);
341 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
344 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
347 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
350 std::placeholders::_1));
352 d->object->install_method_handler<mpris::Player::Key>(
355 std::placeholders::_1));
362 d->object->uninstall_method_handler<mpris::Player::Next>();
363 d->object->uninstall_method_handler<mpris::Player::Previous>();
364 d->object->uninstall_method_handler<mpris::Player::Pause>();
365 d->object->uninstall_method_handler<mpris::Player::Stop>();
366 d->object->uninstall_method_handler<mpris::Player::Play>();
367 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
368 d->object->uninstall_method_handler<mpris::Player::Seek>();
369 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
370 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
371 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
372 d->object->uninstall_method_handler<mpris::Player::Key>();
377 return *d->skeleton.properties.can_play;
382 return *d->skeleton.properties.can_pause;
387 return *d->skeleton.properties.can_seek;
392 return *d->skeleton.properties.can_go_previous;
397 return *d->skeleton.properties.can_go_next;
402 return *d->skeleton.properties.is_video_source;
407 return *d->skeleton.properties.is_audio_source;
412 return *d->skeleton.properties.typed_playback_status;
417 return *d->skeleton.properties.typed_loop_status;
422 return *d->skeleton.properties.playback_rate;
427 return *d->skeleton.properties.is_shuffle;
432 return *d->skeleton.properties.typed_meta_data_for_current_track;
437 return *d->skeleton.properties.volume;
442 return *d->skeleton.properties.position;
447 return *d->skeleton.properties.duration;
452 return *d->skeleton.properties.audio_stream_role;
457 return *d->skeleton.properties.orientation;
462 return *d->skeleton.properties.minimum_playback_rate;
467 return *d->skeleton.properties.maximum_playback_rate;
472 return *d->skeleton.properties.typed_loop_status;
477 return *d->skeleton.properties.playback_rate;
482 return *d->skeleton.properties.is_shuffle;
487 return *d->skeleton.properties.volume;
492 return *d->skeleton.properties.position;
497 return *d->skeleton.properties.duration;
502 return *d->skeleton.properties.audio_stream_role;
507 return *d->skeleton.properties.orientation;
512 return *d->skeleton.properties.typed_playback_status;
517 return *d->skeleton.properties.can_play;
522 return *d->skeleton.properties.can_pause;
527 return *d->skeleton.properties.can_seek;
532 return *d->skeleton.properties.can_go_previous;
537 return *d->skeleton.properties.can_go_next;
542 return *d->skeleton.properties.is_video_source;
547 return *d->skeleton.properties.is_audio_source;
552 return *d->skeleton.properties.typed_meta_data_for_current_track;
557 return *d->skeleton.properties.minimum_playback_rate;
562 return *d->skeleton.properties.maximum_playback_rate;
567 return d->signals.seeked_to;
572 return d->signals.seeked_to;
577 return d->signals.end_of_stream;
582 return d->signals.end_of_stream;
587 return d->signals.playback_status_changed;
592 return d->signals.video_dimension_changed;
597 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