annotate demos/browser/downloadmanager.d @ 100:dcd36d8db2da

more porting
author mandel
date Fri, 29 May 2009 11:36:51 +0000
parents 87bb4e622f9e
children 8636c819ce4d
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;
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
47 //import qt.core.QMetaEnum;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
48 import qt.core.QSettings;
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
49 //import qt.core.QDebug;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
50 import qt.gui.QDesktopServices;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
51 import qt.gui.QFileDialog;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
52 import qt.gui.QHeaderView;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
53 import qt.gui.QFileIconProvider;
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
54 import qt.core.QAbstractListModel;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
55 import qt.network.QNetworkReply;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
56 import qt.webkit.QWebSettings;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
57
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
58 import tango.text.convert.Format;
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
59
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
60 //import math;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
61 import autosaver;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
62 import browserapplication;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
63 import networkaccessmanager;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
64 import ui_downloads;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
65 import ui_downloaditem;
45
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
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
68 class DownloadItem : public QWidget //, public Ui_DownloadItem
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
69 {
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
70 mixin Signal!("statusChanged");
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
71 DownloadItem ui;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
73 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
74
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
75 /*!
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
76 DownloadItem is a widget that is displayed in the download manager list.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
77 It moves the data from the QNetworkReply into the QFile as well
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
78 as update the information/progressbar and report errors.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
79 */
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
80 this(QNetworkReply reply = null, bool requestFileName = false, QWidget parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
81 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
82 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
83 m_reply = reply;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
84 m_requestFileName = requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
85 m_bytesReceived = 0;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
86
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
87 ui.setupUi(this);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
88 QPalette p = downloadInfoLabel.palette();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
89 p.setColor(QPalette.Text, Qt.darkGray);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
90 downloadInfoLabel.setPalette(p);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
91 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
92 tryAgainButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
93 stopButton.clicked.connect(&this.stop);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
94 openButton.clicked.connect(&this.open);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
95 tryAgainButton.clicked.connect(&this.tryAgain);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
96
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
97 init();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
98 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
99
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
100 bool downloading()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
101 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
102 return (progressBar.isVisible());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
103 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
104
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
105 bool downloadedSuccessfully()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
106 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
107 return (stopButton.isHidden() && tryAgainButton.isHidden());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
108 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
109
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
110 QUrl m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
111 QFile m_output;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
112 QNetworkReply m_reply;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
113
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
114 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
115
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
116 void stop()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
117 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
118 setUpdatesEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
119 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
120 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
121 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
122 tryAgainButton.show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
123 setUpdatesEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
124 m_reply.abort();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
125 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
126
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
127 void tryAgain()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
128 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
129 if (!tryAgainButton.isEnabled())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
130 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
131
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
132 tryAgainButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
133 tryAgainButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
134 stopButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
135 stopButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
136 progressBar.setVisible(true);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
137
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
138 QNetworkReply r = BrowserApplication.networkAccessManager().get(QNetworkRequest(m_url));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
139 if (m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
140 m_reply.deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
141 if (m_output.exists())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
142 m_output.remove();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
143 m_reply = r;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
144 init();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
145 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
146 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
147
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
148 void open()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
149 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
150 auto info = new QFileInfo(m_output);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
151 QUrl url = QUrl.fromLocalFile(info.absolutePath());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
152 QDesktopServices.openUrl(url);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
153 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
154
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
155 void downloadReadyRead()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
156 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
157 if (m_requestFileName && m_output.fileName().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
158 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
159 if (!m_output.isOpen()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
160 // in case someone else has already put a file there
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
161 if (!m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
162 getFileName();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
163 if (!m_output.open(QIODevice.WriteOnly)) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
164 downloadInfoLabel.setText(Format(tr("Error opening save file: {}"), m_output.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
165 stopButton.click();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
166 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
167 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
168 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
169 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
170 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
171 if (-1 == m_output.write(m_reply.readAll())) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
172 downloadInfoLabel.setText(Format(tr("Error saving: {}"), m_output.errorString()));
73
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 {
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
179 qDebug("DownloadItem::error" ~ m_reply.errorString() ~ m_url);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
180 downloadInfoLabel.setText(Format(tr("Network Error: {}"), m_reply.errorString()));
73
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
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
185 void downloadProgress(ulong bytesReceived, ulong bytesTotal)
73
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 {
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
200 qDebug("DownloadItem::metaDataChanged: not handled.");
73
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();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
210 statusChanged.emit();
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
217 auto settings = new QSettings;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
218 settings.beginGroup("downloadmanager");
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
219 string defaultLocation = QDesktopServices.storageLocation(QDesktopServices.DesktopLocation);
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
220 string downloadDirectory = settings.value("downloadDirectory", defaultLocation).toString();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
221 if (!downloadDirectory.isEmpty())
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
222 downloadDirectory ~= "/";
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
223
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
224 string defaultFileName = saveFileName(downloadDirectory);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
225 string fileName = defaultFileName;
73
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();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
230 fileNameLabel.setText(Format(tr("Download canceled: {}"), (new QFileInfo(defaultFileName)).fileName()));
73
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);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
235 fileNameLabel.setText((new QFileInfo(m_output.fileName())).fileName());
73
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
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
273 ulong bytesTotal = progressBar.maximum();
73
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();
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
278 double timeRemaining = (cast(double)(bytesTotal - m_bytesReceived)) / speed;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
279 string timeRemainingString = tr("seconds");
73
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
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
290 string info;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
291 if (running) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
292 string remaining;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
293 if (bytesTotal != 0)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
294 remaining = Format(tr("- {} {} remaining"), timeRemaining, timeRemainingString);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
295
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
296 info = Format(tr("{} of {} ({}/sec) {}"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
297 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
298 bytesTotal == 0 ? tr("?") : dataString(bytesTotal),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
299 dataString(cast(int) speed),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
300 remaining);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
301 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
302 if (m_bytesReceived == bytesTotal)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
303 info = dataString(m_output.size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
304 else
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
305 info = Format(tr("{} of {} - Stopped"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
306 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
307 dataString(bytesTotal));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
308 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
309 downloadInfoLabel.setText(info);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
310 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
311
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
312 string dataString(int size)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
313 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
314 string unit;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
315 if (size < 1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
316 unit = tr("bytes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
317 } else if (size < 1024*1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
318 size /= 1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
319 unit = tr("kB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
320 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
321 size /= 1024*1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
322 unit = tr("MB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
323 }
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
324 return Format("{} {}", size, unit);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
325 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
326
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
327 string saveFileName(string directory)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
328 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
329 // Move this function into QNetworkReply to also get file name sent from the server
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
330 string path = m_url.path();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
331 auto info = new QFileInfo(path);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
332 string baseName = info.completeBaseName();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
333 string endName = info.suffix();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
334
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
335 if (baseName.isEmpty()) {
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
336 baseName = "unnamed_download";
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
337 qDebug("DownloadManager:: downloading unknown file:" ~ m_url);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
338 }
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
339 string name = directory ~ baseName ~ "." ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
340 if (QFile.exists(name)) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
341 // already exists, don't overwrite
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
342 int i = 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
343 do {
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
344 name = directory ~ baseName ~ "-" ~ .toString(i++) ~ "." ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
345 } while (QFile.exists(name));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
346 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
347 return name;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
348 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
349
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
350 bool m_requestFileName;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
351 ulong m_bytesReceived;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
352 QTime m_downloadTime;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
353 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
354
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
355
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
356 class DownloadManager : public QDialog //, public Ui_DownloadDialog
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
357 {
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
358 DownloadDialog ui;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
359
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
360 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
361
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
362 enum RemovePolicy {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
363 Never,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
364 Exit,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
365 SuccessFullDownload
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
366 };
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 DownloadManager is a Dialog that contains a list of DownloadItems
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
370
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
371 It is a basic download manager. It only downloads the file, doesn't do BitTorrent,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
372 extract zipped files or anything fancy.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
373 */
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
374 this(QWidget parent = null)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
375 {
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
376 super(parent);
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
377
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
378 m_autoSaver = new AutoSaver(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
379 m_manager = BrowserApplication.networkAccessManager();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
380 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
381 m_removePolicy = RemovePolicy.Never;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
382
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
383 ui.setupUi(this);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
384 downloadsView.setShowGrid(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
385 downloadsView.verticalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
386 downloadsView.horizontalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
387 downloadsView.setAlternatingRowColors(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
388 downloadsView.horizontalHeader().setStretchLastSection(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
389 m_model = new DownloadModel(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
390 downloadsView.setModel(m_model);
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
391 cleanupButton.clicked.connect(&this.cleanup);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
392 load();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
393 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
394
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
395 ~this()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
396 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
397 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
398 m_autoSaver.saveIfNeccessary();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
399 if (m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
400 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
401 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
402
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
403 int activeDownloads()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
404 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
405 int count = 0;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
406 for (int i = 0; i < m_downloads.length; ++i) {
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
407 if (m_downloads[i].stopButton.isEnabled())
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
408 ++count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
409 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
410 return count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
411 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
412
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
413 RemovePolicy removePolicy()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
414 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
415 return m_removePolicy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
416 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
417
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
418 void setRemovePolicy(RemovePolicy policy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
419 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
420 if (policy == m_removePolicy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
421 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
422 m_removePolicy = policy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
423 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
424 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
425
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
426 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
427
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
428 void download(QNetworkRequest request, bool requestFileName = false)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
429 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
430 if (request.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
431 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
432 handleUnsupportedContent(m_manager.get(request), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
433 }
45
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
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
440 void handleUnsupportedContent(QNetworkReply reply, bool requestFileName = false)
73
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
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
450 qDebug("DownloadManager::handleUnsupportedContent" ~ reply.url() ~ "requestFileName" ~ requestFileName);
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
457 if (m_downloads.length == 0)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
458 return;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
459 m_model.removeRows(0, m_downloads.length);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
460 updateItemCount();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
461 if (m_downloads.length == 0 && m_iconProvider) {
73
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;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
473 settings.beginGroup("downloadmanager");
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
474 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
475 settings.setValue("removeDownloadsPolicy", removePolicyEnum.valueToKey(m_removePolicy));
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
476 settings.setValue("size", size());
73
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
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
480 for (int i = 0; i < m_downloads.length; ++i) {
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
481 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
482 settings.setValue(key ~ "url", m_downloads[i].m_url);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
483 settings.setValue(key ~ "location", (new QFileInfo(m_downloads[i].m_output)).filePath());
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
484 settings.setValue(key ~ "done", m_downloads[i].downloadedSuccessfully());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
485 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
486 int i = m_downloads.length;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
487 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
488 while (settings.contains(key ~ "url")) {
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
489 settings.remove(key ~ "url");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
490 settings.remove(key ~ "location");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
491 settings.remove(key ~ "done");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
492 key = Format("download_{}_", ++i);
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
498 DownloadItem item = cast(DownloadItem) signalSender();
73
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
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
521 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
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);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
529 int row = m_downloads.length;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
530 m_model.beginInsertRows(QModelIndex(), row, row);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
531 m_downloads ~= item;
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
545 int count = m_downloads.length;
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
546 itemCount.setText(count == 1 ? tr("1 Download") : tr("{} Downloads").arg(count));
73
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;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
552 settings.beginGroup("downloadmanager");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
553 QSize size = settings.value("size").toSize();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
554 if (size.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
555 resize(size);
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
556 QByteArray value = settings.value("removeDownloadsPolicy", "Never").toByteArray();
73
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 :
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
559 cast(RemovePolicy) removePolicyEnum.keyToValue(value);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
560
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
561 int i = 0;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
562 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
563 while (settings.contains(key ~ "url")) {
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
564 QUrl url = settings.value(key ~ "url").toUrl();
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
565 string fileName = settings.value(key ~ "location").toString();
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
566 bool done = settings.value(key ~ "done", true).toBool();
73
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);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
570 item.fileNameLabel.setText((new QFileInfo(item.m_output.fileName())).fileName());
73
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 }
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
579 key = Format("download_{}_", ++i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
580 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
581 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
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;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
588 DownloadItem[] m_downloads;
73
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)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
609 if (!m_downloadManager.m_downloads[index.row()].downloadedSuccessfully())
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
610 return m_downloadManager.m_downloads[index.row()].downloadInfoLabel.text();
73
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 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
616 return (parent.isValid()) ? 0 : m_downloadManager.m_downloads.length;
73
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) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
626 if (m_downloadManager.m_downloads[i].downloadedSuccessfully()
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
627 || m_downloadManager.m_downloads[i].tryAgainButton.isEnabled()) {
73
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 }