We now use QT stuff for uploading, as this doesn't mess up the GIL

CURA-49
This commit is contained in:
Jaime van Kessel 2016-04-21 15:57:26 +02:00
parent f9bf54348d
commit c700a684d3

View file

@ -8,8 +8,13 @@ from UM.Logger import Logger
from UM.Message import Message from UM.Message import Message
from .SendGCodeJob import SendGCodeJob
from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState
from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager
from PyQt5.QtCore import QUrl
i18n_catalog = i18nCatalog("cura") i18n_catalog = i18nCatalog("cura")
## Network connected (wifi / lan) printer that uses the Ultimaker API ## Network connected (wifi / lan) printer that uses the Ultimaker API
@ -35,6 +40,19 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
self.setDescription(i18n_catalog.i18nc("@info:tooltip", "Print with WIFI")) self.setDescription(i18n_catalog.i18nc("@info:tooltip", "Print with WIFI"))
self.setIconName("print") self.setIconName("print")
self._manager = QNetworkAccessManager()
self._manager.finished.connect(self._onFinished)
## Hack to ensure that the qt networking stuff isn't garbage collected (unless we want it to)
self._qt_request = None
self._qt_reply = None
self._qt_multi_part = None
self._qt_part = None
#request_qt_get = QNetworkRequest(QUrl("http://10.180.0.53/api/v1/printer"))
#response = self._manager.get(request_qt_get)
self._progress_message = None self._progress_message = None
self._error_message = None self._error_message = None
@ -120,11 +138,34 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
try: try:
self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1) self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1)
self._progress_message.show() self._progress_message.show()
#TODO: Create a job that handles this! (As it currently locks up UI)
result = self._httpPost("print_job", self._file) single_string_file_data = ""
self._progress_message.hide() for line in self._file:
if result.status_code == 200: single_string_file_data += line
pass
## TODO: Use correct file name (we use placeholder now)
file_name = "test.gcode"
## Create multi_part request
self._qt_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType)
## Create part (to be placed inside multipart)
self._qt_part = QHttpPart()
self._qt_part.setHeader(QNetworkRequest.ContentDispositionHeader,
"form-data; name=\"file\"; filename=\"%s\"" % file_name)
self._qt_part.setBody(single_string_file_data)
self._qt_multi_part.append(self._qt_part)
url = "http://" + self._address + self._api_prefix + "print_job"
url_2 = "http://10.180.0.53/api/v1/print_job"
## Create the QT request
self._qt_request = QNetworkRequest(QUrl("http://10.180.0.53/api/v1/print_job"))
## Post request + data
self._qt_reply = self._manager.post(self._qt_request, self._qt_multi_part)
self._qt_reply.uploadProgress.connect(self._onUploadProgress)
except IOError: except IOError:
self._progress_message.hide() self._progress_message.hide()
self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to printer. Is another job still active?")) self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to printer. Is another job still active?"))
@ -133,6 +174,14 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
self._progress_message.hide() self._progress_message.hide()
Logger.log("e" , "An exception occured in wifi connection: %s" % str(e)) Logger.log("e" , "An exception occured in wifi connection: %s" % str(e))
def _onFinished(self, reply):
#print(reply.attribute(QNetworkRequest.HttpStatusCodeAttribute))
reply.uploadProgress.disconnect(self._onUploadProgress)
self._progress_message.hide()
def _onUploadProgress(self, bytes_sent, bytes_total):
self._progress_message.setProgress(bytes_sent / bytes_total * 100)
def _httpGet(self, path): def _httpGet(self, path):
return requests.get("http://" + self._address + self._api_prefix + path) return requests.get("http://" + self._address + self._api_prefix + path)