13 import logging |
13 import logging |
14 |
14 |
15 from PyQt4.QtCore import * |
15 from PyQt4.QtCore import * |
16 from PyQt4.QtGui import * |
16 from PyQt4.QtGui import * |
17 from PyQt4.Qsci import QSCINTILLA_VERSION_STR |
17 from PyQt4.Qsci import QSCINTILLA_VERSION_STR |
18 from PyQt4.QtNetwork import QHttp, QNetworkProxy |
18 from PyQt4.QtNetwork import QNetworkProxyFactory, QNetworkAccessManager, \ |
|
19 QNetworkRequest, QNetworkReply |
19 |
20 |
20 from E5Gui.E5Application import e5App |
21 from E5Gui.E5Application import e5App |
21 |
22 |
22 from Debugger.DebugUI import DebugUI |
23 from Debugger.DebugUI import DebugUI |
23 from Debugger.DebugServer import DebugServer |
24 from Debugger.DebugServer import DebugServer |
94 from E5XML.XMLEntityResolver import XMLEntityResolver |
95 from E5XML.XMLEntityResolver import XMLEntityResolver |
95 from E5XML.TasksHandler import TasksHandler |
96 from E5XML.TasksHandler import TasksHandler |
96 from E5XML.TasksWriter import TasksWriter |
97 from E5XML.TasksWriter import TasksWriter |
97 from E5XML.SessionWriter import SessionWriter |
98 from E5XML.SessionWriter import SessionWriter |
98 from E5XML.SessionHandler import SessionHandler |
99 from E5XML.SessionHandler import SessionHandler |
|
100 |
|
101 from E5Network.E5NetworkProxyFactory import E5NetworkProxyFactory |
99 |
102 |
100 from IconEditor.IconEditorWindow import IconEditorWindow |
103 from IconEditor.IconEditorWindow import IconEditorWindow |
101 |
104 |
102 from eric5config import getConfig |
105 from eric5config import getConfig |
103 |
106 |
608 self.templateViewer.readTemplates() |
614 self.templateViewer.readTemplates() |
609 |
615 |
610 # now start the debug client |
616 # now start the debug client |
611 debugServer.startClient(False) |
617 debugServer.startClient(False) |
612 |
618 |
613 # attribute for the http client object |
619 # attributes for the network objects |
614 self.http = None |
620 self.__networkManager = QNetworkAccessManager(self) |
|
621 self.connect(self.__networkManager, |
|
622 SIGNAL('proxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*)'), |
|
623 self.__proxyAuthenticationRequired) |
|
624 self.connect(self.__networkManager, |
|
625 SIGNAL('sslErrors(QNetworkReply *, const QList<QSslError> &)'), |
|
626 self.__sslErrors) |
|
627 self.__replies = [] |
615 |
628 |
616 # attribute for the help window |
629 # attribute for the help window |
617 self.helpWindow = None |
630 self.helpWindow = None |
618 |
631 |
619 # list of web addresses serving the versions file |
632 # list of web addresses serving the versions file |
5335 return |
5348 return |
5336 |
5349 |
5337 self.__inVersionCheck = True |
5350 self.__inVersionCheck = True |
5338 self.manualUpdatesCheck = manual |
5351 self.manualUpdatesCheck = manual |
5339 self.showAvailableVersions = showVersions |
5352 self.showAvailableVersions = showVersions |
5340 if self.http is None: |
|
5341 self.http = QHttp() |
|
5342 self.connect(self.http, SIGNAL("done(bool)"), self.__versionsDownloadDone) |
|
5343 self.connect(self.http, |
|
5344 SIGNAL('proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)'), |
|
5345 self.__proxyAuthenticationRequired) |
|
5346 self.connect(self.http, SIGNAL("sslErrors(const QList<QSslError>&)"), |
|
5347 self.__sslErrors) |
|
5348 |
|
5349 if Preferences.getUI("UseProxy"): |
|
5350 host = Preferences.getUI("ProxyHost") |
|
5351 if not host: |
|
5352 QMessageBox.critical(None, |
|
5353 self.trUtf8("Error during updates check"), |
|
5354 self.trUtf8("""Proxy usage was activated""" |
|
5355 """ but no proxy host configured.""")) |
|
5356 return |
|
5357 else: |
|
5358 pProxyType = Preferences.getUI("ProxyType") |
|
5359 if pProxyType == 0: |
|
5360 proxyType = QNetworkProxy.HttpProxy |
|
5361 elif pProxyType == 1: |
|
5362 proxyType = QNetworkProxy.HttpCachingProxy |
|
5363 elif pProxyType == 2: |
|
5364 proxyType = QNetworkProxy.Socks5Proxy |
|
5365 self.__proxy = QNetworkProxy(proxyType, host, |
|
5366 Preferences.getUI("ProxyPort"), |
|
5367 Preferences.getUI("ProxyUser"), |
|
5368 Preferences.getUI("ProxyPassword")) |
|
5369 self.http.setProxy(self.__proxy) |
|
5370 |
|
5371 self.httpAlternative = alternative |
5353 self.httpAlternative = alternative |
5372 url = QUrl(self.__httpAlternatives[alternative]) |
5354 url = QUrl(self.__httpAlternatives[alternative]) |
5373 self.__versionCheckCanceled = False |
5355 self.__versionCheckCanceled = False |
5374 if manual: |
5356 if manual: |
5375 if self.__versionCheckProgress is None: |
5357 if self.__versionCheckProgress is None: |
5380 self.connect(self.__versionCheckProgress, SIGNAL("canceled()"), |
5362 self.connect(self.__versionCheckProgress, SIGNAL("canceled()"), |
5381 self.__versionsDownloadCanceled) |
5363 self.__versionsDownloadCanceled) |
5382 self.__versionCheckProgress.setLabelText(self.trUtf8("Trying host {0}")\ |
5364 self.__versionCheckProgress.setLabelText(self.trUtf8("Trying host {0}")\ |
5383 .format(url.host())) |
5365 .format(url.host())) |
5384 self.__versionCheckProgress.setValue(alternative) |
5366 self.__versionCheckProgress.setValue(alternative) |
5385 self.http.setHost(url.host(), url.port(80)) |
5367 reply = self.__networkManager.get(QNetworkRequest(url)) |
5386 self.http.get(url.path()) |
5368 self.connect(reply, SIGNAL("finished()"), self.__versionsDownloadDone) |
5387 |
5369 self.__replies.append(reply) |
5388 def __versionsDownloadDone(self, error): |
5370 |
|
5371 def __versionsDownloadDone(self): |
5389 """ |
5372 """ |
5390 Private method called, after the versions file has been downloaded |
5373 Private method called, after the versions file has been downloaded |
5391 from the internet. |
5374 from the internet. |
5392 |
|
5393 @param error flag indicating an error condition (boolean) |
|
5394 """ |
5375 """ |
5395 if self.__versionCheckCanceled: |
5376 if self.__versionCheckCanceled: |
5396 self.__inVersionCheck = False |
5377 self.__inVersionCheck = False |
5397 if self.__versionCheckProgress is not None: |
5378 if self.__versionCheckProgress is not None: |
5398 self.__versionCheckProgress.reset() |
5379 self.__versionCheckProgress.reset() |
5399 self.__versionCheckProgress = None |
5380 self.__versionCheckProgress = None |
5400 return |
5381 return |
5401 |
5382 |
5402 if error or self.http.lastResponse().statusCode() != 200: |
5383 reply = self.sender() |
|
5384 if reply in self.__replies: |
|
5385 self.__replies.remove(reply) |
|
5386 if reply.error() != QNetworkReply.NoError: |
5403 self.httpAlternative += 1 |
5387 self.httpAlternative += 1 |
5404 if self.httpAlternative >= len(self.__httpAlternatives): |
5388 if self.httpAlternative >= len(self.__httpAlternatives): |
5405 self.__inVersionCheck = False |
5389 self.__inVersionCheck = False |
5406 if self.__versionCheckProgress is not None: |
5390 if self.__versionCheckProgress is not None: |
5407 self.__versionCheckProgress.reset() |
5391 self.__versionCheckProgress.reset() |
5409 QMessageBox.warning(None, |
5393 QMessageBox.warning(None, |
5410 self.trUtf8("Error downloading versions file"), |
5394 self.trUtf8("Error downloading versions file"), |
5411 self.trUtf8("""Could not download the versions file.""")) |
5395 self.trUtf8("""Could not download the versions file.""")) |
5412 return |
5396 return |
5413 else: |
5397 else: |
5414 self.http = None |
|
5415 self.performVersionCheck(self.manualUpdatesCheck, self.httpAlternative, |
5398 self.performVersionCheck(self.manualUpdatesCheck, self.httpAlternative, |
5416 self.showAvailableVersions) |
5399 self.showAvailableVersions) |
5417 return |
5400 return |
5418 |
5401 |
5419 self.__inVersionCheck = False |
5402 self.__inVersionCheck = False |
5420 if self.__versionCheckProgress is not None: |
5403 if self.__versionCheckProgress is not None: |
5421 self.__versionCheckProgress.reset() |
5404 self.__versionCheckProgress.reset() |
5422 self.__versionCheckProgress = None |
5405 self.__versionCheckProgress = None |
5423 ioEncoding = Preferences.getSystem("IOEncoding") |
5406 ioEncoding = Preferences.getSystem("IOEncoding") |
5424 versions = str(self.http.readAll(), ioEncoding, 'replace').splitlines() |
5407 versions = str(reply.readAll(), ioEncoding, 'replace').splitlines() |
5425 self.__updateVersionsUrls(versions) |
5408 self.__updateVersionsUrls(versions) |
5426 if self.showAvailableVersions: |
5409 if self.showAvailableVersions: |
5427 self.__showAvailableVersionInfos(versions) |
5410 self.__showAvailableVersionInfos(versions) |
5428 else: |
5411 else: |
5429 Preferences.Prefs.settings.setValue(\ |
5412 Preferences.Prefs.settings.setValue(\ |
5556 auth.setPassword(password) |
5539 auth.setPassword(password) |
5557 if dlg.shallSave(): |
5540 if dlg.shallSave(): |
5558 Preferences.setUI("ProxyUser", username) |
5541 Preferences.setUI("ProxyUser", username) |
5559 Preferences.setUI("ProxyPassword", password) |
5542 Preferences.setUI("ProxyPassword", password) |
5560 |
5543 |
5561 def __sslErrors(self, sslErrors): |
5544 def __sslErrors(self, reply, errors): |
5562 """ |
5545 """ |
5563 Private slot to handle SSL errors. |
5546 Private slot to handle SSL errors. |
5564 |
5547 |
5565 @param sslErrors list of SSL errors (list of QSslError) |
5548 @param reply reference to the reply object (QNetworkReply) |
|
5549 @param errors list of SSL errors (list of QSslError) |
5566 """ |
5550 """ |
5567 errorStrings = [] |
5551 errorStrings = [] |
5568 for err in sslErrors: |
5552 for err in sslErrors: |
5569 errorStrings.append(err.errorString()) |
5553 errorStrings.append(err.errorString()) |
5570 errorString = '.<br />'.join(errorStrings) |
5554 errorString = '.<br />'.join(errorStrings) |
5577 QMessageBox.StandardButtons(\ |
5561 QMessageBox.StandardButtons(\ |
5578 QMessageBox.No | \ |
5562 QMessageBox.No | \ |
5579 QMessageBox.Yes), |
5563 QMessageBox.Yes), |
5580 QMessageBox.No) |
5564 QMessageBox.No) |
5581 if ret == QMessageBox.Yes: |
5565 if ret == QMessageBox.Yes: |
5582 self.__http.ignoreSslErrors() |
5566 reply.ignoreSslErrors() |
5583 else: |
5567 else: |
5584 self.__downloadCancelled = True |
5568 self.__downloadCancelled = True |
5585 self.__http.abort() |
5569 reply.abort() |
5586 |
5570 |
5587 ####################################### |
5571 ####################################### |
5588 ## Below are methods for various checks |
5572 ## Below are methods for various checks |
5589 ####################################### |
5573 ####################################### |
5590 |
5574 |