annotate demos/browser/downloadmanager.d @ 73:7bfd46c330dc

more porting
author mandel
date Fri, 22 May 2009 10:59:00 +0000
parents fd6eb3a1759d
children 37caa90ce503
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1 /****************************************************************************
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
2 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
5 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
6 ** This file is part of the demonstration applications of the Qt Toolkit.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
7 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
9 ** Commercial Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
13 ** a written agreement between you and Nokia.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
14 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
15 ** GNU Lesser General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
19 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
22 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
26 ** package.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
27 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
28 ** GNU General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
32 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
35 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
38 ** $QT_END_LICENSE$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
39 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
40 ****************************************************************************/
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
41
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
42 module downloadmanager;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
43
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
44
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
45 import qt.core.QFile;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
46 import qt.core.QTime;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
47 import qt.core.QMetaEnum;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
48 import qt.core.QSettings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
49 import qt.core.QDebug;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
50
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
51 import qt.gui.QDesktopServices;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
52 import qt.gui.QFileDialog;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
53 import qt.gui.QHeaderView;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
54 import qt.gui.QFileIconProvider;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
55
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
56 import qt.network.QNetworkReply;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
57 import qt.webkit.QWebSettings;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
58
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
59 import math;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
60 import autosaver;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
61 import browserapplication;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
62 import networkaccessmanager;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
63 import ui_downloads;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
64 import ui_downloaditem;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
65
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
66
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
67 class DownloadItem : public QWidget, public Ui_DownloadItem
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
68 {
46
fd6eb3a1759d license
eldar
parents: 45
diff changeset
69 mixin Signal!("statusChanged");
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
70
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
71 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
73 /*!
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
74 DownloadItem is a widget that is displayed in the download manager list.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
75 It moves the data from the QNetworkReply into the QFile as well
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
76 as update the information/progressbar and report errors.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
77 */
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
78 this(QNetworkReply reply = null, bool requestFileName = false, QWidget parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
79 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
80 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
81 m_reply = reply;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
82 m_requestFileName = requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
83 m_bytesReceived = 0;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
84
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
85 setupUi(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
86 QPalette p = downloadInfoLabel.palette();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
87 p.setColor(QPalette.Text, Qt.darkGray);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
88 downloadInfoLabel.setPalette(p);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
89 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
90 tryAgainButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
91 stopButton.clicked.connect(&this.stop);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
92 openButton.clicked.connect(&this.open);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
93 tryAgainButton.clicked.connect(&this.tryAgain);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
94
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
95 init();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
96 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
97
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
98 bool downloading()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
99 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
100 return (progressBar.isVisible());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
101 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
102
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
103 bool downloadedSuccessfully()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
104 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
105 return (stopButton.isHidden() && tryAgainButton.isHidden());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
106 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
107
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
108 QUrl m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
109 QFile m_output;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
110 QNetworkReply m_reply;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
111
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
112 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
113
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
114 void stop()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
115 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
116 setUpdatesEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
117 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
118 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
119 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
120 tryAgainButton.show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
121 setUpdatesEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
122 m_reply.abort();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
123 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
124
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
125 void tryAgain()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
126 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
127 if (!tryAgainButton.isEnabled())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
128 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
129
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
130 tryAgainButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
131 tryAgainButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
132 stopButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
133 stopButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
134 progressBar.setVisible(true);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
135
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
136 QNetworkReply r = BrowserApplication.networkAccessManager().get(QNetworkRequest(m_url));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
137 if (m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
138 m_reply.deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
139 if (m_output.exists())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
140 m_output.remove();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
141 m_reply = r;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
142 init();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
143 emit statusChanged();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
144 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
145
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
146 void open()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
147 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
148 QFileInfo info(m_output);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
149 QUrl url = QUrl.fromLocalFile(info.absolutePath());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
150 QDesktopServices.openUrl(url);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
151 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
152
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
153 void downloadReadyRead()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
154 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
155 if (m_requestFileName && m_output.fileName().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
156 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
157 if (!m_output.isOpen()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
158 // in case someone else has already put a file there
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
159 if (!m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
160 getFileName();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
161 if (!m_output.open(QIODevice.WriteOnly)) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
162 downloadInfoLabel.setText(tr("Error opening save file: %1")
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
163 .arg(m_output.errorString()));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
164 stopButton.click();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
165 emit statusChanged();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
166 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
167 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
168 emit statusChanged();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
169 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
170 if (-1 == m_output.write(m_reply.readAll())) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
171 downloadInfoLabel.setText(tr("Error saving: %1")
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
172 .arg(m_output.errorString()));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
173 stopButton.click();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
174 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
175 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
176
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
177 void error(QNetworkReply.NetworkError code)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
178 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
179 qDebug() << "DownloadItem::error" << m_reply.errorString() << m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
180 downloadInfoLabel.setText(tr("Network Error: %1").arg(m_reply.errorString()));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
181 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
182 tryAgainButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
183 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
184
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
185 void downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
186 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
187 m_bytesReceived = bytesReceived;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
188 if (bytesTotal == -1) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
189 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
190 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
191 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
192 progressBar.setValue(bytesReceived);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
193 progressBar.setMaximum(bytesTotal);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
194 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
195 updateInfoLabel();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
196 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
197
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
198 void metaDataChanged()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
199 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
200 qDebug() << "DownloadItem::metaDataChanged: not handled.";
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
201 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
202
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
203 void finished()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
204 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
205 progressBar.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
206 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
207 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
208 m_output.close();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
209 updateInfoLabel();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
210 emit statusChanged();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
211 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
212
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
213 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
214
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
215 void getFileName()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
216 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
217 QSettings settings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
218 settings.beginGroup(QLatin1String("downloadmanager"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
219 QString defaultLocation = QDesktopServices.storageLocation(QDesktopServices.DesktopLocation);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
220 QString downloadDirectory = settings.value(QLatin1String("downloadDirectory"), defaultLocation).toString();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
221 if (!downloadDirectory.isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
222 downloadDirectory += QLatin1Char('/');
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
223
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
224 QString defaultFileName = saveFileName(downloadDirectory);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
225 QString fileName = defaultFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
226 if (m_requestFileName) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
227 fileName = QFileDialog.getSaveFileName(this, tr("Save File"), defaultFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
228 if (fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
229 m_reply.close();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
230 fileNameLabel.setText(tr("Download canceled: %1").arg(QFileInfo(defaultFileName).fileName()));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
231 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
232 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
233 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
234 m_output.setFileName(fileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
235 fileNameLabel.setText(QFileInfo(m_output.fileName()).fileName());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
236 if (m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
237 downloadReadyRead();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
238 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
239
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
240 void init()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
241 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
242 if (!m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
243 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
244
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
245 // attach to the m_reply
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
246 m_url = m_reply.url();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
247 m_reply.setParent(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
248 m_reply.readyRead.connect(&this.downloadReadyRead);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
249 m_reply.error.connect(&this.error);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
250 m_reply.downloadProgress.connect(&this.downloadProgress);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
251 m_reply.metaDataChanged.connect(&this.metaDataChanged);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
252 m_reply.finished.connect(&this.finished);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
253
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
254 // reset info
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
255 downloadInfoLabel.clear();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
256 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
257 getFileName();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
258
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
259 // start timer for the download estimation
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
260 m_downloadTime.start();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
261
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
262 if (m_reply.error() != QNetworkReply.NoError) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
263 error(m_reply.error());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
264 finished();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
265 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
266 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
267
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
268 void updateInfoLabel()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
269 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
270 if (m_reply.error() == QNetworkReply.NoError)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
271 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
272
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
273 qint64 bytesTotal = progressBar.maximum();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
274 bool running = !downloadedSuccessfully();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
275
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
276 // update info label
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
277 double speed = m_bytesReceived * 1000.0 / m_downloadTime.elapsed();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
278 double timeRemaining = ((double)(bytesTotal - m_bytesReceived)) / speed;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
279 QString timeRemainingString = tr("seconds");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
280 if (timeRemaining > 60) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
281 timeRemaining = timeRemaining / 60;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
282 timeRemainingString = tr("minutes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
283 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
284 timeRemaining = floor(timeRemaining);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
285
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
286 // When downloading the eta should never be 0
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
287 if (timeRemaining == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
288 timeRemaining = 1;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
289
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
290 QString info;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
291 if (running) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
292 QString remaining;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
293 if (bytesTotal != 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
294 remaining = tr("- %4 %5 remaining")
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
295 .arg(timeRemaining)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
296 .arg(timeRemainingString);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
297
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
298 info = QString(tr("%1 of %2 (%3/sec) %4"))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
299 .arg(dataString(m_bytesReceived))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
300 .arg(bytesTotal == 0 ? tr("?") : dataString(bytesTotal))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
301 .arg(dataString((int)speed))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
302 .arg(remaining);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
303 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
304 if (m_bytesReceived == bytesTotal)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
305 info = dataString(m_output.size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
306 else
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
307 info = tr("%1 of %2 - Stopped")
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
308 .arg(dataString(m_bytesReceived))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
309 .arg(dataString(bytesTotal));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
310 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
311 downloadInfoLabel.setText(info);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
312 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
313
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
314 QString dataString(int size)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
315 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
316 QString unit;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
317 if (size < 1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
318 unit = tr("bytes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
319 } else if (size < 1024*1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
320 size /= 1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
321 unit = tr("kB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
322 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
323 size /= 1024*1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
324 unit = tr("MB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
325 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
326 return QString(QLatin1String("%1 %2")).arg(size).arg(unit);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
327 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
328
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
329 QString saveFileName(QString &directory);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
330 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
331 // Move this function into QNetworkReply to also get file name sent from the server
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
332 QString path = m_url.path();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
333 QFileInfo info(path);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
334 QString baseName = info.completeBaseName();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
335 QString endName = info.suffix();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
336
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
337 if (baseName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
338 baseName = QLatin1String("unnamed_download");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
339 qDebug() << "DownloadManager:: downloading unknown file:" << m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
340 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
341 QString name = directory + baseName + QLatin1Char('.') + endName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
342 if (QFile.exists(name)) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
343 // already exists, don't overwrite
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
344 int i = 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
345 do {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
346 name = directory + baseName + QLatin1Char('-') + QString.number(i++) + QLatin1Char('.') + endName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
347 } while (QFile.exists(name));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
348 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
349 return name;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
350 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
351
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
352 bool m_requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
353 qint64 m_bytesReceived;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
354 QTime m_downloadTime;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
355 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
356
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
357
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
358 class DownloadManager : public QDialog, public Ui_DownloadDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
359 {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
360
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
361 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
362
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
363 enum RemovePolicy {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
364 Never,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
365 Exit,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
366 SuccessFullDownload
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
367 };
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
368
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
369 /*!
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
370 DownloadManager is a Dialog that contains a list of DownloadItems
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
371
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
372 It is a basic download manager. It only downloads the file, doesn't do BitTorrent,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
373 extract zipped files or anything fancy.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
374 */
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
375 this(QWidget parent = null) : QDialog(parent)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
376 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
377 m_autoSaver = new AutoSaver(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
378 m_manager = BrowserApplication.networkAccessManager();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
379 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
380 m_removePolicy = RemovePolicy.Never;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
381
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
382 setupUi(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
383 downloadsView.setShowGrid(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
384 downloadsView.verticalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
385 downloadsView.horizontalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
386 downloadsView.setAlternatingRowColors(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
387 downloadsView.horizontalHeader().setStretchLastSection(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
388 m_model = new DownloadModel(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
389 downloadsView.setModel(m_model);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
390 connect(cleanupButton, SIGNAL(clicked()), this, SLOT(cleanup()));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
391 load();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
392 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
393
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
394 ~this()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
395 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
396 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
397 m_autoSaver.saveIfNeccessary();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
398 if (m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
399 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
400 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
401
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
402 int activeDownloads()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
403 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
404 int count = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
405 for (int i = 0; i < m_downloads.count(); ++i) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
406 if (m_downloads.at(i).stopButton.isEnabled())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
407 ++count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
408 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
409 return count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
410 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
411
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
412 RemovePolicy removePolicy()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
413 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
414 return m_removePolicy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
415 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
416
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
417 void setRemovePolicy(RemovePolicy policy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
418 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
419 if (policy == m_removePolicy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
420 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
421 m_removePolicy = policy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
422 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
423 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
424
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
425 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
426
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
427 void download(QNetworkRequest request, bool requestFileName = false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
428 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
429 if (request.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
430 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
431 handleUnsupportedContent(m_manager.get(request), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
432 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
433
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
434
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
435 void download(QUrl url, bool requestFileName = false)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
436 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
437 download(QNetworkRequest(url), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
438 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
439
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
440 void handleUnsupportedContent(QNetworkReply reply, bool requestFileName = false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
441 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
442 if (!reply || reply.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
443 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
444 QVariant header = reply.header(QNetworkRequest.ContentLengthHeader);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
445 bool ok;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
446 int size = header.toInt(&ok);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
447 if (ok && size == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
448 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
449
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
450 qDebug() << "DownloadManager::handleUnsupportedContent" << reply.url() << "requestFileName" << requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
451 DownloadItem item = new DownloadItem(reply, requestFileName, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
452 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
453 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
454
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
455 void cleanup()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
456 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
457 if (m_downloads.isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
458 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
459 m_model.removeRows(0, m_downloads.count());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
460 updateItemCount();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
461 if (m_downloads.isEmpty() && m_iconProvider) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
462 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
463 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
464 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
465 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
466 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
467
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
468 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
469
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
470 void save()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
471 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
472 QSettings settings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
473 settings.beginGroup(QLatin1String("downloadmanager"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
474 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
475 settings.setValue(QLatin1String("removeDownloadsPolicy"), QLatin1String(removePolicyEnum.valueToKey(m_removePolicy)));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
476 settings.setValue(QLatin1String("size"), size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
477 if (m_removePolicy == Exit)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
478 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
479
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
480 for (int i = 0; i < m_downloads.count(); ++i) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
481 QString key = QString(QLatin1String("download_%1_")).arg(i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
482 settings.setValue(key + QLatin1String("url"), m_downloads[i].m_url);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
483 settings.setValue(key + QLatin1String("location"), QFileInfo(m_downloads[i].m_output).filePath());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
484 settings.setValue(key + QLatin1String("done"), m_downloads[i].downloadedSuccessfully());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
485 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
486 int i = m_downloads.count();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
487 QString key = QString(QLatin1String("download_%1_")).arg(i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
488 while (settings.contains(key + QLatin1String("url"))) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
489 settings.remove(key + QLatin1String("url"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
490 settings.remove(key + QLatin1String("location"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
491 settings.remove(key + QLatin1String("done"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
492 key = QString(QLatin1String("download_%1_")).arg(++i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
493 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
494 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
495
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
496 void updateRow()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
497 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
498 DownloadItem item = qobject_cast<DownloadItem*>(sender());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
499 int row = m_downloads.indexOf(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
500 if (-1 == row)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
501 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
502 if (!m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
503 m_iconProvider = new QFileIconProvider();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
504 QIcon icon = m_iconProvider.icon(item.m_output.fileName());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
505 if (icon.isNull())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
506 icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
507 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
508 downloadsView.setRowHeight(row, item.minimumSizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
509
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
510 bool remove = false;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
511 QWebSettings globalSettings = QWebSettings.globalSettings();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
512 if (!item.downloading() && globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
513 remove = true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
514
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
515 if (item.downloadedSuccessfully() && removePolicy() == DownloadManager.SuccessFullDownload) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
516 remove = true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
517 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
518 if (remove)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
519 m_model.removeRow(row);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
520
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
521 cleanupButton.setEnabled(m_downloads.count() - activeDownloads() > 0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
522 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
523
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
524 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
525
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
526 void addItem(DownloadItem item)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
527 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
528 item.statusChanged.connect(&this.updateRow);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
529 int row = m_downloads.count();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
530 m_model.beginInsertRows(QModelIndex(), row, row);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
531 m_downloads.append(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
532 m_model.endInsertRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
533 updateItemCount();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
534 if (row == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
535 show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
536 downloadsView.setIndexWidget(m_model.index(row, 0), item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
537 QIcon icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
538 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
539 downloadsView.setRowHeight(row, item.sizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
540 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
541
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
542
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
543 void updateItemCount()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
544 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
545 int count = m_downloads.count();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
546 itemCount.setText(count == 1 ? tr("1 Download") : tr("%1 Downloads").arg(count));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
547 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
548
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
549 void load()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
550 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
551 QSettings settings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
552 settings.beginGroup(QLatin1String("downloadmanager"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
553 QSize size = settings.value(QLatin1String("size")).toSize();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
554 if (size.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
555 resize(size);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
556 QByteArray value = settings.value(QLatin1String("removeDownloadsPolicy"), QLatin1String("Never")).toByteArray();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
557 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
558 m_removePolicy = removePolicyEnum.keyToValue(value) == -1 ? Never :
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
559 static_cast<RemovePolicy>(removePolicyEnum.keyToValue(value));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
560
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
561 int i = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
562 QString key = QString(QLatin1String("download_%1_")).arg(i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
563 while (settings.contains(key + QLatin1String("url"))) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
564 QUrl url = settings.value(key + QLatin1String("url")).toUrl();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
565 QString fileName = settings.value(key + QLatin1String("location")).toString();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
566 bool done = settings.value(key + QLatin1String("done"), true).toBool();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
567 if (!url.isEmpty() && !fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
568 DownloadItem item = new DownloadItem(0, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
569 item.m_output.setFileName(fileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
570 item.fileNameLabel.setText(QFileInfo(item.m_output.fileName()).fileName());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
571 item.m_url = url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
572 item.stopButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
573 item.stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
574 item.tryAgainButton.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
575 item.tryAgainButton.setEnabled(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
576 item.progressBar.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
577 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
578 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
579 key = QString(QLatin1String("download_%1_")).arg(++i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
580 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
581 cleanupButton.setEnabled(m_downloads.count() - activeDownloads() > 0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
582 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
583
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
584 AutoSaver m_autoSaver;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
585 DownloadModel m_model;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
586 QNetworkAccessManager m_manager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
587 QFileIconProvider m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
588 QList<DownloadItem> m_downloads;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
589 RemovePolicy m_removePolicy;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
590 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
591
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
592
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
593 class DownloadModel : public QAbstractListModel
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
594 {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
595
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
596 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
597
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
598 this(DownloadManager downloadManager, QObject parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
599 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
600 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
601 m_downloadManager = downloadManager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
602 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
603
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
604 QVariant data(QModelIndex index, int role = Qt.DisplayRole)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
605 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
606 if (index.row() < 0 || index.row() >= rowCount(index.parent()))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
607 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
608 if (role == Qt.ToolTipRole)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
609 if (!m_downloadManager.m_downloads.at(index.row()).downloadedSuccessfully())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
610 return m_downloadManager.m_downloads.at(index.row()).downloadInfoLabel.text();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
611 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
612 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
613
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
614 int rowCount(QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
615 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
616 return (parent.isValid()) ? 0 : m_downloadManager.m_downloads.count();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
617 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
618
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
619 bool removeRows(int row, int count, QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
620 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
621 if (parent.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
622 return false;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
623
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
624 int lastRow = row + count - 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
625 for (int i = lastRow; i >= row; --i) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
626 if (m_downloadManager.m_downloads.at(i).downloadedSuccessfully()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
627 || m_downloadManager.m_downloads.at(i).tryAgainButton.isEnabled()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
628 beginRemoveRows(parent, i, i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
629 m_downloadManager.m_downloads.takeAt(i).deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
630 endRemoveRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
631 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
632 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
633 m_downloadManager.m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
634 return true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
635 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
636
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
637 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
638
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
639 DownloadManager m_downloadManager;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
640 }