36 #include <QDBusArgument>
37 #include <QDBusMessage>
45 namespace MediaHubService {
58 void openUri(
const QDBusMessage &in,
const QDBusConnection &bus,
64 QScopedPointer<DBusPropertyNotifier> m_propertyNotifier;
65 QDBusConnection m_connection;
68 QTimer m_bufferingTimer;
69 QDateTime m_bufferingLastEmission;
79 m_player(conf.player),
80 m_connection(conf.connection),
82 request_authenticator{conf.request_authenticator},
96 if (!impl->canGoNext()) {
97 Q_EMIT q->EndOfStream();
102 Q_EMIT q->PlaybackStatusChanged(impl->playbackStatus());
106 const QSize size = impl->videoDimension();
107 Q_EMIT q->VideoDimensionChanged(size.height(), size.width());
111 Q_EMIT q->Error(error);
114 q, [
this, q](
int buffering) {
115 QDateTime now = QDateTime::currentDateTime();
116 if (!m_bufferingLastEmission.isValid() ||
117 m_bufferingLastEmission.msecsTo(now) > 500) {
119 Q_EMIT q->Buffering(buffering);
120 m_bufferingLastEmission = now;
123 QDateTime nextEmission = m_bufferingLastEmission.addMSecs(500);
124 m_bufferingValue = buffering;
125 m_bufferingTimer.start(now.msecsTo(nextEmission));
128 m_bufferingTimer.setSingleShot(
true);
129 m_bufferingTimer.callOnTimeout(q, [
this, q]() {
130 Q_EMIT q->Buffering(m_bufferingValue);
131 m_bufferingLastEmission = QDateTime::currentDateTime();
157 const QDBusConnection &bus,
160 in.setDelayedReply(
true);
161 request_context_resolver->resolve_context_for_dbus_name_async(in.service(),
164 using Headers = Player::HeadersType;
166 const auto args = in.arguments();
167 QUrl uri = QUrl::fromUserInput(args.value(0).toString());
169 if (callType == OpenUriCall::UriWithHeaders) {
170 const QDBusArgument dbusHeaders = args.value(1).value<QDBusArgument>();
171 dbusHeaders >> headers;
176 const bool valid_uri = !uri.isEmpty() and
177 (!uri_check.is_local_file() or uri_check.file_exists());
180 const QString err_str = {
"Warning: Failed to open uri " + uri.toString() +
181 " because it can't be found."};
182 MH_ERROR(
"%s", qUtf8Printable(err_str));
183 reply = in.createErrorReply(
190 const auto result = request_authenticator->authenticate_open_uri_request(context, uri);
191 if (std::get<0>(result))
193 reply = in.createReply();
194 reply << (std::get<0>(result) ? m_player->
open_uri(uri, headers) :
false);
198 const QString err_str = {
"Warning: Failed to authenticate necessary "
199 "apparmor permissions to open uri: " + std::get<1>(result)};
200 MH_ERROR(
"%s", qUtf8Printable(err_str));
201 reply = in.createErrorReply(
211 m_propertyNotifier->notify();
240 return d->m_connection.registerObject(
243 QDBusConnection::ExportAllSlots |
244 QDBusConnection::ExportScriptableSignals |
245 QDBusConnection::ExportAllProperties);
287 case Player::PlaybackStatus::playing:
288 return QStringLiteral(
"Playing");
289 case Player::PlaybackStatus::paused:
290 case Player::PlaybackStatus::ready:
291 return QStringLiteral(
"Paused");
293 return QStringLiteral(
"Stopped");
300 int value = QMetaEnum::fromType<LoopStatus>().
301 keyToValue(status.toUtf8().constData(), &ok);
303 MH_ERROR(
"Invalid loop status: %s", qUtf8Printable(status));
312 return QMetaEnum::fromType<LoopStatus>().valueToKey(value);
426 case lomiri::MediaHubService::Player::PlaybackStatus::ready:
427 case lomiri::MediaHubService::Player::PlaybackStatus::paused:
428 case lomiri::MediaHubService::Player::PlaybackStatus::stopped:
431 case lomiri::MediaHubService::Player::PlaybackStatus::playing: