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