diff --git a/src/kuiserverjobtracker.h b/src/kuiserverjobtracker.h --- a/src/kuiserverjobtracker.h +++ b/src/kuiserverjobtracker.h @@ -81,7 +81,6 @@ class Private; Private *const d; - Q_PRIVATE_SLOT(d, void _k_killJob()) }; #endif diff --git a/src/kuiserverjobtracker.cpp b/src/kuiserverjobtracker.cpp --- a/src/kuiserverjobtracker.cpp +++ b/src/kuiserverjobtracker.cpp @@ -42,28 +42,13 @@ KUiServerJobTracker *const q; - void _k_killJob(); - static void updateDestUrl(KJob *job, org::kde::JobViewV2 *jobView); QHash progressJobView; QMetaObject::Connection serverRegisteredConnection; }; -void KUiServerJobTracker::Private::_k_killJob() -{ - org::kde::JobViewV2 *jobView = qobject_cast(q->sender()); - - if (jobView) { - KJob *job = progressJobView.key(jobView); - - if (job) { - job->kill(KJob::EmitResult); - } - } -} - void KUiServerJobTracker::Private::updateDestUrl(KJob *job, org::kde::JobViewV2 *jobView) { const QVariant destUrl = job->property("destUrl"); @@ -119,44 +104,42 @@ } QPointer jobWatch = job; - QDBusReply reply = serverProxy()->uiserver().requestView(appName, - programIconName, - job->capabilities()); - - // If we got a valid reply, register the interface for later usage. - if (reply.isValid()) { - org::kde::JobViewV2 *jobView = new org::kde::JobViewV2(QStringLiteral("org.kde.JobViewServer"), - reply.value().path(), - QDBusConnection::sessionBus()); - if (!jobWatch) { - //qCDebug(KJOBWIDGETS) << "deleted out from under us when asking the server proxy for the view"; - jobView->terminate(QString()); - delete jobView; + QDBusPendingReply reply = serverProxy()->uiserver().requestView(appName, + programIconName, + job->capabilities()); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, jobWatch](QDBusPendingCallWatcher *watcher) { + QDBusPendingReply reply = *watcher; + watcher->deleteLater(); + + if (reply.isError()) { return; } - QObject::connect(jobView, SIGNAL(cancelRequested()), - this, SLOT(_k_killJob())); - QObject::connect(jobView, &org::kde::JobViewV2::suspendRequested, - job, &KJob::suspend); - QObject::connect(jobView, &org::kde::JobViewV2::resumeRequested, - job, &KJob::resume); - - d->updateDestUrl(job, jobView); + org::kde::JobViewV2 *jobView = new org::kde::JobViewV2( + QStringLiteral("org.kde.JobViewServer"), + reply.value().path(), + QDBusConnection::sessionBus() + ); if (!jobWatch) { - //qCDebug(KJOBWIDGETS) << "deleted out from under us when creating the dbus interface"; + // if the reply took a while, terminate the job now to not leave one lingering around jobView->terminate(QString()); delete jobView; return; } + KJob *job = jobWatch.data(); + connect(jobView, &OrgKdeJobViewV2Interface::cancelRequested, job, [job]() { + job->kill(KJob::EmitResult); + }); + connect(jobView, &org::kde::JobViewV2::suspendRequested, job , &KJob::suspend); + connect(jobView, &org::kde::JobViewV2::resumeRequested, job, &KJob::resume); + + d->updateDestUrl(job, jobView); + d->progressJobView.insert(job, jobView); - } else if (!jobWatch) { - qWarning() << "Uh-oh...KUiServerJobTracker was trying to forward a job, but it was deleted from under us." - << "kuiserver *may* have a stranded job. we can't do anything about it because the returned objectPath is invalid."; - return; - } + }); KJobTrackerInterface::registerJob(job); }