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)
68 auto reply = dbus::Message::make_method_return(msg);
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);
104 case core::ubuntu::media::Player::PlaybackStatus::ready:
105 case core::ubuntu::media::Player::PlaybackStatus::paused:
106 case core::ubuntu::media::Player::PlaybackStatus::stopped:
109 case core::ubuntu::media::Player::PlaybackStatus::playing:
116 bus->send(dbus::Message::make_method_return(msg));
122 in->reader() >> ticks;
125 auto reply = dbus::Message::make_method_return(in);
136 in->reader() >> texture_id;
139 auto reply = dbus::Message::make_method_return(in);
145 if (context.empty() || uri.empty())
147 std::cout <<
"Client denied access since context or uri are empty" << std::endl;
151 if (context ==
"unconfined")
153 std::cout <<
"Client allowed access since it's unconfined" << std::endl;
157 size_t pos = context.find_first_of(
'_');
158 if (pos == std::string::npos)
160 std::cout <<
"Client denied access since it's an invalid apparmor security context" << std::endl;
164 const std::string pkgname = context.substr(0, pos);
165 std::cout <<
"client pkgname: " << pkgname << std::endl;
166 std::cout <<
"uri: " << uri << std::endl;
169 if (uri.find(std::string(
".local/share/" + pkgname +
"/")) != std::string::npos
170 || uri.find(std::string(
".cache/" + pkgname +
"/")) != std::string::npos)
172 std::cout <<
"Client can access content in ~/.local/share/" << pkgname <<
" or ~/.cache/" << pkgname << std::endl;
175 else if (uri.find(std::string(
"opt/click.ubuntu.com/")) != std::string::npos
176 && uri.find(pkgname) != std::string::npos)
178 std::cout <<
"Client can access content in own opt directory" << std::endl;
181 else if ((uri.find(std::string(
"/system/media/audio/ui/")) != std::string::npos
182 || uri.find(std::string(
"/android/system/media/audio/ui/")) != std::string::npos)
183 && pkgname ==
"com.ubuntu.camera")
185 std::cout <<
"Camera app can access ui sounds" << std::endl;
193 else if ((pkgname ==
"com.ubuntu.music" || pkgname ==
"com.ubuntu.gallery") &&
194 (uri.find(std::string(
"Music/")) != std::string::npos
195 || uri.find(std::string(
"Videos/")) != std::string::npos
196 || uri.find(std::string(
"/media")) != std::string::npos))
198 std::cout <<
"Client can access content in ~/Music or ~/Videos" << std::endl;
201 else if (uri.find(std::string(
"/usr/share/sounds")) != std::string::npos)
203 std::cout <<
"Client can access content in /usr/share/sounds" << std::endl;
206 else if (uri.find(std::string(
"http://")) != std::string::npos
207 || uri.find(std::string(
"rtsp://")) != std::string::npos)
209 std::cout <<
"Client can access streaming content" << std::endl;
214 std::cout <<
"Client denied access to open_uri()" << std::endl;
221 auto reply = dbus::Message::make_method_return(in);
222 reply->writer() <<
impl->
key();
235 auto reply = dbus::Message::make_method_return(in);
236 reply->writer() << (have_access ?
impl->
open_uri(uri) :
false);
242 template<
typename Property>
244 const typename Property::ValueType& value,
247 core::dbus::interfaces::Properties::Signals::PropertiesChanged,
248 core::dbus::interfaces::Properties::Signals::PropertiesChanged::ArgumentType
251 typedef std::map<std::string, dbus::types::Variant> Dictionary;
253 static const std::vector<std::string> the_empty_list_of_invalidated_properties;
255 Dictionary dict; dict[Property::name()] = dbus::types::Variant::encode(value);
257 signal->emit(std::make_tuple(
258 dbus::traits::Service<typename Property::Interface>::interface_name(),
260 the_empty_list_of_invalidated_properties));
275 typedef core::dbus::Signal<mpris::Player::Signals::Seeked, mpris::Player::Signals::Seeked::ArgumentType>
DBusSeekedToSignal;
276 typedef core::dbus::Signal<mpris::Player::Signals::EndOfStream, mpris::Player::Signals::EndOfStream::ArgumentType>
DBusEndOfStreamSignal;
277 typedef core::dbus::Signal<mpris::Player::Signals::PlaybackStatusChanged, mpris::Player::Signals::PlaybackStatusChanged::ArgumentType>
DBusPlaybackStatusChangedSignal;
279 Signals(
const std::shared_ptr<DBusSeekedToSignal>& remote_seeked,
280 const std::shared_ptr<DBusEndOfStreamSignal>& remote_eos,
281 const std::shared_ptr<DBusPlaybackStatusChangedSignal>& remote_playback_status_changed)
283 seeked_to.connect([remote_seeked](std::uint64_t value)
285 remote_seeked->emit(value);
295 remote_playback_status_changed->emit(status);
311 d->object->install_method_handler<mpris::Player::Next>(
next);
314 d->object->install_method_handler<mpris::Player::Previous>(
previous);
317 d->object->install_method_handler<mpris::Player::Pause>(
pause);
320 d->object->install_method_handler<mpris::Player::Stop>(
stop);
323 d->object->install_method_handler<mpris::Player::Play>(
play);
326 d->object->install_method_handler<mpris::Player::PlayPause>(play_pause);
329 d->object->install_method_handler<mpris::Player::Seek>(seek);
332 d->object->install_method_handler<mpris::Player::SetPosition>(set_position);
335 d->object->install_method_handler<mpris::Player::OpenUri>(
open_uri);
338 d->object->install_method_handler<mpris::Player::CreateVideoSink>(
341 std::placeholders::_1));
343 d->object->install_method_handler<mpris::Player::Key>(
346 std::placeholders::_1));
355 return *d->skeleton.properties.can_play;
360 return *d->skeleton.properties.can_pause;
365 return *d->skeleton.properties.can_seek;
370 return *d->skeleton.properties.can_go_previous;
375 return *d->skeleton.properties.can_go_next;
380 return *d->skeleton.properties.is_video_source;
385 return *d->skeleton.properties.is_audio_source;
390 return *d->skeleton.properties.typed_playback_status;
395 return *d->skeleton.properties.typed_loop_status;
400 return *d->skeleton.properties.playback_rate;
405 return *d->skeleton.properties.is_shuffle;
410 return *d->skeleton.properties.typed_meta_data_for_current_track;
415 return *d->skeleton.properties.volume;
420 return *d->skeleton.properties.position;
425 return *d->skeleton.properties.duration;
430 return *d->skeleton.properties.audio_stream_role;
435 return *d->skeleton.properties.minimum_playback_rate;
440 return *d->skeleton.properties.maximum_playback_rate;
445 return *d->skeleton.properties.typed_loop_status;
450 return *d->skeleton.properties.playback_rate;
455 return *d->skeleton.properties.is_shuffle;
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.typed_playback_status;
485 return *d->skeleton.properties.can_play;
490 return *d->skeleton.properties.can_pause;
495 return *d->skeleton.properties.can_seek;
500 return *d->skeleton.properties.can_go_previous;
505 return *d->skeleton.properties.can_go_next;
510 return *d->skeleton.properties.is_video_source;
515 return *d->skeleton.properties.is_audio_source;
521 return *d->skeleton.properties.typed_meta_data_for_current_track;
526 return *d->skeleton.properties.minimum_playback_rate;
531 return *d->skeleton.properties.maximum_playback_rate;
536 return d->signals.seeked_to;
541 return d->signals.seeked_to;
546 return d->signals.end_of_stream;
551 return d->signals.end_of_stream;
556 return d->signals.playback_status_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