Added handling for timeout & network connection broken

CURA-3856
This commit is contained in:
Jaime van Kessel 2017-06-30 15:19:53 +02:00
parent 782dea040a
commit 5d0908e8ce

View file

@ -8,7 +8,7 @@ from UM.PluginRegistry import PluginRegistry
from UM.Application import Application from UM.Application import Application
from UM.Version import Version from UM.Version import Version
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot
from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtQml import QQmlComponent, QQmlContext
@ -94,10 +94,7 @@ class PluginBrowser(QObject, Extension):
def _onDownloadPluginProgress(self, bytes_sent, bytes_total): def _onDownloadPluginProgress(self, bytes_sent, bytes_total):
if bytes_total > 0: if bytes_total > 0:
new_progress = bytes_sent / bytes_total * 100 new_progress = bytes_sent / bytes_total * 100
if new_progress > self._download_progress: self.setDownloadProgress(new_progress)
self._download_progress = new_progress
self.onDownloadProgressChanged.emit()
self._download_progress = new_progress
if new_progress == 100.0: if new_progress == 100.0:
self.setIsDownloading(False) self.setIsDownloading(False)
self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress) self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress)
@ -117,6 +114,11 @@ class PluginBrowser(QObject, Extension):
def downloadProgress(self): def downloadProgress(self):
return self._download_progress return self._download_progress
def setDownloadProgress(self, progress):
if progress != self._download_progress:
self._download_progress = progress
self.onDownloadProgressChanged.emit()
@pyqtSlot(str) @pyqtSlot(str)
def downloadAndInstallPlugin(self, url): def downloadAndInstallPlugin(self, url):
Logger.log("i", "Attempting to download & install plugin from %s", url) Logger.log("i", "Attempting to download & install plugin from %s", url)
@ -124,9 +126,8 @@ class PluginBrowser(QObject, Extension):
self._download_plugin_request = QNetworkRequest(url) self._download_plugin_request = QNetworkRequest(url)
self._download_plugin_request.setRawHeader(*self._request_header) self._download_plugin_request.setRawHeader(*self._request_header)
self._download_plugin_reply = self._network_manager.get(self._download_plugin_request) self._download_plugin_reply = self._network_manager.get(self._download_plugin_request)
self._download_progress = 0 self.setDownloadProgress(0)
self.setIsDownloading(True) self.setIsDownloading(True)
self.onDownloadProgressChanged.emit()
self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress) self._download_plugin_reply.downloadProgress.connect(self._onDownloadPluginProgress)
@pyqtProperty(QObject, notify=pluginsMetadataChanged) @pyqtProperty(QObject, notify=pluginsMetadataChanged)
@ -180,6 +181,16 @@ class PluginBrowser(QObject, Extension):
def _onRequestFinished(self, reply): def _onRequestFinished(self, reply):
reply_url = reply.url().toString() reply_url = reply.url().toString()
if reply.error() == QNetworkReply.TimeoutError:
Logger.log("w", "Got a timeout.")
# Reset everything.
self.setDownloadProgress(0)
self.setIsDownloading(False)
if self._download_plugin_reply:
self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress)
self._download_plugin_reply.abort()
self._download_plugin_reply = None
if reply.operation() == QNetworkAccessManager.GetOperation: if reply.operation() == QNetworkAccessManager.GetOperation:
if reply_url == self._api_url + "plugins": if reply_url == self._api_url + "plugins":
try: try:
@ -193,9 +204,20 @@ class PluginBrowser(QObject, Extension):
# Ignore any operation that is not a get operation # Ignore any operation that is not a get operation
pass pass
def _onNetworkAccesibleChanged(self, accessible):
if accessible == 0:
self.setDownloadProgress(0)
self.setIsDownloading(False)
if self._download_plugin_reply:
self._download_plugin_reply.downloadProgress.disconnect(self._onDownloadPluginProgress)
self._download_plugin_reply.abort()
self._download_plugin_reply = None
def _createNetworkManager(self): def _createNetworkManager(self):
if self._network_manager: if self._network_manager:
self._network_manager.finished.disconnect(self._onRequestFinished) self._network_manager.finished.disconnect(self._onRequestFinished)
self._network_manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged)
self._network_manager = QNetworkAccessManager() self._network_manager = QNetworkAccessManager()
self._network_manager.finished.connect(self._onRequestFinished) self._network_manager.finished.connect(self._onRequestFinished)
self._network_manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged)