eric6/E5Network/E5JsonClient.py

Wed, 19 May 2021 19:44:13 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 19 May 2021 19:44:13 +0200
changeset 8326
0a99aecb5d91
parent 8300
72ba9635ec5c
permissions
-rw-r--r--

E5JsonClient: added the missing poll() method.

8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing the JSON based client base class.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 import io
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import sys
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 import socket
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import select
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 import traceback
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 import json
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 import contextlib
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 class E5JsonClient:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 Class implementing a JSON based client base class.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 def __init__(self, host, port, idString=""):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 Constructor
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 @param host ip address the background service is listening
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 @param port port of the background service
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 @type int
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param idString assigned client id to be sent back to the server in
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 order to identify the connection
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 self.__connection = socket.create_connection((host, port))
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 if idString:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 reply = idString + '\n'
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 self.__connection.sendall(reply.encode('utf8', 'backslashreplace'))
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 def sendJson(self, command, params):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 Public method to send a single refactoring command to the server.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @param command command name to be sent
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @param params dictionary of named parameters for the command
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @type dict
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 commandDict = {
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 "jsonrpc": "2.0",
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 "method": command,
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 "params": params,
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 }
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 cmd = json.dumps(commandDict) + '\n'
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__connection.sendall(cmd.encode('utf8', 'backslashreplace'))
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 def __receiveJson(self):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 Private method to receive a JSON encode command and data from the
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 server.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 @return tuple containing the received command and a dictionary
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 containing the associated data
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 @rtype tuple of (str, dict)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 # step 1: receive the data
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 # The JSON RPC string is prefixed by a 9 character long length field.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 length = self.__connection.recv(9)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 if len(length) < 9:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 # invalid length string received
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 return None, None
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 length = int(length)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 data = b''
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 while len(data) < length:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 newData = self.__connection.recv(length - len(data))
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 if not newData:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 return None, None
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 data += newData
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 # step 2: decode and convert the data
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 line = data.decode(
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 'utf8', 'backslashreplace')
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 try:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 commandDict = json.loads(line.strip())
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 except (TypeError, ValueError) as err:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 self.sendJson("ClientException", {
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 "ExceptionType": "ProtocolError",
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 "ExceptionValue": str(err),
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 "ProtocolData": line.strip(),
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 })
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 return None, None
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 method = commandDict["method"]
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 params = commandDict["params"]
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 return method, params
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 def handleCall(self, method, params):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 Public method to handle a method call from the server.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 Note: This is an empty implementation that must be overridden in
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 derived classes.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 @param method requested method name
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 @param params dictionary with method specific parameters
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 @type dict
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 pass
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 def run(self):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 Public method implementing the main loop of the client.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 try:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 selectErrors = 0
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 while selectErrors <= 10: # selected arbitrarily
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 try:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 rrdy, wrdy, xrdy = select.select(
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 [self.__connection], [], [])
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 # Just waiting for self.__connection. Therefor no check
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 # needed.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 method, params = self.__receiveJson()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 if method is None:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 selectErrors += 1
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 elif method == "Exit":
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 break
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 else:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 self.handleCall(method, params)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 # reset select errors
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 selectErrors = 0
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 except (select.error, KeyboardInterrupt, socket.error):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 selectErrors += 1
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 except Exception:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 exctype, excval, exctb = sys.exc_info()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 tbinfofile = io.StringIO()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 traceback.print_tb(exctb, None, tbinfofile)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 tbinfofile.seek(0)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 tbinfo = tbinfofile.read()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 del exctb
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 self.sendJson("ClientException", {
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 "ExceptionType": str(exctype),
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 "ExceptionValue": str(excval),
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 "Traceback": tbinfo,
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 })
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 # Give time to process latest response on server side
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 with contextlib.suppress(socket.error, OSError):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 self.__connection.shutdown(socket.SHUT_RDWR)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 self.__connection.close()
8326
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
158
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
159 def poll(self, waitMethod=""):
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
160 """
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
161 Public method to check and receive one message (if available).
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
162
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
163 @param waitMethod name of a method to wait for
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
164 @type str
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
165 @return dictionary containing the data of the waited for method
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
166 @rtype dict
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
167 """
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
168 try:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
169 if waitMethod:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
170 rrdy, wrdy, xrdy = select.select(
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
171 [self.__connection], [], [])
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
172 else:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
173 rrdy, wrdy, xrdy = select.select(
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
174 [self.__connection], [], [], 0)
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
175
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
176 if self.__connection in rrdy:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
177 method, params = self.__receiveJson()
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
178 if method is not None:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
179 if method == "Exit":
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
180 self.__exitClient = True
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
181 elif method == waitMethod:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
182 return params
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
183 else:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
184 self.handleCall(method, params)
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
185
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
186 except (select.error, KeyboardInterrupt, socket.error):
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
187 # just ignore these
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
188 pass
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
189
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
190 except Exception:
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
191 exctype, excval, exctb = sys.exc_info()
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
192 tbinfofile = io.StringIO()
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
193 traceback.print_tb(exctb, None, tbinfofile)
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
194 tbinfofile.seek(0)
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
195 tbinfo = tbinfofile.read()
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
196 del exctb
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
197 self.sendJson("ClientException", {
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
198 "ExceptionType": str(exctype),
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
199 "ExceptionValue": str(excval),
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
200 "Traceback": tbinfo,
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
201 })
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
202
0a99aecb5d91 E5JsonClient: added the missing poll() method.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8300
diff changeset
203 return None

eric ide

mercurial