Addon Manager: Fix signals in connection check

This commit is contained in:
Chris Hennes
2024-02-08 11:48:42 -06:00
committed by Chris Hennes
parent dfbc90d351
commit c8d33261f8
2 changed files with 51 additions and 23 deletions

View File

@@ -45,8 +45,7 @@ class ConnectionCheckerGUI(QtCore.QObject):
# Check the connection in a new thread, so FreeCAD stays responsive
self.connection_checker = ConnectionChecker()
self.connection_checker.success.connect(self._check_succeeded)
self.connection_checker.failure.connect(self._network_connection_failed)
self.signals_connected = False
self.connection_message_timer = None
self.connection_check_message = None
@@ -54,6 +53,9 @@ class ConnectionCheckerGUI(QtCore.QObject):
def start(self):
"""Start the connection check"""
self.connection_checker.start()
self.connection_checker.success.connect(self._check_succeeded)
self.connection_checker.failure.connect(self._network_connection_failed)
self.signals_connected = True
# If it takes longer than a half second to check the connection, show a message:
self.connection_message_timer = QtCore.QTimer.singleShot(
@@ -75,8 +77,7 @@ class ConnectionCheckerGUI(QtCore.QObject):
def cancel_network_check(self, _):
"""Cancel the check"""
if not self.connection_checker.isFinished():
self.connection_checker.success.disconnect(self._check_succeeded)
self.connection_checker.failure.disconnect(self._network_connection_failed)
self._disconnect_signals()
self.connection_checker.requestInterruption()
self.connection_checker.wait(500)
self.connection_check_message.close()
@@ -99,10 +100,12 @@ class ConnectionCheckerGUI(QtCore.QObject):
translate("AddonsInstaller", "Missing dependency"),
translate(
"AddonsInstaller",
"Could not import QtNetwork -- see Report View for details. Addon Manager unavailable.",
"Could not import QtNetwork -- see Report View for details. Addon Manager "
"unavailable.",
),
)
self._disconnect_signals()
self.check_complete.emit()
def _check_succeeded(self):
@@ -112,4 +115,11 @@ class ConnectionCheckerGUI(QtCore.QObject):
self.connection_check_message.close()
self.connection_available.emit()
self._disconnect_signals()
self.check_complete.emit()
def _disconnect_signals(self):
if self.signals_connected:
self.connection_checker.success.disconnect(self._check_succeeded)
self.connection_checker.failure.disconnect(self._network_connection_failed)
self.signals_connected = False

View File

@@ -27,7 +27,8 @@ from typing import Optional
import FreeCAD
from PySide import QtCore
import addonmanager_utilities as utils
import NetworkManager
import time
translate = FreeCAD.Qt.translate
@@ -42,32 +43,49 @@ class ConnectionChecker(QtCore.QThread):
def __init__(self):
QtCore.QThread.__init__(self)
self.done = False
self.request_id = 0
self.data = None
def run(self):
"""Not generally called directly: create a new ConnectionChecker object and
call start() on it to spawn a child thread."""
"""Not generally called directly: create a new ConnectionChecker object and call start()
on it to spawn a child thread."""
FreeCAD.Console.PrintLog("Checking network connection...\n")
result = self.check_network_connection()
if QtCore.QThread.currentThread().isInterruptionRequested():
FreeCAD.Console.PrintLog("Connection check cancelled\n")
return
if not result:
url = "https://api.github.com/zen"
self.done = False
NetworkManager.AM_NETWORK_MANAGER.completed.connect(self.connection_data_received)
self.request_id = NetworkManager.AM_NETWORK_MANAGER.submit_unmonitored_get(url)
while not self.done:
if QtCore.QThread.currentThread().isInterruptionRequested():
FreeCAD.Console.PrintLog("Connection check cancelled\n")
NetworkManager.AM_NETWORK_MANAGER.abort(self.request_id)
self.disconnect_network_manager()
return
QtCore.QCoreApplication.processEvents()
time.sleep(0.1)
if not self.data:
self.failure.emit(
translate(
"AddonsInstaller",
"Unable to read data from GitHub: check your internet connection and proxy settings and try again.",
"Unable to read data from GitHub: check your internet connection and proxy "
"settings and try again.",
)
)
self.disconnect_network_manager()
return
FreeCAD.Console.PrintLog(f"GitHub's zen message response: {result}\n")
FreeCAD.Console.PrintLog(f"GitHub's zen message response: {self.data.decode}\n")
self.disconnect_network_manager()
self.success.emit()
def check_network_connection(self) -> Optional[str]:
"""The main work of this object: returns the decoded result of the connection request, or
None if the request failed"""
url = "https://api.github.com/zen"
result = utils.blocking_get(url)
if result:
return result.decode("utf8")
return None
def connection_data_received(self, id: int, status: int, data: QtCore.QByteArray):
if self.request_id and self.request_id == id:
if status == 200:
self.data = data
else:
FreeCAD.Console.PrintWarning(f"No data received: status returned was {status}\n")
self.data = None
self.done = True
def disconnect_network_manager(self):
NetworkManager.AM_NETWORK_MANAGER.completed.disconnect(self.connection_data_received)