NetworkedPrinterOutputDevice.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from UM.Application import Application
  2. from UM.Logger import Logger
  3. from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState
  4. from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply
  5. from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl
  6. from time import time
  7. from typing import Callable
  8. class NetworkedPrinterOutputDevice(PrinterOutputDevice):
  9. def __init__(self, device_id, address: str, properties, parent = None):
  10. super().__init__(device_id = device_id, parent = parent)
  11. self._manager = None
  12. self._createNetworkManager()
  13. self._last_response_time = time()
  14. self._last_request_time = None
  15. self._api_prefix = ""
  16. self._address = address
  17. self._properties = properties
  18. self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion())
  19. self._onFinishedCallbacks = {}
  20. def _update(self):
  21. if not self._manager.networkAccessible():
  22. pass # TODO: no internet connection.
  23. pass
  24. def _createEmptyRequest(self, target):
  25. url = QUrl("http://" + self._address + self._api_prefix + target)
  26. print(url)
  27. request = QNetworkRequest(url)
  28. request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json")
  29. request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent)
  30. return request
  31. def _put(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None]):
  32. request = self._createEmptyRequest(target)
  33. reply = self._manager.put(request, data.encode())
  34. self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
  35. def _get(self, target: str, onFinished: Callable[[QNetworkReply], None]):
  36. request = self._createEmptyRequest(target)
  37. reply = self._manager.get(request)
  38. self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished
  39. def _delete(self, target: str, onFinished: Callable[[QNetworkReply], None]):
  40. pass
  41. def _post(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None], onProgress: Callable):
  42. pass
  43. def _createNetworkManager(self):
  44. if self._manager:
  45. self._manager.finished.disconnect(self.__handleOnFinished)
  46. #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged)
  47. #self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired)
  48. self._manager = QNetworkAccessManager()
  49. self._manager.finished.connect(self.__handleOnFinished)
  50. #self._manager.authenticationRequired.connect(self._onAuthenticationRequired)
  51. #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes
  52. def __handleOnFinished(self, reply: QNetworkReply):
  53. self._last_response_time = time()
  54. # TODO: Check if the message is actually correct
  55. self.setConnectionState(ConnectionState.connected)
  56. try:
  57. self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply)
  58. except Exception:
  59. Logger.logException("w", "something went wrong with callback")
  60. @pyqtSlot(str, result=str)
  61. def getProperty(self, key):
  62. key = key.encode("utf-8")
  63. if key in self._properties:
  64. return self._properties.get(key, b"").decode("utf-8")
  65. else:
  66. return ""
  67. ## Get the unique key of this machine
  68. # \return key String containing the key of the machine.
  69. @pyqtProperty(str, constant=True)
  70. def key(self):
  71. return self._id
  72. ## The IP address of the printer.
  73. @pyqtProperty(str, constant=True)
  74. def address(self):
  75. return self._properties.get(b"address", b"").decode("utf-8")
  76. ## Name of the printer (as returned from the ZeroConf properties)
  77. @pyqtProperty(str, constant=True)
  78. def name(self):
  79. return self._properties.get(b"name", b"").decode("utf-8")
  80. ## Firmware version (as returned from the ZeroConf properties)
  81. @pyqtProperty(str, constant=True)
  82. def firmwareVersion(self):
  83. return self._properties.get(b"firmware_version", b"").decode("utf-8")
  84. ## IPadress of this printer
  85. @pyqtProperty(str, constant=True)
  86. def ipAddress(self):
  87. return self._address