KDEUI
kuiserverjobtracker.cpp
Go to the documentation of this file.
00001 /* This file is part of the KDE project 00002 Copyright (C) 2008 Rafael Fernández López <ereslibre@kde.org> 00003 Copyright (C) 2007 Kevin Ottens <ervin@kde.org> 00004 00005 This library is free software; you can redistribute it and/or 00006 modify it under the terms of the GNU Library General Public 00007 License version 2 as published by the Free Software Foundation. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00017 Boston, MA 02110-1301, USA. 00018 00019 */ 00020 00021 #include "kuiserverjobtracker.h" 00022 #include "kuiserverjobtracker_p.h" 00023 00024 #include "jobviewiface.h" 00025 #include "jobviewifacev2.h" 00026 00027 #include <klocale.h> 00028 #include <kdebug.h> 00029 #include <ktoolinvocation.h> 00030 #include <kcomponentdata.h> 00031 #include <kaboutdata.h> 00032 #include <kjob.h> 00033 00034 K_GLOBAL_STATIC(KSharedUiServerProxy, serverProxy) 00035 00036 class KUiServerJobTracker::Private 00037 { 00038 public: 00039 Private(KUiServerJobTracker *parent) 00040 : q(parent) 00041 { 00042 } 00043 00044 KUiServerJobTracker *const q; 00045 00046 void _k_killJob(); 00047 00048 QHash<KJob*, org::kde::JobViewV2*> progressJobView; 00049 }; 00050 00051 void KUiServerJobTracker::Private::_k_killJob() 00052 { 00053 org::kde::JobViewV2 *jobView = qobject_cast<org::kde::JobViewV2*>(q->sender()); 00054 00055 if (jobView) { 00056 KJob *job = progressJobView.key(jobView); 00057 00058 if (job) 00059 job->kill(KJob::EmitResult); 00060 } 00061 } 00062 00063 KUiServerJobTracker::KUiServerJobTracker(QObject *parent) 00064 : KJobTrackerInterface(parent), d(new Private(this)) 00065 { 00066 00067 } 00068 00069 KUiServerJobTracker::~KUiServerJobTracker() 00070 { 00071 if (!d->progressJobView.isEmpty()) { 00072 qWarning() << "A KUiServerJobTracker instance contains" 00073 << d->progressJobView.size() << "stalled jobs"; 00074 } 00075 00076 delete d; 00077 } 00078 00079 void KUiServerJobTracker::registerJob(KJob *job) 00080 { 00081 // Already registered job? 00082 if (d->progressJobView.contains(job)) { 00083 return; 00084 } 00085 00086 KComponentData componentData = KGlobal::mainComponent(); 00087 QString programIconName = componentData.aboutData()->programIconName(); 00088 00089 if (programIconName.isEmpty()) { 00090 programIconName = componentData.aboutData()->appName(); 00091 } 00092 00093 QWeakPointer<KJob> jobWatch = job; 00094 QDBusReply<QDBusObjectPath> reply = serverProxy->uiserver().requestView(componentData.aboutData()->programName(), 00095 programIconName, 00096 job->capabilities()); 00097 00098 // If we got a valid reply, register the interface for later usage. 00099 if (reply.isValid()) { 00100 org::kde::JobViewV2 *jobView = new org::kde::JobViewV2("org.kde.JobViewServer", 00101 reply.value().path(), 00102 QDBusConnection::sessionBus()); 00103 if (!jobWatch) { 00104 //kDebug() << "deleted out from under us when asking the server proxy for the view"; 00105 jobView->terminate(QString()); 00106 delete jobView; 00107 return; 00108 } 00109 00110 QObject::connect(jobView, SIGNAL(cancelRequested()), this, 00111 SLOT(_k_killJob())); 00112 QObject::connect(jobView, SIGNAL(suspendRequested()), job, 00113 SLOT(suspend())); 00114 QObject::connect(jobView, SIGNAL(resumeRequested()), job, 00115 SLOT(resume())); 00116 00117 QVariant destUrl = job->property("destUrl"); 00118 if (destUrl.isValid()) { 00119 jobView->setDestUrl(QDBusVariant(destUrl)); 00120 } 00121 00122 if (!jobWatch) { 00123 //kDebug() << "deleted out from under us when creating the dbus interface"; 00124 jobView->terminate(QString()); 00125 delete jobView; 00126 return; 00127 } 00128 00129 d->progressJobView.insert(job, jobView); 00130 } else if (!jobWatch) { 00131 qWarning() << "Uh-oh...KUiServerJobTracker was trying to forward a job, but it was deleted from under us." 00132 << "kuiserver *may* have a stranded job. we can't do anything about it because the returned objectPath is invalid."; 00133 return; 00134 } 00135 00136 KJobTrackerInterface::registerJob(job); 00137 } 00138 00139 void KUiServerJobTracker::unregisterJob(KJob *job) 00140 { 00141 KJobTrackerInterface::unregisterJob(job); 00142 00143 if (!d->progressJobView.contains(job)) { 00144 return; 00145 } 00146 00147 org::kde::JobViewV2 *jobView = d->progressJobView.take(job); 00148 00149 if (job->error()) { 00150 jobView->terminate(job->errorText()); 00151 } else { 00152 jobView->terminate(QString()); 00153 } 00154 00155 delete jobView; 00156 } 00157 00158 void KUiServerJobTracker::finished(KJob *job) 00159 { 00160 if (!d->progressJobView.contains(job)) { 00161 return; 00162 } 00163 00164 org::kde::JobViewV2 *jobView = d->progressJobView.take(job); 00165 00166 if (job->error()) { 00167 jobView->terminate(job->errorText()); 00168 } else { 00169 jobView->terminate(QString()); 00170 } 00171 } 00172 00173 void KUiServerJobTracker::suspended(KJob *job) 00174 { 00175 if (!d->progressJobView.contains(job)) { 00176 return; 00177 } 00178 00179 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00180 00181 jobView->setSuspended(true); 00182 } 00183 00184 void KUiServerJobTracker::resumed(KJob *job) 00185 { 00186 if (!d->progressJobView.contains(job)) { 00187 return; 00188 } 00189 00190 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00191 00192 jobView->setSuspended(false); 00193 } 00194 00195 void KUiServerJobTracker::description(KJob *job, const QString &title, 00196 const QPair<QString, QString> &field1, 00197 const QPair<QString, QString> &field2) 00198 { 00199 if (!d->progressJobView.contains(job)) { 00200 return; 00201 } 00202 00203 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00204 00205 jobView->setInfoMessage(title); 00206 00207 if (field1.first.isNull() || field1.second.isNull()) { 00208 jobView->clearDescriptionField(0); 00209 } else { 00210 jobView->setDescriptionField(0, field1.first, field1.second); 00211 } 00212 00213 if (field2.first.isNull() || field2.second.isNull()) { 00214 jobView->clearDescriptionField(1); 00215 } else { 00216 jobView->setDescriptionField(1, field2.first, field2.second); 00217 } 00218 } 00219 00220 void KUiServerJobTracker::infoMessage(KJob *job, const QString &plain, const QString &rich) 00221 { 00222 Q_UNUSED(rich) 00223 00224 if (!d->progressJobView.contains(job)) { 00225 return; 00226 } 00227 00228 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00229 00230 jobView->setInfoMessage(plain); 00231 } 00232 00233 void KUiServerJobTracker::totalAmount(KJob *job, KJob::Unit unit, qulonglong amount) 00234 { 00235 if (!d->progressJobView.contains(job)) { 00236 return; 00237 } 00238 00239 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00240 00241 switch (unit) { 00242 case KJob::Bytes: 00243 jobView->setTotalAmount(amount, "bytes"); 00244 break; 00245 case KJob::Files: 00246 jobView->setTotalAmount(amount, "files"); 00247 break; 00248 case KJob::Directories: 00249 jobView->setTotalAmount(amount, "dirs"); 00250 break; 00251 default: 00252 break; 00253 } 00254 } 00255 00256 void KUiServerJobTracker::processedAmount(KJob *job, KJob::Unit unit, qulonglong amount) 00257 { 00258 if (!d->progressJobView.contains(job)) { 00259 return; 00260 } 00261 00262 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00263 00264 switch (unit) { 00265 case KJob::Bytes: 00266 jobView->setProcessedAmount(amount, "bytes"); 00267 break; 00268 case KJob::Files: 00269 jobView->setProcessedAmount(amount, "files"); 00270 break; 00271 case KJob::Directories: 00272 jobView->setProcessedAmount(amount, "dirs"); 00273 break; 00274 default: 00275 break; 00276 } 00277 } 00278 00279 void KUiServerJobTracker::percent(KJob *job, unsigned long percent) 00280 { 00281 if (!d->progressJobView.contains(job)) { 00282 return; 00283 } 00284 00285 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00286 00287 jobView->setPercent(percent); 00288 } 00289 00290 void KUiServerJobTracker::speed(KJob *job, unsigned long value) 00291 { 00292 if (!d->progressJobView.contains(job)) { 00293 return; 00294 } 00295 00296 org::kde::JobViewV2 *jobView = d->progressJobView[job]; 00297 00298 jobView->setSpeed(value); 00299 } 00300 00301 KSharedUiServerProxy::KSharedUiServerProxy() 00302 : m_uiserver("org.kde.JobViewServer", "/JobViewServer", QDBusConnection::sessionBus()) 00303 { 00304 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.JobViewServer")) 00305 { 00306 QString error; 00307 int ret = KToolInvocation::startServiceByDesktopPath("kuiserver.desktop", 00308 QStringList(), &error); 00309 if (ret > 0) 00310 { 00311 kError() << "Couldn't start kuiserver from kuiserver.desktop: " << error; 00312 } 00313 } 00314 00315 if (!QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.JobViewServer")) 00316 kDebug() << "The dbus name org.kde.JobViewServer is STILL NOT REGISTERED, even after starting kuiserver. Should not happen."; 00317 else 00318 kDebug() << "kuiserver registered"; 00319 } 00320 00321 KSharedUiServerProxy::~KSharedUiServerProxy() 00322 { 00323 } 00324 00325 org::kde::JobViewServer &KSharedUiServerProxy::uiserver() 00326 { 00327 return m_uiserver; 00328 } 00329 00330 #include "kuiserverjobtracker.moc" 00331 #include "kuiserverjobtracker_p.moc"
KDE 4.6 API Reference