61 |
61 |
62 self.tryAgainButton.setIcon(UI.PixmapCache.getIcon("restart.png")) |
62 self.tryAgainButton.setIcon(UI.PixmapCache.getIcon("restart.png")) |
63 self.tryAgainButton.setEnabled(False) |
63 self.tryAgainButton.setEnabled(False) |
64 self.tryAgainButton.setVisible(False) |
64 self.tryAgainButton.setVisible(False) |
65 self.stopButton.setIcon(UI.PixmapCache.getIcon("stopLoading.png")) |
65 self.stopButton.setIcon(UI.PixmapCache.getIcon("stopLoading.png")) |
|
66 self.pauseButton.setIcon(UI.PixmapCache.getIcon("pause.png")) |
66 self.openButton.setIcon(UI.PixmapCache.getIcon("open.png")) |
67 self.openButton.setIcon(UI.PixmapCache.getIcon("open.png")) |
67 self.openButton.setEnabled(False) |
68 self.openButton.setEnabled(False) |
68 self.openButton.setVisible(False) |
69 self.openButton.setVisible(False) |
69 |
70 |
70 icon = self.style().standardIcon(QStyle.SP_FileIcon) |
71 icon = self.style().standardIcon(QStyle.SP_FileIcon) |
79 self.__bytesReceived = 0 |
80 self.__bytesReceived = 0 |
80 self.__bytesTotal = -1 |
81 self.__bytesTotal = -1 |
81 self.__downloadTime = QTime() |
82 self.__downloadTime = QTime() |
82 self.__output = QFile() |
83 self.__output = QFile() |
83 self.__fileName = "" |
84 self.__fileName = "" |
|
85 self.__originalFileName = "" |
84 self.__startedSaving = False |
86 self.__startedSaving = False |
85 self.__finishedDownloading = False |
87 self.__finishedDownloading = False |
86 self.__gettingFileName = False |
88 self.__gettingFileName = False |
87 self.__canceledFileSelect = False |
89 self.__canceledFileSelect = False |
88 self.__autoOpen = False |
90 self.__autoOpen = False |
104 self.__startedSaving = False |
106 self.__startedSaving = False |
105 self.__finishedDownloading = False |
107 self.__finishedDownloading = False |
106 self.__bytesReceived = 0 |
108 self.__bytesReceived = 0 |
107 self.__bytesTotal = -1 |
109 self.__bytesTotal = -1 |
108 |
110 |
109 self.openButton.setEnabled(False) |
111 ## self.openButton.setEnabled(False) |
110 self.openButton.setVisible(False) |
112 ## self.openButton.setVisible(False) |
111 |
113 ## |
112 # start timer for the download estimation |
114 # start timer for the download estimation |
113 self.__downloadTime.start() |
115 self.__downloadTime.start() |
114 |
116 |
115 # attach to the reply object |
117 # attach to the reply object |
116 self.__url = self.__reply.url() |
118 self.__url = self.__reply.url() |
117 self.__reply.setParent(self) |
119 self.__reply.setParent(self) |
|
120 self.__reply.setReadBufferSize(0) |
118 self.__reply.readyRead[()].connect(self.__readyRead) |
121 self.__reply.readyRead[()].connect(self.__readyRead) |
119 self.__reply.error.connect(self.__networkError) |
122 self.__reply.error.connect(self.__networkError) |
120 self.__reply.downloadProgress.connect(self.__downloadProgress) |
123 self.__reply.downloadProgress.connect(self.__downloadProgress) |
121 self.__reply.metaDataChanged.connect(self.__metaDataChanged) |
124 self.__reply.metaDataChanged.connect(self.__metaDataChanged) |
122 self.__reply.finished[()].connect(self.__finished) |
125 self.__reply.finished[()].connect(self.__finished) |
142 downloadDirectory = Helpviewer.HelpWindow.HelpWindow\ |
145 downloadDirectory = Helpviewer.HelpWindow.HelpWindow\ |
143 .downloadManager().downloadDirectory() |
146 .downloadManager().downloadDirectory() |
144 |
147 |
145 if self.__fileName: |
148 if self.__fileName: |
146 fileName = self.__fileName |
149 fileName = self.__fileName |
|
150 originalFileName = self.__originalFileName |
147 self.__toDownload = True |
151 self.__toDownload = True |
148 ask = False |
152 ask = False |
149 else: |
153 else: |
150 defaultFileName = self.__saveFileName(downloadDirectory) |
154 defaultFileName, originalFileName = self.__saveFileName(downloadDirectory) |
151 fileName = defaultFileName |
155 fileName = defaultFileName |
|
156 self.__originalFileName = originalFileName |
152 ask = True |
157 ask = True |
153 self.__autoOpen = False |
158 self.__autoOpen = False |
154 if not self.__toDownload: |
159 if not self.__toDownload: |
155 url = self.__reply.url() |
160 url = self.__reply.url() |
156 dlg = DownloadAskActionDialog( |
161 dlg = DownloadAskActionDialog( |
157 QFileInfo(fileName).fileName(), |
162 QFileInfo(originalFileName).fileName(), |
158 self.__reply.header(QNetworkRequest.ContentTypeHeader), |
163 self.__reply.header(QNetworkRequest.ContentTypeHeader), |
159 "{0}://{1}".format(url.scheme(), url.authority()), |
164 "{0}://{1}".format(url.scheme(), url.authority()), |
160 self) |
165 self) |
161 if dlg.exec_() == QDialog.Rejected or dlg.getAction() == "cancel": |
166 if dlg.exec_() == QDialog.Rejected or dlg.getAction() == "cancel": |
162 self.progressBar.setVisible(False) |
167 self.progressBar.setVisible(False) |
203 fileInfo = QFileInfo(fileName) |
208 fileInfo = QFileInfo(fileName) |
204 Helpviewer.HelpWindow.HelpWindow.downloadManager().setDownloadDirectory( |
209 Helpviewer.HelpWindow.HelpWindow.downloadManager().setDownloadDirectory( |
205 fileInfo.absoluteDir().absolutePath()) |
210 fileInfo.absoluteDir().absolutePath()) |
206 self.filenameLabel.setText(fileInfo.fileName()) |
211 self.filenameLabel.setText(fileInfo.fileName()) |
207 |
212 |
208 self.__output.setFileName(fileName) |
213 self.__output.setFileName(fileName + ".part") |
209 self.__fileName = fileName |
214 self.__fileName = fileName |
210 |
215 |
211 # check file path for saving |
216 # check file path for saving |
212 saveDirPath = QFileInfo(self.__fileName).dir() |
217 saveDirPath = QFileInfo(self.__fileName).dir() |
213 if not saveDirPath.exists(): |
218 if not saveDirPath.exists(): |
226 def __saveFileName(self, directory): |
231 def __saveFileName(self, directory): |
227 """ |
232 """ |
228 Private method to calculate a name for the file to download. |
233 Private method to calculate a name for the file to download. |
229 |
234 |
230 @param directory name of the directory to store the file into (string) |
235 @param directory name of the directory to store the file into (string) |
231 @return proposed filename (string) |
236 @return proposed filename and original filename (string, string) |
232 """ |
237 """ |
233 path = "" |
238 path = "" |
234 if self.__reply.hasRawHeader("Content-Disposition"): |
239 if self.__reply.hasRawHeader("Content-Disposition"): |
235 header = bytes(self.__reply.rawHeader("Content-Disposition")).decode() |
240 header = bytes(self.__reply.rawHeader("Content-Disposition")).decode() |
236 if header: |
241 if header: |
247 endName = info.suffix() |
252 endName = info.suffix() |
248 |
253 |
249 if not baseName: |
254 if not baseName: |
250 baseName = "unnamed_download" |
255 baseName = "unnamed_download" |
251 |
256 |
|
257 origName = baseName |
|
258 if endName: |
|
259 origName += '.' + endName |
|
260 |
252 name = directory + baseName |
261 name = directory + baseName |
253 if endName: |
262 if endName: |
254 name += '.' + endName |
263 name += '.' + endName |
255 i = 1 |
264 ## i = 1 |
256 while QFile.exists(name): |
265 ## while QFile.exists(name): |
257 # file exists already, don't overwrite |
266 ## # file exists already, don't overwrite |
258 name = directory + baseName + ('-{0:d}'.format(i)) |
267 ## name = directory + baseName + ('-{0:d}'.format(i)) |
259 if endName: |
268 ## if endName: |
260 name += '.' + endName |
269 ## name += '.' + endName |
261 i += 1 |
270 ## i += 1 |
262 return name |
271 return name, origName |
263 |
272 |
264 def __open(self): |
273 def __open(self): |
265 """ |
274 """ |
266 Private slot to open the downloaded file. |
275 Private slot to open the downloaded file. |
267 """ |
276 """ |
287 self.tryAgainButton.setVisible(False) |
296 self.tryAgainButton.setVisible(False) |
288 self.openButton.setEnabled(False) |
297 self.openButton.setEnabled(False) |
289 self.openButton.setVisible(False) |
298 self.openButton.setVisible(False) |
290 self.stopButton.setEnabled(True) |
299 self.stopButton.setEnabled(True) |
291 self.stopButton.setVisible(True) |
300 self.stopButton.setVisible(True) |
|
301 self.pauseButton.setEnabled(True) |
|
302 self.pauseButton.setVisible(True) |
292 self.progressBar.setVisible(True) |
303 self.progressBar.setVisible(True) |
293 |
304 |
294 if self.__page: |
305 if self.__page: |
295 nam = self.__page.networkAccessManager() |
306 nam = self.__page.networkAccessManager() |
296 else: |
307 else: |
301 self.__output = QFile() |
312 self.__output = QFile() |
302 self.__reply = reply |
313 self.__reply = reply |
303 self.__initialize(tryAgain=True) |
314 self.__initialize(tryAgain=True) |
304 self.statusChanged.emit() |
315 self.statusChanged.emit() |
305 |
316 |
|
317 @pyqtSlot(bool) |
|
318 def on_pauseButton_clicked(self, checked): |
|
319 """ |
|
320 Private slot to pause the download. |
|
321 |
|
322 @param checked flag indicating the state of the button (boolean) |
|
323 """ |
|
324 if checked: |
|
325 self.__reply.readyRead[()].disconnect(self.__readyRead) |
|
326 self.__reply.setReadBufferSize(16 * 1024) |
|
327 else: |
|
328 self.__reply.readyRead[()].connect(self.__readyRead) |
|
329 self.__reply.setReadBufferSize(0) |
|
330 |
306 @pyqtSlot() |
331 @pyqtSlot() |
307 def on_stopButton_clicked(self): |
332 def on_stopButton_clicked(self): |
308 """ |
333 """ |
309 Private slot to stop the download. |
334 Private slot to stop the download. |
310 """ |
335 """ |
315 Public slot to stop the download. |
340 Public slot to stop the download. |
316 """ |
341 """ |
317 self.setUpdatesEnabled(False) |
342 self.setUpdatesEnabled(False) |
318 self.stopButton.setEnabled(False) |
343 self.stopButton.setEnabled(False) |
319 self.stopButton.setVisible(False) |
344 self.stopButton.setVisible(False) |
|
345 self.pauseButton.setEnabled(False) |
|
346 self.pauseButton.setVisible(False) |
320 self.tryAgainButton.setEnabled(True) |
347 self.tryAgainButton.setEnabled(True) |
321 self.tryAgainButton.setVisible(True) |
348 self.tryAgainButton.setVisible(True) |
322 self.openButton.setEnabled(False) |
349 self.openButton.setEnabled(False) |
323 self.openButton.setVisible(False) |
350 self.openButton.setVisible(False) |
324 self.setUpdatesEnabled(True) |
351 self.setUpdatesEnabled(True) |
541 noError = self.__reply.error() == QNetworkReply.NoError |
568 noError = self.__reply.error() == QNetworkReply.NoError |
542 |
569 |
543 self.progressBar.setVisible(False) |
570 self.progressBar.setVisible(False) |
544 self.stopButton.setEnabled(False) |
571 self.stopButton.setEnabled(False) |
545 self.stopButton.setVisible(False) |
572 self.stopButton.setVisible(False) |
|
573 self.pauseButton.setEnabled(False) |
|
574 self.pauseButton.setVisible(False) |
546 self.openButton.setEnabled(noError) |
575 self.openButton.setEnabled(noError) |
547 self.openButton.setVisible(noError) |
576 self.openButton.setVisible(noError) |
548 self.__output.close() |
577 self.__output.close() |
|
578 if QFile.exists(self.__fileName): |
|
579 QFile.remove(self.__fileName) |
|
580 self.__output.rename(self.__fileName) |
549 self.__updateInfoLabel() |
581 self.__updateInfoLabel() |
550 self.statusChanged.emit() |
582 self.statusChanged.emit() |
551 self.downloadFinished.emit() |
583 self.downloadFinished.emit() |
552 |
584 |
553 if self.__autoOpen: |
585 if self.__autoOpen: |
609 self.filenameLabel.setText(QFileInfo(self.__fileName).fileName()) |
641 self.filenameLabel.setText(QFileInfo(self.__fileName).fileName()) |
610 self.infoLabel.setText(self.__fileName) |
642 self.infoLabel.setText(self.__fileName) |
611 |
643 |
612 self.stopButton.setEnabled(False) |
644 self.stopButton.setEnabled(False) |
613 self.stopButton.setVisible(False) |
645 self.stopButton.setVisible(False) |
|
646 self.pauseButton.setEnabled(False) |
|
647 self.pauseButton.setVisible(False) |
614 self.openButton.setEnabled(data[2]) |
648 self.openButton.setEnabled(data[2]) |
615 self.openButton.setVisible(data[2]) |
649 self.openButton.setVisible(data[2]) |
616 self.tryAgainButton.setEnabled(not data[2]) |
650 self.tryAgainButton.setEnabled(not data[2]) |
617 self.tryAgainButton.setVisible(not data[2]) |
651 self.tryAgainButton.setVisible(not data[2]) |
618 self.progressBar.setVisible(False) |
652 self.progressBar.setVisible(False) |