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