Helpviewer/Download/DownloadItem.py

changeset 1094
743900906d8e
parent 978
11f8adbcac97
child 1101
43da69edffc4
equal deleted inserted replaced
1093:47bc4ef30315 1094:743900906d8e
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)

eric ide

mercurial