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)
70 auto reply = dbus::Message::make_method_return(msg);
77 auto reply = dbus::Message::make_method_return(msg);
84 auto reply = dbus::Message::make_method_return(msg);
91 auto reply = dbus::Message::make_method_return(msg);
98 auto reply = dbus::Message::make_method_return(msg);
106 case core::ubuntu::media::Player::PlaybackStatus::ready:
107 case core::ubuntu::media::Player::PlaybackStatus::paused:
108 case core::ubuntu::media::Player::PlaybackStatus::stopped:
111 case core::ubuntu::media::Player::PlaybackStatus::playing:
118 bus->send(dbus::Message::make_method_return(msg));
124 in->reader() >> ticks;
127 auto reply = dbus::Message::make_method_return(in);
138 in->reader() >> texture_id;
141 auto reply = dbus::Message::make_method_return(in);
147 if (context.empty() || uri.empty())
149 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
153 if (context ==
"unconfined")
155 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
159 size_t pos = context.find_first_of(
'_');
160 if (pos == std::string::npos)
162 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
166 const std::string pkgname = context.substr(0, pos);
167 std::cout <<
"client pkgname: " << pkgname << std::endl;
168 std::cout <<
"uri: " << uri << std::endl;
171 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
172 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
174 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
177 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
178 && uri.find(pkgname) != std::string::npos)
180 std::cout <<
"Client can access content in own opt directory" << std::endl;
183 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
184 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
185 && pkgname ==
"com.ubuntu.camera")
187 std::cout <<
"Camera app can access ui sounds" << std::endl;
195 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
196 (uri.find(std::string(
"Music/")) != std::string::npos
197 || uri.find(std::string(
"Videos/")) != std::string::npos
198 || uri.find(std::string(
"/media")) != std::string::npos))
200 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
203 else if (uri.find(std::string(
"/usr/share/sounds")) != std::string::npos)
205 std::cout <<
"Client can access content in /usr/share/sounds" << std::endl;
208 else if (uri.find(std::string(
"http://")) != std::string::npos
209 || uri.find(std::string(
"rtsp://")) != std::string::npos)
211 std::cout <<
"Client can access streaming content" << std::endl;
216 std::cout <<
"Client denied access to open_uri()" << std::endl;
223 auto reply = dbus::Message::make_method_return(in);
224 reply->writer() <<
impl->
key();
237 auto reply = dbus::Message::make_method_return(in);
238 reply->writer() << (have_access ?
impl->
open_uri(uri) :
false);
251 in->reader() >> uri >> headers;
254 auto reply = dbus::Message::make_method_return(in);
255 reply->writer() << (have_access ?
impl->
open_uri(uri, headers) :
false);
261 template<
typename Property>
263 const typename Property::ValueType& value,
266 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
267 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
270 typedef std::map<std::string, dbus::types::Variant> Dictionary;
272 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
274 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
276 signal->emit(std::make_tuple(
277 dbus::traits::Service<typename Property::Interface>::interface_name(),
279 the_empty_list_of_invalidated_properties));
294 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
295 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
296 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
297 typedef core::dbus::Signal<mpris::Player::Signals::VideoDimensionChanged, mpris::Player::Signals::VideoDimensionChanged::ArgumentType>
DBusVideoDimensionChangedSignal;
298 typedef core::dbus::Signal<mpris::Player::Signals::Error, mpris::Player::Signals::Error::ArgumentType>
DBusErrorSignal;
300 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
301 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
302 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed,
303 const std::shared_ptr<DBusVideoDimensionChangedSignal>& remote_video_dimension_changed,
304 const std::shared_ptr<DBusErrorSignal>& remote_error)
306 seeked_to.connect([remote_seeked](std::uint64_t value)
308 remote_seeked->emit(value);
318 remote_playback_status_changed->emit(status);
323 remote_video_dimension_changed->emit(mask);
328 remote_error->emit(e);
336 core::Signal<media::Player::Error>
error;
346 d->object->install_method_handler<mpris::Player::Next>(
next);
349 d->object->install_method_handler<mpris::Player::Previous>(
previous);
352 d->object->install_method_handler<mpris::Player::Pause>(
pause);
355 d->object->install_method_handler<mpris::Player::Stop>(
stop);
358 d->object->install_method_handler<mpris::Player::Play>(
play);
361 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
364 d->object->install_method_handler<mpris::Player::Seek>(seek);
367 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
370 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
373 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
376 std::placeholders::_1));
378 d->object->install_method_handler<mpris::Player::Key>(
381 std::placeholders::_1));
383 d->object->install_method_handler<mpris::Player::OpenUriExtended>(
386 std::placeholders::_1));
393 d->object->uninstall_method_handler<mpris::Player::Next>();
394 d->object->uninstall_method_handler<mpris::Player::Previous>();
395 d->object->uninstall_method_handler<mpris::Player::Pause>();
396 d->object->uninstall_method_handler<mpris::Player::Stop>();
397 d->object->uninstall_method_handler<mpris::Player::Play>();
398 d->object->uninstall_method_handler<mpris::Player::PlayPause>();
399 d->object->uninstall_method_handler<mpris::Player::Seek>();
400 d->object->uninstall_method_handler<mpris::Player::SetPosition>();
401 d->object->uninstall_method_handler<mpris::Player::OpenUri>();
402 d->object->uninstall_method_handler<mpris::Player::CreateVideoSink>();
403 d->object->uninstall_method_handler<mpris::Player::Key>();
404 d->object->uninstall_method_handler<mpris::Player::OpenUriExtended>();
409 return *d->skeleton.properties.can_play;
414 return *d->skeleton.properties.can_pause;
419 return *d->skeleton.properties.can_seek;
424 return *d->skeleton.properties.can_go_previous;
429 return *d->skeleton.properties.can_go_next;
434 return *d->skeleton.properties.is_video_source;
439 return *d->skeleton.properties.is_audio_source;
444 return *d->skeleton.properties.typed_playback_status;
449 return *d->skeleton.properties.typed_loop_status;
454 return *d->skeleton.properties.playback_rate;
459 return *d->skeleton.properties.is_shuffle;
464 return *d->skeleton.properties.typed_meta_data_for_current_track;
469 return *d->skeleton.properties.volume;
474 return *d->skeleton.properties.position;
479 return *d->skeleton.properties.duration;
484 return *d->skeleton.properties.audio_stream_role;
489 return *d->skeleton.properties.orientation;
494 return *d->skeleton.properties.lifetime;
499 return *d->skeleton.properties.minimum_playback_rate;
504 return *d->skeleton.properties.maximum_playback_rate;
509 return *d->skeleton.properties.typed_loop_status;
514 return *d->skeleton.properties.playback_rate;
519 return *d->skeleton.properties.is_shuffle;
524 return *d->skeleton.properties.volume;
529 return *d->skeleton.properties.position;
534 return *d->skeleton.properties.duration;
539 return *d->skeleton.properties.audio_stream_role;
544 return *d->skeleton.properties.orientation;
549 return *d->skeleton.properties.lifetime;
554 return *d->skeleton.properties.typed_playback_status;
559 return *d->skeleton.properties.can_play;
564 return *d->skeleton.properties.can_pause;
569 return *d->skeleton.properties.can_seek;
574 return *d->skeleton.properties.can_go_previous;
579 return *d->skeleton.properties.can_go_next;
584 return *d->skeleton.properties.is_video_source;
589 return *d->skeleton.properties.is_audio_source;
594 return *d->skeleton.properties.typed_meta_data_for_current_track;
599 return *d->skeleton.properties.minimum_playback_rate;
604 return *d->skeleton.properties.maximum_playback_rate;
609 return d->signals.seeked_to;
614 return d->signals.seeked_to;
619 return d->signals.end_of_stream;
624 return d->signals.end_of_stream;
629 return d->signals.playback_status_changed;
634 return d->signals.video_dimension_changed;
639 return d->signals.video_dimension_changed;
644 return d->signals.error;
649 return d->signals.error;
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
core::dbus::Signal< Signals::Error, Signals::Error::ArgumentType >::Ptr error