KDEUI
kuiserverjobtracker.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "kuiserverjobtracker.h"
00022 #include "kuiserverjobtracker_p.h"
00023
00024 #include "jobviewiface.h"
00025
00026 #include <klocale.h>
00027 #include <kdebug.h>
00028 #include <ktoolinvocation.h>
00029 #include <kcomponentdata.h>
00030 #include <kaboutdata.h>
00031 #include <kjob.h>
00032
00033 K_GLOBAL_STATIC(KSharedUiServerProxy, serverProxy)
00034
00035 class KUiServerJobTracker::Private
00036 {
00037 public:
00038 Private(KUiServerJobTracker *parent)
00039 : q(parent)
00040 {
00041 }
00042
00043 KUiServerJobTracker *const q;
00044
00045 void _k_killJob();
00046
00047 QHash<KJob*, org::kde::JobView*> progressJobView;
00048 };
00049
00050 void KUiServerJobTracker::Private::_k_killJob()
00051 {
00052 org::kde::JobView *jobView = qobject_cast<org::kde::JobView*>(q->sender());
00053
00054 if (jobView) {
00055 KJob *job = progressJobView.key(jobView);
00056
00057 if (job)
00058 job->kill(KJob::EmitResult);
00059 }
00060 }
00061
00062 KUiServerJobTracker::KUiServerJobTracker(QObject *parent)
00063 : KJobTrackerInterface(parent), d(new Private(this))
00064 {
00065
00066 }
00067
00068 KUiServerJobTracker::~KUiServerJobTracker()
00069 {
00070 if (!d->progressJobView.isEmpty()) {
00071 qWarning() << "A KUiServerJobTracker instance contains"
00072 << d->progressJobView.size() << "stalled jobs";
00073 }
00074
00075 delete d;
00076 }
00077
00078 void KUiServerJobTracker::registerJob(KJob *job)
00079 {
00080
00081 if (d->progressJobView.contains(job)) {
00082 return;
00083 }
00084
00085 KComponentData componentData = KGlobal::mainComponent();
00086
00087 QString programIconName = componentData.aboutData()->programIconName();
00088
00089 if (programIconName.isEmpty()) {
00090 programIconName = componentData.aboutData()->appName();
00091 }
00092
00093 QDBusReply<QDBusObjectPath> reply = serverProxy->uiserver().requestView(componentData.aboutData()->programName(),
00094 programIconName,
00095 job->capabilities());
00096
00097
00098 if (reply.isValid()) {
00099 org::kde::JobView *jobView = new org::kde::JobView("org.kde.JobViewServer",
00100 reply.value().path(),
00101 QDBusConnection::sessionBus());
00102
00103 QObject::connect(jobView, SIGNAL(cancelRequested()), this,
00104 SLOT(_k_killJob()));
00105 QObject::connect(jobView, SIGNAL(suspendRequested()), job,
00106 SLOT(suspend()));
00107 QObject::connect(jobView, SIGNAL(resumeRequested()), job,
00108 SLOT(resume()));
00109
00110 d->progressJobView.insert(job, jobView);
00111 }
00112
00113 KJobTrackerInterface::registerJob(job);
00114 }
00115
00116 void KUiServerJobTracker::unregisterJob(KJob *job)
00117 {
00118 KJobTrackerInterface::unregisterJob(job);
00119
00120 if (!d->progressJobView.contains(job)) {
00121 return;
00122 }
00123
00124 org::kde::JobView *jobView = d->progressJobView.take(job);
00125
00126 if (job->error()) {
00127 jobView->terminate(job->errorText());
00128 } else {
00129 jobView->terminate(QString());
00130 }
00131
00132 delete jobView;
00133 }
00134
00135 void KUiServerJobTracker::finished(KJob *job)
00136 {
00137 if (!d->progressJobView.contains(job)) {
00138 return;
00139 }
00140
00141 org::kde::JobView *jobView = d->progressJobView.take(job);
00142
00143 if (job->error()) {
00144 jobView->terminate(job->errorText());
00145 } else {
00146 jobView->terminate(QString());
00147 }
00148 }
00149
00150 void KUiServerJobTracker::suspended(KJob *job)
00151 {
00152 if (!d->progressJobView.contains(job)) {
00153 return;
00154 }
00155
00156 org::kde::JobView *jobView = d->progressJobView[job];
00157
00158 jobView->setSuspended(true);
00159 }
00160
00161 void KUiServerJobTracker::resumed(KJob *job)
00162 {
00163 if (!d->progressJobView.contains(job)) {
00164 return;
00165 }
00166
00167 org::kde::JobView *jobView = d->progressJobView[job];
00168
00169 jobView->setSuspended(false);
00170 }
00171
00172 void KUiServerJobTracker::description(KJob *job, const QString &title,
00173 const QPair<QString, QString> &field1,
00174 const QPair<QString, QString> &field2)
00175 {
00176 if (!d->progressJobView.contains(job)) {
00177 return;
00178 }
00179
00180 org::kde::JobView *jobView = d->progressJobView[job];
00181
00182 jobView->setInfoMessage(title);
00183
00184 if (field1.first.isNull() || field1.second.isNull()) {
00185 jobView->clearDescriptionField(0);
00186 } else {
00187 jobView->setDescriptionField(0, field1.first, field1.second);
00188 }
00189
00190 if (field2.first.isNull() || field2.second.isNull()) {
00191 jobView->clearDescriptionField(1);
00192 } else {
00193 jobView->setDescriptionField(1, field2.first, field2.second);
00194 }
00195 }
00196
00197 void KUiServerJobTracker::infoMessage(KJob *job, const QString &plain, const QString &rich)
00198 {
00199 Q_UNUSED(rich)
00200
00201 if (!d->progressJobView.contains(job)) {
00202 return;
00203 }
00204
00205 org::kde::JobView *jobView = d->progressJobView[job];
00206
00207 jobView->setInfoMessage(plain);
00208 }
00209
00210 void KUiServerJobTracker::totalAmount(KJob *job, KJob::Unit unit, qulonglong amount)
00211 {
00212 if (!d->progressJobView.contains(job)) {
00213 return;
00214 }
00215
00216 org::kde::JobView *jobView = d->progressJobView[job];
00217
00218 switch (unit) {
00219 case KJob::Bytes:
00220 jobView->setTotalAmount(amount, "bytes");
00221 break;
00222 case KJob::Files:
00223 jobView->setTotalAmount(amount, "files");
00224 break;
00225 case KJob::Directories:
00226 jobView->setTotalAmount(amount, "dirs");
00227 break;
00228 default:
00229 break;
00230 }
00231 }
00232
00233 void KUiServerJobTracker::processedAmount(KJob *job, KJob::Unit unit, qulonglong amount)
00234 {
00235 if (!d->progressJobView.contains(job)) {
00236 return;
00237 }
00238
00239 org::kde::JobView *jobView = d->progressJobView[job];
00240
00241 switch (unit) {
00242 case KJob::Bytes:
00243 jobView->setProcessedAmount(amount, "bytes");
00244 break;
00245 case KJob::Files:
00246 jobView->setProcessedAmount(amount, "files");
00247 break;
00248 case KJob::Directories:
00249 jobView->setProcessedAmount(amount, "dirs");
00250 break;
00251 default:
00252 break;
00253 }
00254 }
00255
00256 void KUiServerJobTracker::percent(KJob *job, unsigned long percent)
00257 {
00258 if (!d->progressJobView.contains(job)) {
00259 return;
00260 }
00261
00262 org::kde::JobView *jobView = d->progressJobView[job];
00263
00264 jobView->setPercent(percent);
00265 }
00266
00267 void KUiServerJobTracker::speed(KJob *job, unsigned long value)
00268 {
00269 if (!d->progressJobView.contains(job)) {
00270 return;
00271 }
00272
00273 org::kde::JobView *jobView = d->progressJobView[job];
00274
00275 jobView->setSpeed(value);
00276 }
00277
00278 KSharedUiServerProxy::KSharedUiServerProxy()
00279 : m_uiserver("org.kde.JobViewServer", "/JobViewServer", QDBusConnection::sessionBus())
00280 {
00281 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.JobViewServer"))
00282 {
00283 QString error;
00284 int ret = KToolInvocation::startServiceByDesktopPath("kuiserver.desktop",
00285 QStringList(), &error);
00286 if (ret > 0)
00287 {
00288 kError() << "Couldn't start kuiserver from kuiserver.desktop: " << error << endl;
00289 }
00290 }
00291
00292 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.JobViewServer"))
00293 kDebug() << "The application kuiserver is STILL NOT REGISTERED";
00294 else
00295 kDebug() << "kuiserver registered";
00296 }
00297
00298 KSharedUiServerProxy::~KSharedUiServerProxy()
00299 {
00300 }
00301
00302 org::kde::JobViewServer &KSharedUiServerProxy::uiserver()
00303 {
00304 return m_uiserver;
00305 }
00306
00307 #include "kuiserverjobtracker.moc"
00308 #include "kuiserverjobtracker_p.moc"