1
/***************************************************************************
2
* Copyright © 2013 Aleix Pol Gonzalez <aleixpol@blue-systems.com> *
4
* This program is free software; you can redistribute it and/or *
5
* modify it under the terms of the GNU General Public License as *
6
* published by the Free Software Foundation; either version 2 of *
7
* the License or (at your option) version 3 or any later version *
8
* accepted by the membership of KDE e.V. (or its successor approved *
9
* by the membership of KDE e.V.), which shall act as a proxy *
10
* defined in Section 14 of version 3 of the license. *
12
* This program is distributed in the hope that it will be useful, *
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15
* GNU General Public License for more details. *
17
* You should have received a copy of the GNU General Public License *
18
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
19
***************************************************************************/
21
#include "PKTransaction.h"
22
#include "PackageKitBackend.h"
23
#include "PackageKitResource.h"
24
#include <resources/AbstractResource.h>
25
#include <Transaction/TransactionModel.h>
26
#include <KMessageBox>
27
#include <KLocalizedString>
28
#include <PackageKit/packagekit-qt2/Transaction>
29
#include <PackageKit/packagekit-qt2/Daemon>
32
PKTransaction::PKTransaction(AbstractResource* app, Transaction::Role role)
33
: Transaction(app, app, role),
39
void PKTransaction::start()
42
m_trans->deleteLater();
44
m_trans = new PackageKit::Transaction(this);
45
connect(m_trans, SIGNAL(finished(PackageKit::Transaction::Exit,uint)), SLOT(cleanup(PackageKit::Transaction::Exit,uint)));
46
connect(m_trans, SIGNAL(errorCode(PackageKit::Transaction::Error,QString)), SLOT(errorFound(PackageKit::Transaction::Error,QString)));
47
connect(m_trans, SIGNAL(mediaChangeRequired(PackageKit::Transaction::MediaType,QString,QString)),
48
SLOT(mediaChange(PackageKit::Transaction::MediaType,QString,QString)));
49
connect(m_trans, SIGNAL(requireRestart(PackageKit::Transaction::Restart,QString)),
50
SLOT(requireRestard(PackageKit::Transaction::Restart,QString)));
51
connect(m_trans, SIGNAL(itemProgress(QString, PackageKit::Transaction::Status, uint)), SLOT(progressChanged(QString, PackageKit::Transaction::Status, uint)));
52
connect(m_trans, SIGNAL(eulaRequired(QString, QString, QString, QString)), SLOT(eulaRequired(QString, QString, QString, QString)));
53
connect(m_trans, SIGNAL(changed()), SLOT(transactionChanged()));
56
case Transaction::InstallRole:
57
if (qobject_cast<PackageKitResource*>(resource())->availablePackageId().isEmpty())
58
kWarning() << "Trying to install a package with empty packageId" << resource()->name();
59
m_trans->installPackage(qobject_cast<PackageKitResource*>(resource())->availablePackageId());
61
case Transaction::RemoveRole:
62
if (qobject_cast<PackageKitResource*>(resource())->installedPackageId().isEmpty())
63
kWarning() << "Trying to remove a package with empty packageId" << resource()->name();
64
m_trans->removePackage(qobject_cast<PackageKitResource*>(resource())->installedPackageId());
66
case Transaction::ChangeAddonsRole:
70
setCancellable(m_trans->allowCancel());
73
void PKTransaction::progressChanged(const QString &id, PackageKit::Transaction::Status status, uint percentage)
75
PackageKitResource * res = qobject_cast<PackageKitResource*>(resource());
76
if (id != res->availablePackageId() ||
77
id != res->installedPackageId())
79
kDebug() << "Progress" << percentage << "state" << status;
80
if (status == PackageKit::Transaction::StatusDownload)
81
setStatus(Transaction::DownloadingStatus);
83
setStatus(Transaction::CommittingStatus);
86
void PKTransaction::transactionChanged()
88
setCancellable(m_trans->allowCancel());
89
setProgress(m_trans->percentage());
92
void PKTransaction::cancel()
97
void PKTransaction::cleanup(PackageKit::Transaction::Exit exit, uint runtime)
100
kDebug() << "EXIT" << exit;
101
if (exit == PackageKit::Transaction::ExitEulaRequired)
103
if (exit == PackageKit::Transaction::ExitSuccess && m_trans->role() == PackageKit::Transaction::RoleAcceptEula) {
107
setStatus(Transaction::DoneStatus);
108
if (exit == PackageKit::Transaction::ExitCancelled) {
109
TransactionModel::global()->cancelTransaction(this);
112
qobject_cast<PackageKitBackend*>(resource()->backend())->removeTransaction(this);
114
PackageKit::Transaction* t = new PackageKit::Transaction(resource());
115
t->resolve(resource()->packageName(), PackageKit::Transaction::FilterArch | PackageKit::Transaction::FilterLast);
116
qobject_cast<PackageKitResource*>(resource())->resetPackageIds();
117
connect(t, SIGNAL(package(PackageKit::Transaction::Info,QString,QString)), resource(), SLOT(addPackageId(PackageKit::Transaction::Info, QString,QString)));
118
connect(t, SIGNAL(destroy()), t, SLOT(deleteLater()));
121
PackageKit::Transaction* PKTransaction::transaction()
126
void PKTransaction::eulaRequired(const QString& eulaID, const QString& packageID, const QString& vendor, const QString& licenseAgreement)
128
int ret = KMessageBox::questionYesNo(0, i18n("The package %1 and its vendor %2 require that you accept their license:\n %3",
129
PackageKit::Daemon::packageName(packageID), vendor, licenseAgreement),
130
i18n("%1 requires user to accept its license!", PackageKit::Daemon::packageName(packageID)));
131
if (ret == KMessageBox::Yes) {
132
kDebug() << "RESTART TRANSACTION reset thus";
133
m_trans->acceptEula(eulaID);
135
cleanup(PackageKit::Transaction::ExitCancelled, 0);
139
void PKTransaction::errorFound(PackageKit::Transaction::Error err, const QString& error)
141
kDebug() << "ERROR" << error;
142
if (err == PackageKit::Transaction::ErrorNoLicenseAgreement)
144
KMessageBox::error(0, error, PackageKitBackend::errorMessage(err));
147
void PKTransaction::mediaChange(PackageKit::Transaction::MediaType media, const QString& type, const QString& text)
150
KMessageBox::information(0, text, i18n("Media Change of type '%1' is requested.", type));
153
void PKTransaction::requireRestard(PackageKit::Transaction::Restart restart, const QString& p)
157
case PackageKit::Transaction::RestartApplication:
158
message = i18n("'%1' was changed and suggests to be restarted.", PackageKit::Daemon::packageName(p));
160
case PackageKit::Transaction::RestartSession:
161
message = i18n("A change by '%1' suggests your session to be restarted.", PackageKit::Daemon::packageName(p));
163
case PackageKit::Transaction::RestartSecuritySession:
164
message = i18n("'%1' was updated for security reasons, a restart of the session is recommended.", PackageKit::Daemon::packageName(p));
166
case PackageKit::Transaction::RestartSecuritySystem:
167
message = i18n("'%1' was updated for security reasons, a restart of the system is recommended.", PackageKit::Daemon::packageName(p));
169
case PackageKit::Transaction::RestartSystem:
170
case PackageKit::Transaction::RestartUnknown:
171
case PackageKit::Transaction::RestartNone:
173
message = i18n("A change by '%1' suggests your system to be rebooted.", PackageKit::Daemon::packageName(p));
176
KMessageBox::information(0, message);