annotate demos/browser/downloadmanager.d @ 393:1049b01aebd2

Fixed generator segfaults on OS X 10.6. Regarding the change to dgenerator.cpp, I am not actually sure if 0 is the correct value to pass, but it seems to work and the code which had been there before was just plain incorrect ? it read past the list boundaries.
author David Nadlinger <code@klickverbot.at>
date Sat, 28 Aug 2010 02:55:55 +0200
parents a8d76a9a85aa
children
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
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;
150
a8d76a9a85aa more porting
mandel
parents: 113
diff changeset
63 import ui_downloaddialog;
73
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
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
67 class DownloadItem : public QWidget //, public Ui_DownloadItem
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
68 {
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
69 mixin Signal!("statusChanged");
113
8636c819ce4d more porting
mandel
parents: 100
diff changeset
70 mixin Ui_DownloadItem;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
71
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
73
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
74 /*!
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
75 DownloadItem is a widget that is displayed in the download manager list.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
76 It moves the data from the QNetworkReply into the QFile as well
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
77 as update the information/progressbar and report errors.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
78 */
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
79 this(QNetworkReply reply = null, bool requestFileName = false, QWidget parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
80 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
81 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
82 m_reply = reply;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
83 m_requestFileName = requestFileName;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
84 m_bytesReceived = 0;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
85
113
8636c819ce4d more porting
mandel
parents: 100
diff changeset
86 setupUi(this);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
87 QPalette p = downloadInfoLabel.palette();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
88 p.setColor(QPalette.Text, Qt.darkGray);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
89 downloadInfoLabel.setPalette(p);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
90 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
91 tryAgainButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
92 stopButton.clicked.connect(&this.stop);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
93 openButton.clicked.connect(&this.open);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
94 tryAgainButton.clicked.connect(&this.tryAgain);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
95
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
96 init();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
97 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
98
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
99 bool downloading()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
100 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
101 return (progressBar.isVisible());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
102 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
103
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
104 bool downloadedSuccessfully()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
105 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
106 return (stopButton.isHidden() && tryAgainButton.isHidden());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
107 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
108
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
109 QUrl m_url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
110 QFile m_output;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
111 QNetworkReply m_reply;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
112
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
113 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
114
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
115 void stop()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
116 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
117 setUpdatesEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
118 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
119 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
120 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
121 tryAgainButton.show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
122 setUpdatesEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
123 m_reply.abort();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
124 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
125
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
126 void tryAgain()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
127 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
128 if (!tryAgainButton.isEnabled())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
129 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
130
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
131 tryAgainButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
132 tryAgainButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
133 stopButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
134 stopButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
135 progressBar.setVisible(true);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
136
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
137 QNetworkReply r = BrowserApplication.networkAccessManager().get(QNetworkRequest(m_url));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
138 if (m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
139 m_reply.deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
140 if (m_output.exists())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
141 m_output.remove();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
142 m_reply = r;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
143 init();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
144 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
145 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
146
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
147 void open()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
148 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
149 auto info = new QFileInfo(m_output);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
150 QUrl url = QUrl.fromLocalFile(info.absolutePath());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
151 QDesktopServices.openUrl(url);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
152 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
153
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
154 void downloadReadyRead()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
155 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
156 if (m_requestFileName && m_output.fileName().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
157 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
158 if (!m_output.isOpen()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
159 // in case someone else has already put a file there
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
160 if (!m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
161 getFileName();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
162 if (!m_output.open(QIODevice.WriteOnly)) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
163 downloadInfoLabel.setText(Format(tr("Error opening save file: {}"), m_output.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
164 stopButton.click();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
165 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
166 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
167 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
168 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
169 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
170 if (-1 == m_output.write(m_reply.readAll())) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
171 downloadInfoLabel.setText(Format(tr("Error saving: {}"), m_output.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
172 stopButton.click();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
173 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
174 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
175
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
176 void error(QNetworkReply.NetworkError code)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
177 {
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
178 qDebug("DownloadItem::error" ~ m_reply.errorString() ~ m_url);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
179 downloadInfoLabel.setText(Format(tr("Network Error: {}"), m_reply.errorString()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
180 tryAgainButton.setEnabled(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
181 tryAgainButton.setVisible(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
182 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
183
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
184 void downloadProgress(ulong bytesReceived, ulong bytesTotal)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
185 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
186 m_bytesReceived = bytesReceived;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
187 if (bytesTotal == -1) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
188 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
189 progressBar.setMaximum(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
190 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
191 progressBar.setValue(bytesReceived);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
192 progressBar.setMaximum(bytesTotal);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
193 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
194 updateInfoLabel();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
195 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
196
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
197 void metaDataChanged()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
198 {
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
199 qDebug("DownloadItem::metaDataChanged: not handled.");
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
200 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
201
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
202 void finished()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
203 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
204 progressBar.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
205 stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
206 stopButton.hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
207 m_output.close();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
208 updateInfoLabel();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
209 statusChanged.emit();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
210 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
211
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
212 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
213
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
214 void getFileName()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
215 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
216 auto settings = new QSettings;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
217 settings.beginGroup("downloadmanager");
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
218 string defaultLocation = QDesktopServices.storageLocation(QDesktopServices.DesktopLocation);
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
219 string downloadDirectory = settings.value("downloadDirectory", defaultLocation).toString();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
220 if (!downloadDirectory.isEmpty())
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
221 downloadDirectory ~= "/";
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
222
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
223 string defaultFileName = saveFileName(downloadDirectory);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
224 string fileName = defaultFileName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
225 if (m_requestFileName) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
226 fileName = QFileDialog.getSaveFileName(this, tr("Save File"), defaultFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
227 if (fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
228 m_reply.close();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
229 fileNameLabel.setText(Format(tr("Download canceled: {}"), (new QFileInfo(defaultFileName)).fileName()));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
230 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
231 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
232 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
233 m_output.setFileName(fileName);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
234 fileNameLabel.setText((new QFileInfo(m_output.fileName())).fileName());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
235 if (m_requestFileName)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
236 downloadReadyRead();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
237 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
238
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
239 void init()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
240 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
241 if (!m_reply)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
242 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
243
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
244 // attach to the m_reply
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
245 m_url = m_reply.url();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
246 m_reply.setParent(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
247 m_reply.readyRead.connect(&this.downloadReadyRead);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
248 m_reply.error.connect(&this.error);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
249 m_reply.downloadProgress.connect(&this.downloadProgress);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
250 m_reply.metaDataChanged.connect(&this.metaDataChanged);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
251 m_reply.finished.connect(&this.finished);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
252
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
253 // reset info
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
254 downloadInfoLabel.clear();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
255 progressBar.setValue(0);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
256 getFileName();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
257
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
258 // start timer for the download estimation
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
259 m_downloadTime.start();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
260
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
261 if (m_reply.error() != QNetworkReply.NoError) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
262 error(m_reply.error());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
263 finished();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
264 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
265 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
266
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
267 void updateInfoLabel()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
268 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
269 if (m_reply.error() == QNetworkReply.NoError)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
270 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
271
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
272 ulong bytesTotal = progressBar.maximum();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
273 bool running = !downloadedSuccessfully();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
274
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
275 // update info label
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
276 double speed = m_bytesReceived * 1000.0 / m_downloadTime.elapsed();
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
277 double timeRemaining = (cast(double)(bytesTotal - m_bytesReceived)) / speed;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
278 string timeRemainingString = tr("seconds");
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
279 if (timeRemaining > 60) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
280 timeRemaining = timeRemaining / 60;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
281 timeRemainingString = tr("minutes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
282 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
283 timeRemaining = floor(timeRemaining);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
284
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
285 // When downloading the eta should never be 0
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
286 if (timeRemaining == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
287 timeRemaining = 1;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
288
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
289 string info;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
290 if (running) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
291 string remaining;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
292 if (bytesTotal != 0)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
293 remaining = Format(tr("- {} {} remaining"), timeRemaining, timeRemainingString);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
294
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
295 info = Format(tr("{} of {} ({}/sec) {}"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
296 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
297 bytesTotal == 0 ? tr("?") : dataString(bytesTotal),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
298 dataString(cast(int) speed),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
299 remaining);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
300 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
301 if (m_bytesReceived == bytesTotal)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
302 info = dataString(m_output.size());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
303 else
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
304 info = Format(tr("{} of {} - Stopped"),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
305 dataString(m_bytesReceived),
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
306 dataString(bytesTotal));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
307 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
308 downloadInfoLabel.setText(info);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
309 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
310
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
311 string dataString(int size)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
312 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
313 string unit;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
314 if (size < 1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
315 unit = tr("bytes");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
316 } else if (size < 1024*1024) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
317 size /= 1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
318 unit = tr("kB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
319 } else {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
320 size /= 1024*1024;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
321 unit = tr("MB");
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
322 }
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
323 return Format("{} {}", size, unit);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
324 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
325
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
326 string saveFileName(string directory)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
327 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
328 // Move this function into QNetworkReply to also get file name sent from the server
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
329 string path = m_url.path();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
330 auto info = new QFileInfo(path);
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
331 string baseName = info.completeBaseName();
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
332 string endName = info.suffix();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
333
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
334 if (baseName.isEmpty()) {
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
335 baseName = "unnamed_download";
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
336 qDebug("DownloadManager:: downloading unknown file:" ~ m_url);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
337 }
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
338 string name = directory ~ baseName ~ "." ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
339 if (QFile.exists(name)) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
340 // already exists, don't overwrite
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
341 int i = 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
342 do {
85
5c8c9c5d9ee1 more porting
mandel
parents: 80
diff changeset
343 name = directory ~ baseName ~ "-" ~ .toString(i++) ~ "." ~ endName;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
344 } while (QFile.exists(name));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
345 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
346 return name;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
347 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
348
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
349 bool m_requestFileName;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
350 ulong m_bytesReceived;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
351 QTime m_downloadTime;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
352 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
353
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
354
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
355 class DownloadManager : public QDialog //, public Ui_DownloadDialog
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
356 {
113
8636c819ce4d more porting
mandel
parents: 100
diff changeset
357 mixin Ui_DownloadDialog;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
358
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
359 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
360
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
361 enum RemovePolicy {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
362 Never,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
363 Exit,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
364 SuccessFullDownload
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
365 };
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 DownloadManager is a Dialog that contains a list of DownloadItems
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
369
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
370 It is a basic download manager. It only downloads the file, doesn't do BitTorrent,
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
371 extract zipped files or anything fancy.
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
372 */
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
373 this(QWidget parent = null)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
374 {
94
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
375 super(parent);
87bb4e622f9e more porting
mandel
parents: 85
diff changeset
376
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
377 m_autoSaver = new AutoSaver(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
378 m_manager = BrowserApplication.networkAccessManager();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
379 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
380 m_removePolicy = RemovePolicy.Never;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
381
113
8636c819ce4d more porting
mandel
parents: 100
diff changeset
382 setupUi(this);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
383 downloadsView.setShowGrid(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
384 downloadsView.verticalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
385 downloadsView.horizontalHeader().hide();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
386 downloadsView.setAlternatingRowColors(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
387 downloadsView.horizontalHeader().setStretchLastSection(true);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
388 m_model = new DownloadModel(this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
389 downloadsView.setModel(m_model);
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
390 cleanupButton.clicked.connect(&this.cleanup);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
391 load();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
392 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
393
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
394 ~this()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
395 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
396 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
397 m_autoSaver.saveIfNeccessary();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
398 if (m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
399 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
400 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
401
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
402 int activeDownloads()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
403 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
404 int count = 0;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
405 for (int i = 0; i < m_downloads.length; ++i) {
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
406 if (m_downloads[i].stopButton.isEnabled())
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
407 ++count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
408 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
409 return count;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
410 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
411
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
412 RemovePolicy removePolicy()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
413 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
414 return m_removePolicy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
415 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
416
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
417 void setRemovePolicy(RemovePolicy policy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
418 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
419 if (policy == m_removePolicy)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
420 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
421 m_removePolicy = policy;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
422 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
423 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
424
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
425 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
426
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
427 void download(QNetworkRequest request, bool requestFileName = false)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
428 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
429 if (request.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
430 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
431 handleUnsupportedContent(m_manager.get(request), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
432 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
433
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
434 void download(QUrl url, bool requestFileName = false)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
435 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
436 download(QNetworkRequest(url), requestFileName);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
437 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
438
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
439 void handleUnsupportedContent(QNetworkReply reply, bool requestFileName = false)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
440 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
441 if (!reply || reply.url().isEmpty())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
442 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
443 QVariant header = reply.header(QNetworkRequest.ContentLengthHeader);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
444 bool ok;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
445 int size = header.toInt(&ok);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
446 if (ok && size == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
447 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
448
100
dcd36d8db2da more porting
mandel
parents: 94
diff changeset
449 qDebug("DownloadManager::handleUnsupportedContent" ~ reply.url() ~ "requestFileName" ~ requestFileName);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
450 DownloadItem item = new DownloadItem(reply, requestFileName, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
451 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
452 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
453
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
454 void cleanup()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
455 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
456 if (m_downloads.length == 0)
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
457 return;
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
458 m_model.removeRows(0, m_downloads.length);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
459 updateItemCount();
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
460 if (m_downloads.length == 0 && m_iconProvider) {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
461 delete m_iconProvider;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
462 m_iconProvider = 0;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
463 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
464 m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
465 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
466
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
467 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
468
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
469 void save()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
470 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
471 QSettings settings;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
472 settings.beginGroup("downloadmanager");
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
473 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
474 settings.setValue("removeDownloadsPolicy", removePolicyEnum.valueToKey(m_removePolicy));
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
475 settings.setValue("size", size());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
476 if (m_removePolicy == Exit)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
477 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
478
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
479 for (int i = 0; i < m_downloads.length; ++i) {
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
480 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
481 settings.setValue(key ~ "url", m_downloads[i].m_url);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
482 settings.setValue(key ~ "location", (new QFileInfo(m_downloads[i].m_output)).filePath());
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
483 settings.setValue(key ~ "done", m_downloads[i].downloadedSuccessfully());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
484 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
485 int i = m_downloads.length;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
486 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
487 while (settings.contains(key ~ "url")) {
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
488 settings.remove(key ~ "url");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
489 settings.remove(key ~ "location");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
490 settings.remove(key ~ "done");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
491 key = Format("download_{}_", ++i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
492 }
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 void updateRow()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
496 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
497 DownloadItem item = cast(DownloadItem) signalSender();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
498 int row = m_downloads.indexOf(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
499 if (-1 == row)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
500 return;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
501 if (!m_iconProvider)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
502 m_iconProvider = new QFileIconProvider();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
503 QIcon icon = m_iconProvider.icon(item.m_output.fileName());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
504 if (icon.isNull())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
505 icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
506 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
507 downloadsView.setRowHeight(row, item.minimumSizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
508
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
509 bool remove = false;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
510 QWebSettings globalSettings = QWebSettings.globalSettings();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
511 if (!item.downloading() && globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled))
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 (item.downloadedSuccessfully() && removePolicy() == DownloadManager.SuccessFullDownload) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
515 remove = true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
516 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
517 if (remove)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
518 m_model.removeRow(row);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
519
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
520 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
521 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
522
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
523 private:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
524
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
525 void addItem(DownloadItem item)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
526 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
527 item.statusChanged.connect(&this.updateRow);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
528 int row = m_downloads.length;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
529 m_model.beginInsertRows(QModelIndex(), row, row);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
530 m_downloads ~= item;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
531 m_model.endInsertRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
532 updateItemCount();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
533 if (row == 0)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
534 show();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
535 downloadsView.setIndexWidget(m_model.index(row, 0), item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
536 QIcon icon = style().standardIcon(QStyle.SP_FileIcon);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
537 item.fileIcon.setPixmap(icon.pixmap(48, 48));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
538 downloadsView.setRowHeight(row, item.sizeHint().height());
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
539 }
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 void updateItemCount()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
543 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
544 int count = m_downloads.length;
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
545 itemCount.setText(count == 1 ? tr("1 Download") : tr("{} Downloads").arg(count));
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
546 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
547
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
548 void load()
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
549 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
550 QSettings settings;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
551 settings.beginGroup("downloadmanager");
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
552 QSize size = settings.value("size").toSize();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
553 if (size.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
554 resize(size);
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
555 QByteArray value = settings.value("removeDownloadsPolicy", "Never").toByteArray();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
556 QMetaEnum removePolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("RemovePolicy"));
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
557 m_removePolicy = removePolicyEnum.keyToValue(value) == -1 ? Never :
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
558 cast(RemovePolicy) removePolicyEnum.keyToValue(value);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
559
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
560 int i = 0;
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
561 string key = Format("download_{}_", i);
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
562 while (settings.contains(key ~ "url")) {
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
563 QUrl url = settings.value(key ~ "url").toUrl();
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
564 string fileName = settings.value(key ~ "location").toString();
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
565 bool done = settings.value(key ~ "done", true).toBool();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
566 if (!url.isEmpty() && !fileName.isEmpty()) {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
567 DownloadItem item = new DownloadItem(0, this);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
568 item.m_output.setFileName(fileName);
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
569 item.fileNameLabel.setText((new QFileInfo(item.m_output.fileName())).fileName());
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
570 item.m_url = url;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
571 item.stopButton.setVisible(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
572 item.stopButton.setEnabled(false);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
573 item.tryAgainButton.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
574 item.tryAgainButton.setEnabled(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
575 item.progressBar.setVisible(!done);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
576 addItem(item);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
577 }
80
85c59c4e5f19 remove QLatin1String and other fixes
mandel
parents: 77
diff changeset
578 key = Format("download_{}_", ++i);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
579 }
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
580 cleanupButton.setEnabled(m_downloads.length - activeDownloads() > 0);
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
581 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
582
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
583 AutoSaver m_autoSaver;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
584 DownloadModel m_model;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
585 QNetworkAccessManager m_manager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
586 QFileIconProvider m_iconProvider;
74
37caa90ce503 more porting
mandel
parents: 73
diff changeset
587 DownloadItem[] m_downloads;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
588 RemovePolicy m_removePolicy;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
589 }
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
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
592 class DownloadModel : public QAbstractListModel
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
593 {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
594
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
595 public:
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
596
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
597 this(DownloadManager downloadManager, QObject parent = null)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
598 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
599 super(parent);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
600 m_downloadManager = downloadManager;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
601 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
602
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
603 QVariant data(QModelIndex index, int role = Qt.DisplayRole)
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
604 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
605 if (index.row() < 0 || index.row() >= rowCount(index.parent()))
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
606 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
607 if (role == Qt.ToolTipRole)
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
608 if (!m_downloadManager.m_downloads[index.row()].downloadedSuccessfully())
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
609 return m_downloadManager.m_downloads[index.row()].downloadInfoLabel.text();
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
610 return QVariant();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
611 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
612
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
613 int rowCount(QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
614 {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
615 return (parent.isValid()) ? 0 : m_downloadManager.m_downloads.length;
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
616 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
617
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
618 bool removeRows(int row, int count, QModelIndex parent = QModelIndex())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
619 {
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
620 if (parent.isValid())
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
621 return false;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
622
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
623 int lastRow = row + count - 1;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
624 for (int i = lastRow; i >= row; --i) {
77
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
625 if (m_downloadManager.m_downloads[i].downloadedSuccessfully()
0654fc9bac95 more porting
mandel
parents: 74
diff changeset
626 || m_downloadManager.m_downloads[i].tryAgainButton.isEnabled()) {
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
627 beginRemoveRows(parent, i, i);
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
628 m_downloadManager.m_downloads.takeAt(i).deleteLater();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
629 endRemoveRows();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
630 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
631 }
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
632 m_downloadManager.m_autoSaver.changeOccurred();
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
633 return true;
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
634 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
635
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
636 private:
73
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
637
7bfd46c330dc more porting
mandel
parents: 46
diff changeset
638 DownloadManager m_downloadManager;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
639 }