annotate demos/browser/downloadmanager.d @ 77:0654fc9bac95

more porting
author mandel
date Sun, 24 May 2009 13:46:32 +0000
parents 37caa90ce503
children 85c59c4e5f19
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();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
143 statusChanged.emit();
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
148 auto info = new QFileInfo(m_output);
73
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)) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
162 downloadInfoLabel.setText(Format(tr("Error opening save file: {}"), m_output.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
163 stopButton.click();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
164 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
165 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
166 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
167 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
168 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
169 if (-1 == m_output.write(m_reply.readAll())) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
170 downloadInfoLabel.setText(Format(tr("Error saving: {}"), m_output.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
171 stopButton.click();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
172 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
173 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
174
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
175 void error(QNetworkReply.NetworkError code)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
176 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
177 qDebug() << "DownloadItem::error" << m_reply.errorString() << m_url;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
178 downloadInfoLabel.setText(Format(tr("Network Error: {}"), m_reply.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
179 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
180 tryAgainButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
181 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
182
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
183 void downloadProgress(ulong bytesReceived, ulong bytesTotal)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
184 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
185 m_bytesReceived = bytesReceived;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
186 if (bytesTotal == -1) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
187 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
188 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
189 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
190 progressBar.setValue(bytesReceived);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
191 progressBar.setMaximum(bytesTotal);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
192 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
193 updateInfoLabel();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
194 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
195
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
196 void metaDataChanged()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
197 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
198 qDebug() << "DownloadItem::metaDataChanged: not handled.";
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
199 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
200
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
201 void finished()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
202 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
203 progressBar.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
204 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
205 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
206 m_output.close();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
207 updateInfoLabel();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
208 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
209 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
210
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
211 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
212
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
213 void getFileName()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
214 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
215 auto settings = new QSettings;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
216 settings.beginGroup(QLatin1String("downloadmanager"));
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
217 string defaultLocation = QDesktopServices.storageLocation(QDesktopServices.DesktopLocation);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
218 string downloadDirectory = settings.value(QLatin1String("downloadDirectory"), defaultLocation).toString();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
219 if (!downloadDirectory.isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
220 downloadDirectory += QLatin1Char('/');
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
221
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
222 string defaultFileName = saveFileName(downloadDirectory);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
223 string fileName = defaultFileName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
224 if (m_requestFileName) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
225 fileName = QFileDialog.getSaveFileName(this, tr("Save File"), defaultFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
226 if (fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
227 m_reply.close();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
228 fileNameLabel.setText(Format(tr("Download canceled: {}"), (new QFileInfo(defaultFileName)).fileName()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
229 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
230 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
231 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
232 m_output.setFileName(fileName);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
233 fileNameLabel.setText((new QFileInfo(m_output.fileName())).fileName());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
234 if (m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
235 downloadReadyRead();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
236 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
237
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
238 void init()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
239 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
240 if (!m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
241 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
242
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
243 // attach to the m_reply
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
244 m_url = m_reply.url();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
245 m_reply.setParent(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
246 m_reply.readyRead.connect(&this.downloadReadyRead);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
247 m_reply.error.connect(&this.error);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
248 m_reply.downloadProgress.connect(&this.downloadProgress);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
249 m_reply.metaDataChanged.connect(&this.metaDataChanged);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
250 m_reply.finished.connect(&this.finished);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
251
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
252 // reset info
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
253 downloadInfoLabel.clear();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
254 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
255 getFileName();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
256
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
257 // start timer for the download estimation
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
258 m_downloadTime.start();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
259
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
260 if (m_reply.error() != QNetworkReply.NoError) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
261 error(m_reply.error());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
262 finished();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
263 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
264 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
265
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
266 void updateInfoLabel()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
267 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
268 if (m_reply.error() == QNetworkReply.NoError)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
269 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
270
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
271 ulong bytesTotal = progressBar.maximum();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
272 bool running = !downloadedSuccessfully();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
273
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
274 // update info label
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
275 double speed = m_bytesReceived * 1000.0 / m_downloadTime.elapsed();
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
276 double timeRemaining = (cast(double)(bytesTotal - m_bytesReceived)) / speed;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
277 string timeRemainingString = tr("seconds");
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
278 if (timeRemaining > 60) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
279 timeRemaining = timeRemaining / 60;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
280 timeRemainingString = tr("minutes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
281 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
282 timeRemaining = floor(timeRemaining);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
283
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
284 // When downloading the eta should never be 0
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
285 if (timeRemaining == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
286 timeRemaining = 1;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
287
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
288 string info;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
289 if (running) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
290 string remaining;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
291 if (bytesTotal != 0)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
292 remaining = Format(tr("- {} {} remaining"), timeRemaining, timeRemainingString);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
293
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
294 info = Format(tr("{} of {} ({}/sec) {}"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
295 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
296 bytesTotal == 0 ? tr("?") : dataString(bytesTotal),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
297 dataString(cast(int) speed),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
298 remaining);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
299 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
300 if (m_bytesReceived == bytesTotal)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
301 info = dataString(m_output.size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
302 else
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
303 info = Format(tr("{} of {} - Stopped"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
304 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
305 dataString(bytesTotal));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
306 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
307 downloadInfoLabel.setText(info);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
308 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
309
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
310 string dataString(int size)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
311 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
312 string unit;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
313 if (size < 1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
314 unit = tr("bytes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
315 } else if (size < 1024*1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
316 size /= 1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
317 unit = tr("kB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
318 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
319 size /= 1024*1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
320 unit = tr("MB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
321 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
322 return Format(QLatin1String("{} {}"), size, unit);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
323 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
324
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
325 string saveFileName(string directory)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
326 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
327 // Move this function into QNetworkReply to also get file name sent from the server
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
328 string path = m_url.path();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
329 auto info = new QFileInfo(path);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
330 string baseName = info.completeBaseName();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
331 string endName = info.suffix();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
332
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
333 if (baseName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
334 baseName = QLatin1String("unnamed_download");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
335 qDebug() << "DownloadManager:: downloading unknown file:" << m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
336 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
337 string name = directory ~ baseName ~ QLatin1Char('.') ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
338 if (QFile.exists(name)) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
339 // already exists, don't overwrite
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
340 int i = 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
341 do {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
342 name = directory ~ baseName ~ QLatin1Char('-') ~ QString.number(i++) ~ QLatin1Char('.') ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
343 } while (QFile.exists(name));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
344 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
345 return name;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
346 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
347
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
348 bool m_requestFileName;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
349 ulong m_bytesReceived;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
350 QTime m_downloadTime;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
351 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
352
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
353
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
354 class DownloadManager : public QDialog, public Ui_DownloadDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
355 {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
356
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
357 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
358
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
359 enum RemovePolicy {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
360 Never,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
361 Exit,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
362 SuccessFullDownload
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
363 };
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
364
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
365 /*!
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
366 DownloadManager is a Dialog that contains a list of DownloadItems
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
367
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
368 It is a basic download manager. It only downloads the file, doesn't do BitTorrent,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
369 extract zipped files or anything fancy.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
370 */
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
371 this(QWidget parent = null)
37caa90ce503 more porting
mandel
parents: 73
diff changeset
372 //: QDialog(parent)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
373 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
374 m_autoSaver = new AutoSaver(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
375 m_manager = BrowserApplication.networkAccessManager();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
376 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
377 m_removePolicy = RemovePolicy.Never;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
378
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
379 setupUi(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
380 downloadsView.setShowGrid(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
381 downloadsView.verticalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
382 downloadsView.horizontalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
383 downloadsView.setAlternatingRowColors(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
384 downloadsView.horizontalHeader().setStretchLastSection(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
385 m_model = new DownloadModel(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
386 downloadsView.setModel(m_model);
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
387 cleanupButton.clicked.connect(&this.cleanup);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
388 load();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
389 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
390
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
391 ~this()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
392 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
393 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
394 m_autoSaver.saveIfNeccessary();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
395 if (m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
396 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
397 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
398
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
399 int activeDownloads()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
400 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
401 int count = 0;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
402 for (int i = 0; i < m_downloads.length; ++i) {
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
403 if (m_downloads[i].stopButton.isEnabled())
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
404 ++count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
405 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
406 return count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
407 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
408
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
409 RemovePolicy removePolicy()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
410 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
411 return m_removePolicy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
412 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
413
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
414 void setRemovePolicy(RemovePolicy policy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
415 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
416 if (policy == m_removePolicy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
417 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
418 m_removePolicy = policy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
419 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
420 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
421
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
422 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
423
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
424 void download(QNetworkRequest request, bool requestFileName = false)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
425 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
426 if (request.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
427 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
428 handleUnsupportedContent(m_manager.get(request), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
429 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
430
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
431 void download(QUrl url, bool requestFileName = false)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
432 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
433 download(QNetworkRequest(url), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
434 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
435
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
436 void handleUnsupportedContent(QNetworkReply reply, bool requestFileName = false)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
437 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
438 if (!reply || reply.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
439 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
440 QVariant header = reply.header(QNetworkRequest.ContentLengthHeader);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
441 bool ok;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
442 int size = header.toInt(&ok);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
443 if (ok && size == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
444 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
445
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
446 qDebug() << "DownloadManager::handleUnsupportedContent" << reply.url() << "requestFileName" << requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
447 DownloadItem item = new DownloadItem(reply, requestFileName, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
448 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
449 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
450
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
451 void cleanup()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
452 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
453 if (m_downloads.length == 0)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
454 return;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
455 m_model.removeRows(0, m_downloads.length);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
456 updateItemCount();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
457 if (m_downloads.length == 0 && m_iconProvider) {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
458 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
459 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
460 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
461 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
462 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
463
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
464 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
465
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
466 void save()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
467 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
468 QSettings settings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
469 settings.beginGroup(QLatin1String("downloadmanager"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
470 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
471 settings.setValue(QLatin1String("removeDownloadsPolicy"), QLatin1String(removePolicyEnum.valueToKey(m_removePolicy)));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
472 settings.setValue(QLatin1String("size"), size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
473 if (m_removePolicy == Exit)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
474 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
475
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
476 for (int i = 0; i < m_downloads.length; ++i) {
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
477 string key = Format(QLatin1String("download_{}_"), i);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
478 settings.setValue(key ~ QLatin1String("url"), m_downloads[i].m_url);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
479 settings.setValue(key ~ QLatin1String("location"), (new QFileInfo(m_downloads[i].m_output)).filePath());
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
480 settings.setValue(key ~ QLatin1String("done"), m_downloads[i].downloadedSuccessfully());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
481 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
482 int i = m_downloads.length;
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
483 string key = Format(QLatin1String("download_{}_"), i);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
484 while (settings.contains(key ~ QLatin1String("url"))) {
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
485 settings.remove(key ~ QLatin1String("url"));
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
486 settings.remove(key ~ QLatin1String("location"));
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
487 settings.remove(key ~ QLatin1String("done"));
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
488 key = Format(QLatin1String("download_{}_"), ++i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
489 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
490 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
491
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
492 void updateRow()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
493 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
494 DownloadItem item = cast(DownloadItem) signalSender();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
495 int row = m_downloads.indexOf(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
496 if (-1 == row)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
497 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
498 if (!m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
499 m_iconProvider = new QFileIconProvider();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
500 QIcon icon = m_iconProvider.icon(item.m_output.fileName());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
501 if (icon.isNull())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
502 icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
503 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
504 downloadsView.setRowHeight(row, item.minimumSizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
505
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
506 bool remove = false;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
507 QWebSettings globalSettings = QWebSettings.globalSettings();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
508 if (!item.downloading() && globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
509 remove = true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
510
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
511 if (item.downloadedSuccessfully() && removePolicy() == DownloadManager.SuccessFullDownload) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
512 remove = true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
513 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
514 if (remove)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
515 m_model.removeRow(row);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
516
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
517 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
518 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
519
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
520 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
521
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
522 void addItem(DownloadItem item)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
523 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
524 item.statusChanged.connect(&this.updateRow);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
525 int row = m_downloads.length;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
526 m_model.beginInsertRows(QModelIndex(), row, row);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
527 m_downloads ~= item;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
528 m_model.endInsertRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
529 updateItemCount();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
530 if (row == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
531 show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
532 downloadsView.setIndexWidget(m_model.index(row, 0), item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
533 QIcon icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
534 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
535 downloadsView.setRowHeight(row, item.sizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
536 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
537
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
538
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
539 void updateItemCount()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
540 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
541 int count = m_downloads.length;
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
542 itemCount.setText(count == 1 ? tr("1 Download") : tr("{} Downloads").arg(count));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
543 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
544
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
545 void load()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
546 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
547 QSettings settings;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
548 settings.beginGroup(QLatin1String("downloadmanager"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
549 QSize size = settings.value(QLatin1String("size")).toSize();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
550 if (size.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
551 resize(size);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
552 QByteArray value = settings.value(QLatin1String("removeDownloadsPolicy"), QLatin1String("Never")).toByteArray();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
553 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
554 m_removePolicy = removePolicyEnum.keyToValue(value) == -1 ? Never :
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
555 cast(RemovePolicy) removePolicyEnum.keyToValue(value);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
556
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
557 int i = 0;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
558 string key = Format(QLatin1String("download_{}_"), i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
559 while (settings.contains(key + QLatin1String("url"))) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
560 QUrl url = settings.value(key + QLatin1String("url")).toUrl();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
561 string fileName = settings.value(key + QLatin1String("location")).toString();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
562 bool done = settings.value(key + QLatin1String("done"), true).toBool();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
563 if (!url.isEmpty() && !fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
564 DownloadItem item = new DownloadItem(0, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
565 item.m_output.setFileName(fileName);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
566 item.fileNameLabel.setText((new QFileInfo(item.m_output.fileName())).fileName());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
567 item.m_url = url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
568 item.stopButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
569 item.stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
570 item.tryAgainButton.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
571 item.tryAgainButton.setEnabled(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
572 item.progressBar.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
573 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
574 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
575 key = Format(QLatin1String("download_{}_"), ++i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
576 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
577 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
578 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
579
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
580 AutoSaver m_autoSaver;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
581 DownloadModel m_model;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
582 QNetworkAccessManager m_manager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
583 QFileIconProvider m_iconProvider;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
584 DownloadItem[] m_downloads;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
585 RemovePolicy m_removePolicy;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
586 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
587
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
588
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
589 class DownloadModel : public QAbstractListModel
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
590 {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
591
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
592 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
593
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
594 this(DownloadManager downloadManager, QObject parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
595 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
596 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
597 m_downloadManager = downloadManager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
598 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
599
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
600 QVariant data(QModelIndex index, int role = Qt.DisplayRole)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
601 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
602 if (index.row() < 0 || index.row() >= rowCount(index.parent()))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
603 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
604 if (role == Qt.ToolTipRole)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
605 if (!m_downloadManager.m_downloads[index.row()].downloadedSuccessfully())
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
606 return m_downloadManager.m_downloads[index.row()].downloadInfoLabel.text();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
607 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
608 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
609
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
610 int rowCount(QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
611 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
612 return (parent.isValid()) ? 0 : m_downloadManager.m_downloads.length;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
613 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
614
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
615 bool removeRows(int row, int count, QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
616 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
617 if (parent.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
618 return false;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
619
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
620 int lastRow = row + count - 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
621 for (int i = lastRow; i >= row; --i) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
622 if (m_downloadManager.m_downloads[i].downloadedSuccessfully()
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
623 || m_downloadManager.m_downloads[i].tryAgainButton.isEnabled()) {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
624 beginRemoveRows(parent, i, i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
625 m_downloadManager.m_downloads.takeAt(i).deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
626 endRemoveRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
627 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
628 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
629 m_downloadManager.m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
630 return true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
631 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
632
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
633 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
634
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
635 DownloadManager m_downloadManager;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
636 }