~jonas-drange/ubuntu-system-settings/drop-ld-preload

« back to all changes in this revision

Viewing changes to plugins/system-update/DownloadHandler.qml

  • Committer: Bileto Bot
  • Author(s): Ken VanDine
  • Date: 2017-03-17 14:41:33 UTC
  • mfrom: (1764.2.19 no_updates)
  • Revision ID: ci-train-bot@canonical.com-20170317144133-rv0zqeiuhsyhk9nh
Drop everything that needs system-image or click

Approved by: system-apps-ci-bot

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * This file is part of system-settings
3
 
 *
4
 
 * Copyright (C) 2016 Canonical Ltd.
5
 
 *
6
 
 * This program is free software: you can redistribute it and/or modify it
7
 
 * under the terms of the GNU General Public License version 3, as published
8
 
 * by the Free Software Foundation.
9
 
 *
10
 
 * This program is distributed in the hope that it will be useful, but
11
 
 * WITHOUT ANY WARRANTY; without even the implied warranties of
12
 
 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
13
 
 * PURPOSE.  See the GNU General Public License for more details.
14
 
 *
15
 
 * You should have received a copy of the GNU General Public License along
16
 
 * with this program.  If not, see <http://www.gnu.org/licenses/>.
17
 
 *
18
 
 */
19
 
import QtQuick 2.4
20
 
import Ubuntu.DownloadManager 1.2
21
 
 
22
 
Item {
23
 
    id: root
24
 
    property var updateModel
25
 
    property alias downloads: downloadManager.downloads
26
 
    property var udm: DownloadManager {
27
 
        id: downloadManager
28
 
        onDownloadFinished: {
29
 
            updateModel.setInstalled(download.metadata.custom.identifier,
30
 
                                     download.metadata.custom.revision);
31
 
        }
32
 
        onDownloadPaused: {
33
 
            updateModel.pauseUpdate(download.metadata.custom.identifier,
34
 
                                    download.metadata.custom.revision)
35
 
        }
36
 
        onDownloadResumed: {
37
 
            updateModel.resumeUpdate(download.metadata.custom.identifier,
38
 
                                     download.metadata.custom.revision)
39
 
        }
40
 
        onDownloadCanceled: {
41
 
            updateModel.cancelUpdate(download.metadata.custom.identifier,
42
 
                                     download.metadata.custom.revision)
43
 
        }
44
 
        onErrorFound: {
45
 
            updateModel.setError(download.metadata.custom.identifier,
46
 
                                 download.metadata.custom.revision,
47
 
                                 download.errorMessage)
48
 
        }
49
 
        onDownloadsChanged: restoreDownloads()
50
 
        Component.onCompleted: restoreDownloads()
51
 
    }
52
 
 
53
 
    function downloadAll() {
54
 
 
55
 
    }
56
 
 
57
 
    function restoreDownloads() {
58
 
        var dl;
59
 
        for (var i = 0; i<downloads.length; i++) {
60
 
            dl = downloads[i];
61
 
            if (!dl._bound) {
62
 
                /* We only bind those signals here, that the UDM does not
63
 
                receive, i.e. processing and progressChanged. */
64
 
                dl.progressChanged.connect(onDownloadProgress.bind(dl));
65
 
                dl.processing.connect(onDownloadProcessing.bind(dl));
66
 
                dl._bound = true;
67
 
            }
68
 
        }
69
 
    }
70
 
 
71
 
    function resumeDownload(click) {
72
 
        var download = getDownloadFor(click);
73
 
        if (download && !download.downloading && !download.isCompleted) {
74
 
            download.resume();
75
 
        }
76
 
    }
77
 
 
78
 
    function pauseDownload(click) {
79
 
        var download = getDownloadFor(click);
80
 
        if (download && download.downloading) {
81
 
            download.pause();
82
 
        }
83
 
    }
84
 
 
85
 
    // Return download for a click update.
86
 
    function getDownloadFor(click) {
87
 
        var cust;
88
 
        var dl;
89
 
 
90
 
        for (var i = 0; i<downloads.length; i++) {
91
 
            dl = downloads[i];
92
 
            if (dl.errorMessage || dl.isCompleted) {
93
 
                // Ignore failed and completed downloads.
94
 
                continue;
95
 
            }
96
 
 
97
 
            cust = downloads[i].metadata.custom;
98
 
            if (cust.identifier === click.identifier && cust.revision === click.revision) {
99
 
                return downloads[i];
100
 
            }
101
 
        }
102
 
        return null;
103
 
    }
104
 
 
105
 
    function hasExistingDownload(click) {
106
 
        var existingDownload = getDownloadFor(click);
107
 
        return (existingDownload !== null &&
108
 
            !existingDownload.errorMessage &&
109
 
            !existingDownload.isCompleted);
110
 
    }
111
 
 
112
 
    function retryDownload(click) {
113
 
        return createDownload(click, true);
114
 
    }
115
 
 
116
 
    function createDownload(click, useSignedUrl) {
117
 
        if (hasExistingDownload(click)) {
118
 
            return null;
119
 
        }
120
 
        var downloadUrl = click.downloadUrl;
121
 
        var metadata = {
122
 
            "command": click.command,
123
 
            "title": click.title,
124
 
            "showInIndicator": false
125
 
        };
126
 
        var metadataObj = mdt.createObject(root, metadata);
127
 
        metadataObj.custom = {
128
 
            "identifier": click.identifier,
129
 
            "package-name": click.identifier,
130
 
            "revision": click.revision,
131
 
        };
132
 
 
133
 
        var hdrs = {}
134
 
        if (useSignedUrl) {
135
 
            if (!click.signedDownloadUrl) {
136
 
                console.warn('The signed download URL was empty.');
137
 
            }
138
 
            downloadUrl = click.signedDownloadUrl;
139
 
        } else {
140
 
            // If we're using an unsigned URL, we need to provide this header.
141
 
            hdrs["X-Click-Token"] = click.token;
142
 
        }
143
 
 
144
 
        var singleDownloadObj = sdl.createObject(root, {
145
 
            "autoStart": true,
146
 
            "hash": click.downloadHash,
147
 
            "algorithm": "sha512",
148
 
            "headers": hdrs,
149
 
            "metadata": metadataObj,
150
 
            "revision": click.revision,
151
 
            "identifier": click.identifier
152
 
        });
153
 
        singleDownloadObj.download(downloadUrl);
154
 
        return singleDownloadObj;
155
 
    }
156
 
 
157
 
    function onDownloadProgress(progress) {
158
 
        updateModel.setProgress(this.metadata.custom.identifier,
159
 
                                this.metadata.custom.revision,
160
 
                                this.progress);
161
 
    }
162
 
 
163
 
    function onDownloadProcessing() {
164
 
        updateModel.processUpdate(this.metadata.custom.identifier,
165
 
                                  this.metadata.custom.revision);
166
 
    }
167
 
 
168
 
    /* If a update's model has a downloadId, check if UDM knows it. If not,
169
 
    treat this as a failure. Workaround for lp:1603770. */
170
 
    function assertDownloadExist(click) {
171
 
        if (!getDownloadFor(click)) {
172
 
            updateModel.setError(
173
 
                click.identifier, click.revision,
174
 
                i18n.tr("Installation failed")
175
 
            );
176
 
        }
177
 
    }
178
 
 
179
 
    Component {
180
 
        id: sdl
181
 
        SingleDownload {
182
 
            id: download
183
 
            objectName: "singleDownload"
184
 
            property bool _bound: true
185
 
 
186
 
            onDownloadIdChanged: {
187
 
                updateModel.queueUpdate(metadata.custom.identifier,
188
 
                                        metadata.custom.revision,
189
 
                                        downloadId);
190
 
            }
191
 
            onStarted: {
192
 
                updateModel.startUpdate(metadata.custom.identifier,
193
 
                                        metadata.custom.revision);
194
 
            }
195
 
            onProgressChanged: onDownloadProgress.call(download)
196
 
            onProcessing: onDownloadProcessing.call(download)
197
 
        }
198
 
    }
199
 
 
200
 
    Component {
201
 
        id: mdt
202
 
        Metadata {}
203
 
    }
204
 
}