6 """ |
6 """ |
7 Module implementing a widget controlling a download. |
7 Module implementing a widget controlling a download. |
8 """ |
8 """ |
9 |
9 |
10 from PyQt4.QtCore import pyqtSlot, pyqtSignal, Qt, QTime, QFile, QFileInfo, QUrl, \ |
10 from PyQt4.QtCore import pyqtSlot, pyqtSignal, Qt, QTime, QFile, QFileInfo, QUrl, \ |
11 QIODevice |
11 QIODevice, QCryptographicHash |
12 from PyQt4.QtGui import QWidget, QPalette, QStyle, QDesktopServices, QDialog |
12 from PyQt4.QtGui import QWidget, QPalette, QStyle, QDesktopServices, QDialog |
13 from PyQt4.QtNetwork import QNetworkRequest, QNetworkReply |
13 from PyQt4.QtNetwork import QNetworkRequest, QNetworkReply |
14 |
14 |
15 from E5Gui import E5FileDialog |
15 from E5Gui import E5FileDialog |
16 |
16 |
87 self.__finishedDownloading = False |
87 self.__finishedDownloading = False |
88 self.__gettingFileName = False |
88 self.__gettingFileName = False |
89 self.__canceledFileSelect = False |
89 self.__canceledFileSelect = False |
90 self.__autoOpen = False |
90 self.__autoOpen = False |
91 |
91 |
|
92 self.__sha1Hash = QCryptographicHash(QCryptographicHash.Sha1) |
|
93 self.__md5Hash = QCryptographicHash(QCryptographicHash.Md5) |
|
94 |
92 if not requestFilename: |
95 if not requestFilename: |
93 self.__requestFilename = Preferences.getUI("RequestDownloadFilename") |
96 self.__requestFilename = Preferences.getUI("RequestDownloadFilename") |
94 |
97 |
95 self.__initialize() |
98 self.__initialize() |
96 |
99 |
106 self.__startedSaving = False |
109 self.__startedSaving = False |
107 self.__finishedDownloading = False |
110 self.__finishedDownloading = False |
108 self.__bytesReceived = 0 |
111 self.__bytesReceived = 0 |
109 self.__bytesTotal = -1 |
112 self.__bytesTotal = -1 |
110 |
113 |
111 ## self.openButton.setEnabled(False) |
114 self.__sha1Hash.reset() |
112 ## self.openButton.setVisible(False) |
115 self.__md5Hash.reset() |
113 ## |
116 |
114 # start timer for the download estimation |
117 # start timer for the download estimation |
115 self.__downloadTime.start() |
118 self.__downloadTime.start() |
116 |
119 |
117 # attach to the reply object |
120 # attach to the reply object |
118 self.__url = self.__reply.url() |
121 self.__url = self.__reply.url() |
259 origName += '.' + endName |
262 origName += '.' + endName |
260 |
263 |
261 name = directory + baseName |
264 name = directory + baseName |
262 if endName: |
265 if endName: |
263 name += '.' + endName |
266 name += '.' + endName |
264 ## i = 1 |
267 if not self.__requestFilename: |
265 ## while QFile.exists(name): |
268 # do not overwrite, if the user is not being asked |
266 ## # file exists already, don't overwrite |
269 i = 1 |
267 ## name = directory + baseName + ('-{0:d}'.format(i)) |
270 while QFile.exists(name): |
268 ## if endName: |
271 # file exists already, don't overwrite |
269 ## name += '.' + endName |
272 name = directory + baseName + ('-{0:d}'.format(i)) |
270 ## i += 1 |
273 if endName: |
|
274 name += '.' + endName |
|
275 i += 1 |
271 return name, origName |
276 return name, origName |
272 |
277 |
273 def __open(self): |
278 def __open(self): |
274 """ |
279 """ |
275 Private slot to open the downloaded file. |
280 Private slot to open the downloaded file. |
392 self.on_stopButton_clicked() |
397 self.on_stopButton_clicked() |
393 self.statusChanged.emit() |
398 self.statusChanged.emit() |
394 return |
399 return |
395 self.statusChanged.emit() |
400 self.statusChanged.emit() |
396 |
401 |
397 bytesWritten = self.__output.write(self.__reply.readAll()) |
402 buffer = self.__reply.readAll() |
|
403 self.__sha1Hash.addData(buffer) |
|
404 self.__md5Hash.addData(buffer) |
|
405 bytesWritten = self.__output.write(buffer) |
398 if bytesWritten == -1: |
406 if bytesWritten == -1: |
399 self.infoLabel.setText(self.trUtf8("Error saving: {0}")\ |
407 self.infoLabel.setText(self.trUtf8("Error saving: {0}")\ |
400 .format(self.__output.errorString())) |
408 .format(self.__output.errorString())) |
401 self.on_stopButton_clicked() |
409 self.on_stopButton_clicked() |
402 else: |
410 else: |
514 remaining = "" |
522 remaining = "" |
515 |
523 |
516 if bytesTotal > 0: |
524 if bytesTotal > 0: |
517 remaining = timeString(timeRemaining) |
525 remaining = timeString(timeRemaining) |
518 |
526 |
519 info = self.trUtf8("{0} of {1} ({2}/sec) - {3}")\ |
527 info = self.trUtf8("{0} of {1} ({2}/sec)\n{3}")\ |
520 .format( |
528 .format( |
521 dataString(self.__bytesReceived), |
529 dataString(self.__bytesReceived), |
522 bytesTotal == -1 and self.trUtf8("?") \ |
530 bytesTotal == -1 and self.trUtf8("?") \ |
523 or dataString(bytesTotal), |
531 or dataString(bytesTotal), |
524 dataString(int(speed)), |
532 dataString(int(speed)), |
525 remaining) |
533 remaining) |
526 else: |
534 else: |
527 if self.__bytesReceived == bytesTotal or bytesTotal == -1: |
535 if self.__bytesReceived == bytesTotal or bytesTotal == -1: |
528 info = self.trUtf8("{0} downloaded")\ |
536 info = self.trUtf8("{0} downloaded\nSHA1: {1}\nMD5: {2}")\ |
529 .format(dataString(self.__output.size())) |
537 .format(dataString(self.__output.size()), |
|
538 str(self.__sha1Hash.result().toHex(), encoding = "ascii"), |
|
539 str(self.__md5Hash.result().toHex(), encoding = "ascii")) |
530 else: |
540 else: |
531 info = self.trUtf8("{0} of {1} - Stopped")\ |
541 info = self.trUtf8("{0} of {1} - Stopped")\ |
532 .format(dataString(self.__bytesReceived), |
542 .format(dataString(self.__bytesReceived), |
533 dataString(bytesTotal)) |
543 dataString(bytesTotal)) |
534 self.infoLabel.setText(info) |
544 self.infoLabel.setText(info) |