Tue, 10 Sep 2019 19:30:07 +0200
Removed obsolete "from __future__ import ..." statements.
4258
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1 | # -*- coding: utf-8 -*- |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2 | |
6645
ad476851d7e0
Updated copyright for 2019.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6048
diff
changeset
|
3 | # Copyright (c) 2015 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
4258
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4 | # |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7 | Module implementing a xmlrpc client for Qt. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9 | |
7192
a22eee00b052
Started removing runtime support for Python2 and PyQt4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
10 | |
a22eee00b052
Started removing runtime support for Python2 and PyQt4.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
6942
diff
changeset
|
11 | import xmlrpc.client as xmlrpc |
4258
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13 | from PyQt5.QtCore import QObject, QUrl, QByteArray |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14 | from PyQt5.QtNetwork import QNetworkAccessManager, \ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15 | QNetworkRequest, QNetworkReply |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17 | from E5Network.E5NetworkProxyFactory import proxyAuthenticationRequired |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18 | try: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19 | from E5Network.E5SslErrorHandler import E5SslErrorHandler |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20 | SSL_AVAILABLE = True |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21 | except ImportError: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22 | SSL_AVAILABLE = False |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25 | class E5XmlRpcClient(QObject): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27 | Class implementing a xmlrpc client for Qt. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29 | def __init__(self, url, parent=None): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31 | Constructor |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33 | @param url xmlrpc handler URL (string or QUrl) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34 | @param parent parent object (QObject) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36 | super(E5XmlRpcClient, self).__init__(parent) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38 | # attributes for the network objects |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39 | self.__networkManager = QNetworkAccessManager(self) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40 | self.__networkManager.proxyAuthenticationRequired.connect( |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41 | proxyAuthenticationRequired) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42 | self.__networkManager.finished.connect(self.__replyFinished) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43 | if SSL_AVAILABLE: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44 | self.__sslErrorHandler = E5SslErrorHandler(self) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45 | self.__networkManager.sslErrors.connect(self.__sslErrors) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47 | self.__callmap = {} |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49 | self.__request = QNetworkRequest(QUrl(url)) |
4326
e52318f11812
Change code to make eric compatible to PyQt 5.5 (QByteArry issue).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
4258
diff
changeset
|
50 | self.__request.setRawHeader(b"User-Agent", b"E5XmlRpcClient/1.0") |
4258
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51 | self.__request.setHeader(QNetworkRequest.ContentTypeHeader, "text/xml") |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53 | def setUrl(self, url): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55 | Public slot to set the xmlrpc handler URL. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57 | @param url xmlrpc handler URL (string or QUrl) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59 | url = QUrl(url) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60 | if url.isValid(): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61 | self.__request.setUrl(url) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63 | def call(self, method, args, responseCallback, errorCallback): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65 | Public method to call the remote server. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67 | @param method name of the remote method to be called (string) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68 | @param args tuple of method arguments (tuple) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69 | @param responseCallback method to be called with the returned |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70 | result as a tuple (function) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71 | @param errorCallback method to be called in case of an error |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72 | with error code and error string (function) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74 | assert isinstance(args, tuple), \ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75 | "argument must be tuple or Fault instance" |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77 | data = xmlrpc.dumps(args, method).encode("utf-8") |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78 | reply = self.__networkManager.post( |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79 | self.__request, QByteArray(data)) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80 | self.__callmap[reply] = (responseCallback, errorCallback) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82 | def abort(self): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84 | Public method to abort all calls. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86 | for reply in list(self.__callmap): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87 | if reply.isRunning(): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88 | reply.abort() |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90 | def __sslErrors(self, reply, errors): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92 | Private slot to handle SSL errors. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94 | @param reply reference to the reply object (QNetworkReply) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95 | @param errors list of SSL errors (list of QSslError) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97 | ignored = self.__sslErrorHandler.sslErrorsReply(reply, errors)[0] |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98 | if ignored == E5SslErrorHandler.NotIgnored and reply in self.__callmap: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99 | self.__callmap[reply][1](xmlrpc.TRANSPORT_ERROR, self.tr( |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100 | "SSL Error")) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102 | def __replyFinished(self, reply): |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104 | Private slot handling the receipt of a reply. |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106 | @param reply reference to the finished reply (QNetworkReply) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107 | """ |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108 | if reply not in self.__callmap: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109 | return |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111 | if reply.error() != QNetworkReply.NoError: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112 | self.__callmap[reply][1](xmlrpc.TRANSPORT_ERROR, |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113 | reply.errorString()) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114 | else: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115 | data = bytes(reply.readAll()).decode("utf-8") |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116 | try: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117 | data = xmlrpc.loads(data)[0] |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118 | self.__callmap[reply][0](data) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119 | except xmlrpc.Fault as fault: |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120 | self.__callmap[reply][1](fault.faultCode, fault.faultString) |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121 | |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122 | reply.deleteLater() |
d141e2bb94cc
Added a Qt based xmlrpc client.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123 | del self.__callmap[reply] |