~ubuntu-branches/ubuntu/vivid/muon/vivid-proposed

« back to all changes in this revision

Viewing changes to libmuon/backends/PackageKitBackend/PKTransaction.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2014-02-20 22:43:20 UTC
  • mfrom: (1.4.29)
  • mto: This revision was merged to the branch mainline in revision 71.
  • Revision ID: package-import@ubuntu.com-20140220224320-datq4ba1924izrc9
Tags: 2.1.70-0ubuntu1
* New upstream alpha release
* Build-dep on libbodega-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/***************************************************************************
 
2
 *   Copyright © 2013 Aleix Pol Gonzalez <aleixpol@blue-systems.com>       *
 
3
 *                                                                         *
 
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.                    *
 
11
 *                                                                         *
 
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.                          *
 
16
 *                                                                         *
 
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
 ***************************************************************************/
 
20
 
 
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>
 
30
#include <KDebug>
 
31
 
 
32
PKTransaction::PKTransaction(AbstractResource* app, Transaction::Role role)
 
33
    : Transaction(app, app, role),
 
34
      m_trans(0)
 
35
{
 
36
    start();
 
37
}
 
38
 
 
39
void PKTransaction::start()
 
40
{
 
41
    if (m_trans)
 
42
        m_trans->deleteLater();
 
43
    
 
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()));
 
54
    
 
55
    switch (role()) {
 
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());
 
60
            break;
 
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());
 
65
            break;
 
66
        case Transaction::ChangeAddonsRole:
 
67
            break;
 
68
    };
 
69
    
 
70
    setCancellable(m_trans->allowCancel());
 
71
}
 
72
 
 
73
void PKTransaction::progressChanged(const QString &id, PackageKit::Transaction::Status status, uint percentage)
 
74
{
 
75
    PackageKitResource * res = qobject_cast<PackageKitResource*>(resource());
 
76
    if (id != res->availablePackageId() ||
 
77
        id != res->installedPackageId())
 
78
        return;
 
79
    kDebug() << "Progress" << percentage << "state" << status;
 
80
    if (status == PackageKit::Transaction::StatusDownload)
 
81
        setStatus(Transaction::DownloadingStatus);
 
82
    else
 
83
        setStatus(Transaction::CommittingStatus);
 
84
}
 
85
 
 
86
void PKTransaction::transactionChanged()
 
87
{
 
88
    setCancellable(m_trans->allowCancel());
 
89
    setProgress(m_trans->percentage());
 
90
}
 
91
 
 
92
void PKTransaction::cancel()
 
93
{
 
94
    m_trans->cancel();
 
95
}
 
96
 
 
97
void PKTransaction::cleanup(PackageKit::Transaction::Exit exit, uint runtime)
 
98
{
 
99
    Q_UNUSED(runtime)
 
100
    kDebug() << "EXIT" << exit;
 
101
    if (exit == PackageKit::Transaction::ExitEulaRequired)
 
102
        return;
 
103
    if (exit == PackageKit::Transaction::ExitSuccess && m_trans->role() == PackageKit::Transaction::RoleAcceptEula) {
 
104
        start();
 
105
        return;
 
106
    }
 
107
    setStatus(Transaction::DoneStatus);
 
108
    if (exit == PackageKit::Transaction::ExitCancelled) {
 
109
        TransactionModel::global()->cancelTransaction(this);
 
110
        deleteLater();
 
111
    } else {
 
112
        qobject_cast<PackageKitBackend*>(resource()->backend())->removeTransaction(this);
 
113
    }
 
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()));
 
119
}
 
120
 
 
121
PackageKit::Transaction* PKTransaction::transaction()
 
122
{
 
123
    return m_trans;
 
124
}
 
125
 
 
126
void PKTransaction::eulaRequired(const QString& eulaID, const QString& packageID, const QString& vendor, const QString& licenseAgreement)
 
127
{
 
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);
 
134
    } else {
 
135
        cleanup(PackageKit::Transaction::ExitCancelled, 0);
 
136
    }
 
137
}
 
138
 
 
139
void PKTransaction::errorFound(PackageKit::Transaction::Error err, const QString& error)
 
140
{
 
141
    kDebug() << "ERROR" << error;
 
142
    if (err == PackageKit::Transaction::ErrorNoLicenseAgreement)
 
143
        return;
 
144
    KMessageBox::error(0, error, PackageKitBackend::errorMessage(err));
 
145
}
 
146
 
 
147
void PKTransaction::mediaChange(PackageKit::Transaction::MediaType media, const QString& type, const QString& text)
 
148
{
 
149
    Q_UNUSED(media)
 
150
    KMessageBox::information(0, text, i18n("Media Change of type '%1' is requested.", type));
 
151
}
 
152
 
 
153
void PKTransaction::requireRestard(PackageKit::Transaction::Restart restart, const QString& p)
 
154
{
 
155
    QString message;
 
156
    switch (restart) {
 
157
        case PackageKit::Transaction::RestartApplication:
 
158
            message = i18n("'%1' was changed and suggests to be restarted.", PackageKit::Daemon::packageName(p));
 
159
            break;
 
160
        case PackageKit::Transaction::RestartSession:
 
161
            message = i18n("A change by '%1' suggests your session to be restarted.", PackageKit::Daemon::packageName(p));
 
162
            break;
 
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));
 
165
            break;
 
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));
 
168
            break;
 
169
        case PackageKit::Transaction::RestartSystem:
 
170
        case PackageKit::Transaction::RestartUnknown:
 
171
        case PackageKit::Transaction::RestartNone:
 
172
        default:
 
173
            message = i18n("A change by '%1' suggests your system to be rebooted.", PackageKit::Daemon::packageName(p));
 
174
            break;
 
175
    };
 
176
    KMessageBox::information(0, message);
 
177
}