annotate demos/browser/downloadmanager.d @ 45:71b382c10ef6

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