diff --git a/cura/API/ConnectionStatus.py b/cura/API/ConnectionStatus.py index 007f03fdd1..2e73639b45 100644 --- a/cura/API/ConnectionStatus.py +++ b/cura/API/ConnectionStatus.py @@ -1,22 +1,16 @@ from typing import Optional -from PyQt5.QtCore import QObject, pyqtSignal, QTimer, pyqtProperty -from PyQt5.QtNetwork import QNetworkReply +from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty -from UM.TaskManagement.HttpRequestManager import HttpRequestManager -from cura.UltimakerCloud import UltimakerCloudConstants +from UM.Logger import Logger class ConnectionStatus(QObject): """Status info for some web services""" - UPDATE_INTERVAL = 10.0 # seconds - ULTIMAKER_CLOUD_STATUS_URL = UltimakerCloudConstants.CuraCloudAPIRoot + "/connect/v1/" - __instance = None # type: Optional[ConnectionStatus] internetReachableChanged = pyqtSignal() - umCloudReachableChanged = pyqtSignal() @classmethod def getInstance(cls, *args, **kwargs) -> "ConnectionStatus": @@ -27,38 +21,16 @@ class ConnectionStatus(QObject): def __init__(self, parent: Optional["QObject"] = None): super().__init__(parent) - self._http = HttpRequestManager.getInstance() - self._statuses = { - self.ULTIMAKER_CLOUD_STATUS_URL: True, - "http://example.com": True - } + self._is_internet_reachable: bool = True - # Create a timer for automatic updates - self._update_timer = QTimer() - self._update_timer.setInterval(int(self.UPDATE_INTERVAL * 1000)) - # The timer is restarted automatically - self._update_timer.setSingleShot(False) - self._update_timer.timeout.connect(self._update) - self._update_timer.start() - - @pyqtProperty(bool, notify=internetReachableChanged) + @pyqtProperty(bool, notify = internetReachableChanged) def isInternetReachable(self) -> bool: - # Is any of the test urls reachable? - return any(self._statuses.values()) + return self._is_internet_reachable - def _update(self): - for url in self._statuses.keys(): - self._http.get( - url = url, - callback = self._statusCallback, - error_callback = self._statusCallback, - timeout = 5 - ) - - def _statusCallback(self, reply: QNetworkReply, error: QNetworkReply.NetworkError = None): - url = reply.request().url().toString() - prev_statuses = self._statuses.copy() - self._statuses[url] = HttpRequestManager.replyIndicatesSuccess(reply, error) - - if any(self._statuses.values()) != any(prev_statuses.values()): + def setOnlineStatus(self, new_status: bool): + old_status = self._is_internet_reachable + self._is_internet_reachable = new_status + if old_status != new_status: + Logger.debug( + "Connection status has been set to {}".format("online" if self._is_internet_reachable else "offline")) self.internetReachableChanged.emit() diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 33c9caba05..852af0de4c 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -104,8 +104,10 @@ class CloudOutputDeviceManager: self._api.getClusters(self._onGetRemoteClustersFinished, self._onGetRemoteClusterFailed) def _onGetRemoteClustersFinished(self, clusters: List[CloudClusterResponse]) -> None: - """Callback for when the request for getting the clusters is finished.""" + """Callback for when the request for getting the clusters is successful and finished.""" + # Remote clusters were successfully retrieved, which means that the computer is online + CuraApplication.getInstance().getCuraAPI().connectionStatus.setOnlineStatus(True) self._um_cloud_printers = {m.getMetaDataEntry(self.META_CLUSTER_ID): m for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks( type = "machine") if m.getMetaDataEntry(self.META_CLUSTER_ID, None)} @@ -150,6 +152,9 @@ class CloudOutputDeviceManager: def _onGetRemoteClusterFailed(self, reply: QNetworkReply, error: QNetworkReply.NetworkError) -> None: self._syncing = False self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.ERROR) + # If getting the remote clusters fails, then the cloud printers are unreachable, so we need to inform the + # connection status + CuraApplication.getInstance().getCuraAPI().connectionStatus.setOnlineStatus(False) def _onDevicesDiscovered(self, clusters: List[CloudClusterResponse]) -> None: """**Synchronously** create machines for discovered devices