2
* Copyright (C) 2014-2015 - Canonical Ltd.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License, as
6
* published by the Free Software Foundation; either version 2.1 or 3.0
9
* This program is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranties of
11
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
12
* PURPOSE. See the applicable version of the GNU Lesser General Public
13
* License for more details.
15
* You should have received a copy of both the GNU Lesser General Public
16
* License along with this program. If not, see <http://www.gnu.org/licenses/>
18
* Authored by: Diego Sarmentero <diego.sarmentero@canonical.com>
21
#include <QProcessEnvironment>
22
#include <ubuntu/download_manager/download_struct.h>
23
#include <ubuntu/download_manager/error.h>
25
#include "download_tracker.h"
29
const QString DOWNLOAD_COMMAND = "post-download-command";
30
const QString PACKAGE_NAME = "package-name";
31
const QString TITLE = "title";
32
const QString SHOW_IN_INDICATOR = "indicator-shown";
33
const QString PKCON_COMMAND = "pkcon";
34
const QString DOWNLOAD_MANAGER_SHA512 = "sha512";
37
namespace UpdatePlugin {
39
DownloadTracker::DownloadTracker(QObject *parent) :
41
m_clickToken(QString::null),
42
m_downloadUrl(QString::null),
49
void DownloadTracker::setDownload(const QString& url)
57
void DownloadTracker::setClickToken(const QString& token)
59
if (!token.isEmpty()) {
65
void DownloadTracker::setPackageName(const QString& package)
67
if (!package.isEmpty()) {
68
m_packageName = package;
73
void DownloadTracker::setTitle(const QString& title)
75
if (!title.isEmpty()) {
81
void DownloadTracker::startService()
83
if (!m_clickToken.isEmpty() && !m_downloadUrl.isEmpty() && !m_packageName.isEmpty() && !m_title.isEmpty()) {
84
if (m_manager == nullptr) {
85
m_manager = Manager::createSessionManager("", this);
87
if (!connect(m_manager, &Manager::downloadCreated,
88
this, &DownloadTracker::bindDownload)) {
89
qWarning() << "Could not connect to Manager::downloadCreated!";
94
QString command = getPkconCommand();
95
args << command << "-p" << "install-local" << "$file";
96
vmap[DOWNLOAD_COMMAND] = args;
97
vmap[PACKAGE_NAME] = m_packageName;
98
vmap[TITLE] = m_title;
99
vmap[SHOW_IN_INDICATOR] = m_show_in_indicator;
101
map[X_CLICK_TOKEN] = m_clickToken;
102
DownloadStruct dstruct(m_downloadUrl, m_download_sha512, DOWNLOAD_MANAGER_SHA512, vmap, map);
103
m_manager->createDownload(dstruct);
107
void DownloadTracker::bindDownload(Download* download)
109
m_download = download;
110
if (!connect(m_download, &Download::finished,
111
this, &DownloadTracker::onDownloadFinished)) {
112
qWarning() << "Could not connect to Download::finished";
114
if (!connect(m_download, &Download::canceled,
115
this, &DownloadTracker::onDownloadCanceled)) {
116
qWarning() << "Could not connect to Download::canceled";
118
if (!connect(m_download, &Download::paused,
119
this, &DownloadTracker::paused)) {
120
qWarning() << "Could not connect to Download::paused";
122
if (!connect(m_download, &Download::resumed,
123
this, &DownloadTracker::resumed)) {
124
qWarning() << "Could not connect to Download::resumed";
126
if (!connect(m_download, &Download::started,
127
this, &DownloadTracker::started)) {
128
qWarning() << "Could not connect to Download::started";
130
if (!connect(m_download, static_cast<void(Download::*)(Error*)>(&Download::error),
131
this, &DownloadTracker::registerError)) {
132
qWarning() << "Could not connect to Download::error";
135
if (!connect(m_download, static_cast<void(Download::*)(qulonglong, qulonglong)>(&Download::progress),
136
this, &DownloadTracker::setProgress)) {
137
qWarning() << "Could not connect to Download::progress";
140
if (!connect(m_download, &Download::processing,
141
this, &DownloadTracker::processing)) {
142
qWarning() << "Could not connect to Download::processing";
148
void DownloadTracker::registerError(Error* error)
150
Q_EMIT errorFound(error->errorString());
152
// we need to ensure that the resources are cleaned
153
m_download->deleteLater();
154
m_download = nullptr;
157
void DownloadTracker::onDownloadFinished(const QString& path)
159
// once a download is finished we need to clean the resources
160
m_download->deleteLater();
161
m_download = nullptr;
162
Q_EMIT finished(path);
165
void DownloadTracker::onDownloadCanceled(bool wasCanceled)
168
m_download->deleteLater();
169
m_download = nullptr;
171
Q_EMIT canceled(wasCanceled);
174
void DownloadTracker::pause()
176
if (m_download != nullptr) {
181
void DownloadTracker::resume()
183
if (m_download != nullptr) {
184
m_download->resume();
188
QString DownloadTracker::getPkconCommand()
190
QProcessEnvironment environment = QProcessEnvironment::systemEnvironment();
191
QString command = environment.value("PKCON_COMMAND", QString(PKCON_COMMAND));
195
void DownloadTracker::setProgress(qulonglong received, qulonglong total)
198
qulonglong result = (received * 100);
199
m_progress = static_cast<int>(result / total);
200
emit progressChanged();