32 #include <QDBusConnection>
33 #include <QDBusMessage>
40 using namespace media;
43 namespace MediaHubService {
52 const media::apparmor::lomiri::RequestAuthenticator::Ptr& request_authenticator,
56 request_context_resolver(request_context_resolver),
57 request_authenticator(request_authenticator),
64 QDBusConnection m_connection;
65 media::apparmor::lomiri::RequestContextResolver::Ptr request_context_resolver;
66 media::apparmor::lomiri::RequestAuthenticator::Ptr request_authenticator;
74 const media::apparmor::lomiri::RequestContextResolver::Ptr& request_context_resolver,
75 const media::apparmor::lomiri::RequestAuthenticator::Ptr& request_authenticator,
80 request_context_resolver,
81 request_authenticator,
85 this, [
this](
const QVector<media::Track::Id> &
tracks,
87 QStringList trackList;
88 for (
const auto id:
tracks) {
96 this, [
this](
const QVector<QUrl> &
tracks) {
97 QStringList trackList;
98 for (
const auto uri:
tracks) {
99 trackList.append(uri.toString());
121 QStringList trackList;
122 const auto tracks = d->m_impl->tracks();
123 for (
const auto id:
tracks) {
124 trackList.append(
id);
132 return d->m_impl->canEditTracks();
144 return QMap<QString,QString>();
150 return d->m_impl->query_uri_for_track(track).toString();
159 QDBusMessage in = message();
160 QDBusConnection bus = connection();
161 in.setDelayedReply(
true);
167 } params = { uri, after, makeCurrent };
169 d->request_context_resolver->resolve_context_for_dbus_name_async
170 (in.service(), [
this, in, bus, params](
const media::apparmor::lomiri::Context& context)
172 Q_D(TrackListSkeleton);
173 QUrl uri = QUrl::fromUserInput(params.uri);
174 media::Track::Id after = params.after;
175 bool makeCurrent = params.makeCurrent;
178 const auto result = d->request_authenticator->authenticate_open_uri_request(context, uri);
180 UriCheck uri_check(uri);
181 const bool valid_uri = !uri_check.is_local_file() or
182 (uri_check.is_local_file() and uri_check.file_exists());
183 QDBusMessage reply = in.createReply();
186 const QString err_str = {
"Warning: Not adding track " + uri.toString() +
187 " to TrackList because it can't be found."};
188 MH_WARNING() << err_str;
189 reply = in.createErrorReply(
190 mpris::Player::Error::UriNotFound::name,
196 if (std::get<0>(result))
198 d->m_impl->add_track_with_uri_at(uri, after, makeCurrent);
202 const QString err_str = {
"Warning: Not adding track " + uri.toString() +
203 " to TrackList because of inadequate client apparmor permissions."};
205 reply = in.createErrorReply(
215 void TrackListSkeleton::AddTracks(
const QStringList &uris,
216 const QString &after)
220 QDBusMessage in = message();
221 QDBusConnection bus = connection();
222 in.setDelayedReply(
true);
227 } params = { uris, after };
229 d->request_context_resolver->resolve_context_for_dbus_name_async
230 (in.service(), [
this, in, bus, params](
const media::apparmor::lomiri::Context& context)
232 Q_D(TrackListSkeleton);
233 const QStringList &uris = params.uris;
234 const media::Track::Id after = params.after;
236 bool valid_uri = false;
237 media::apparmor::lomiri::RequestAuthenticator::Result result;
238 QString uri_err_str, err_str;
239 QVector<QUrl> trackUris;
241 for (const auto uri : uris)
243 UriCheck uri_check(uri);
244 valid_uri = !uri_check.is_local_file() or
245 (uri_check.is_local_file() and uri_check.file_exists());
248 uri_err_str = {
"Warning: Not adding track " + uri +
249 " to TrackList because it can't be found."};
250 MH_WARNING() << uri_err_str;
251 reply = in.createErrorReply(
252 mpris::Player::Error::UriNotFound::name,
257 result = d->request_authenticator->authenticate_open_uri_request(context, uri);
258 if (not std::get<0>(result))
260 err_str = {
"Warning: Not adding track " + uri +
261 " to TrackList because of inadequate client apparmor permissions."};
265 trackUris.append(QUrl::fromUserInput(uri));
269 if (std::get<0>(result))
271 reply = in.createReply();
272 d->m_impl->add_tracks_with_uri_at(trackUris, after);
277 reply = in.createErrorReply(
286 void TrackListSkeleton::MoveTrack(
const QString &
id,
const QString &to)
290 const bool ret = d->m_impl->move_track(
id, to);
293 const QString err_str = {
"Error: Not moving track " +
id +
294 " to destination " + to};
300 }
catch(media::TrackList::Errors::FailedToMoveTrack& e) {
304 }
catch(media::TrackList::Errors::FailedToFindMoveTrackSource& e) {
308 }
catch(media::TrackList::Errors::FailedToFindMoveTrackDest& e) {
315 void TrackListSkeleton::RemoveTrack(
const QString &
id)
319 d->m_impl->remove_track(
id);
320 }
catch(media::TrackList::Errors::TrackNotFound& e) {
327 void TrackListSkeleton::GoTo(
const QString &
id)
330 d->m_impl->go_to(
id);
333 void TrackListSkeleton::Reset()