1
/***************************************************************************
2
* Copyright (C) 2008 Rob Scheepmaker <r.scheepmaker@student.utwente.nl> *
4
* This program is free software; you can redistribute it and/or modify *
5
* it under the terms of the GNU General Public License as published by *
6
* the Free Software Foundation; either version 2 of the License, or *
7
* (at your option) any later version. *
9
* This program is distributed in the hope that it will be useful, *
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12
* GNU General Public License for more details. *
14
* You should have received a copy of the GNU General Public License *
15
* along with this program; if not, write to the *
16
* Free Software Foundation, Inc., *
17
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
18
***************************************************************************/
21
#include "dbusjobprotocol.h"
24
#include <KConfigGroup>
26
#include <Plasma/DataEngineManager>
27
#include <Plasma/Service>
28
#include <Plasma/ServiceJob>
30
static const char engineName[] = "applicationjobs";
32
DBusJobProtocol::DBusJobProtocol(Manager *parent)
40
DBusJobProtocol::~DBusJobProtocol()
43
Plasma::DataEngineManager::self()->unloadEngine(engineName);
46
foreach (DBusJob *job, m_jobs) {
55
void DBusJobProtocol::init()
57
m_engine = Plasma::DataEngineManager::self()->loadEngine(engineName);
59
if (!m_engine->isValid()) {
60
Plasma::DataEngineManager::self()->unloadEngine(engineName);
65
connect(m_engine, SIGNAL(sourceAdded(const QString&)),
66
this, SLOT(prepareJob(const QString&)));
67
connect(m_engine, SIGNAL(sourceRemoved(const QString&)),
68
this, SLOT(removeJob(const QString&)));
71
void DBusJobProtocol::prepareJob(const QString &source)
73
m_engine->connectSource(source, this);
76
void DBusJobProtocol::dataUpdated(const QString &source, const Plasma::DataEngine::Data &data)
78
DBusJob *job = m_jobs.value(source, 0);
81
job = new DBusJob(source, this);
82
m_jobs.insert(source, job);
83
connect(job, SIGNAL(jobDeleted(const QString&)),
84
this, SLOT(removeJob(const QString&)));
85
connect(job, SIGNAL(suspend(const QString&)),
86
this, SLOT(suspend(const QString&)));
87
connect(job, SIGNAL(resume(const QString&)),
88
this, SLOT(resume(const QString&)));
89
connect(job, SIGNAL(stop(const QString&)),
90
this, SLOT(stop(const QString&)));
91
connect(job, SIGNAL(ready(Job*)),
92
this, SIGNAL(jobCreated(Job*)));
95
job->setApplicationName(data.value("appName").toString());
96
job->setApplicationIconName(data.value("appIconName").toString());
97
job->setPercentage(data["percentage"].toUInt());
98
job->setError(data["error"].toString());
99
job->setMessage(data["infoMessage"].toString());
100
job->setSuspendable(data["suspendable"].toBool());
101
job->setKillable(data["killable"].toBool());
102
job->setSpeed(data["speed"].toString());
103
job->setNumericSpeed(data["numericSpeed"].toLongLong());
104
job->setEta(data["eta"].toULongLong());
106
if (data["state"].toString() == "running") {
107
job->setState(Job::Running);
108
} else if (data["state"].toString() == "suspended") {
109
job->setState(Job::Suspended);
111
job->setState(Job::Stopped);
115
QList<QPair<QString, QString> > labels;
116
while (data.contains(QString("label%1").arg(i))) {
117
QPair<QString, QString> label;
118
label.first = data[QString("labelName%1").arg(i)].toString();
119
label.second = data[QString("label%1").arg(i)].toString();
123
job->setLabels(labels);
126
QMap<QString, qlonglong> totalAmounts;
127
while (data.contains(QString("totalUnit%1").arg(i))) {
128
QString unit = data[QString("totalUnit%1").arg(i)].toString();
129
qlonglong amount = data[QString("totalAmount%1").arg(i)].toLongLong();
130
totalAmounts[unit] = amount;
133
job->setTotalAmounts(totalAmounts);
136
QMap<QString, qlonglong> processedAmounts;
137
while (data.contains(QString("processedUnit%1").arg(i))) {
138
QString unit = data[QString("processedUnit%1").arg(i)].toString();
139
qlonglong amount = data[QString("processedAmount%1").arg(i)].toLongLong();
140
processedAmounts[unit] = amount;
144
job->setProcessedAmounts(processedAmounts);
147
void DBusJobProtocol::removeJob(const QString &source)
149
if (m_jobs.contains(source)) {
150
DBusJob *job = m_jobs.take(source);
151
job->setState(Job::Stopped);
156
void DBusJobProtocol::suspend(const QString &source)
158
Plasma::Service *service = m_engine->serviceForSource(source);
159
KConfigGroup op = service->operationDescription("suspend");
160
KJob *job = service->startOperationCall(op);
161
connect(job, SIGNAL(finished(KJob*)), service, SLOT(deleteLater()));
164
void DBusJobProtocol::resume(const QString &source)
166
Plasma::Service *service = m_engine->serviceForSource(source);
167
KConfigGroup op = service->operationDescription("resume");
168
KJob *job = service->startOperationCall(op);
169
connect(job, SIGNAL(finished(KJob*)), service, SLOT(deleteLater()));
172
void DBusJobProtocol::stop(const QString &source)
174
Plasma::Service *service = m_engine->serviceForSource(source);
175
KConfigGroup op = service->operationDescription("stop");
176
KJob *job = service->startOperationCall(op);
177
connect(job, SIGNAL(finished(KJob*)), service, SLOT(deleteLater()));
180
#include "dbusjobprotocol.moc"