src/eric7/EricNetwork/EricJsonClient.py

Thu, 25 Jan 2024 14:13:36 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 25 Jan 2024 14:13:36 +0100
branch
eric7
changeset 10524
ed4fd87c4d4c
parent 10522
c04e878aa308
child 10526
2549534fcb55
permissions
-rw-r--r--

JSON server and client
- Changed the code code to secure the data with an Adler32 checksum.

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
10439
21c28b0f9e41 Updated copyright for 2024.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10050
diff changeset
3 # Copyright (c) 2017 - 2024 Detlev Offenbach <detlev@die-offenbachs.de>
8300
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
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
10 import contextlib
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import io
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
12 import json
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import select
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
14 import socket
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
15 import struct
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
16 import sys
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 import traceback
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
18 import zlib
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
8354
12ebd3934fef Renamed 'E5Utilities' to 'EricUtilities' and 'E5Network' to 'EricNetwork'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8327
diff changeset
21 class EricJsonClient:
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 Class implementing a JSON based client base class.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
25
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 def __init__(self, host, port, idString=""):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 Constructor
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
29
9057
ddc46e93ccc4 Added classes to realize a JSON based stream between two processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8881
diff changeset
30 @param host IP address the background service is listening
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @param port port of the background service
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @type int
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @param idString assigned client id to be sent back to the server in
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 order to identify the connection
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 self.__connection = socket.create_connection((host, port))
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 if idString:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
40 reply = idString + "\n"
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
41 self.__connection.sendall(reply.encode("utf8", "backslashreplace"))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
42
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 def sendJson(self, command, params):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 Public method to send a single refactoring command to the server.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
46
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 @param command command name to be sent
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @param params dictionary of named parameters for the command
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 @type dict
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 commandDict = {
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 "jsonrpc": "2.0",
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 "method": command,
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 "params": params,
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 }
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
57 data = json.dumps(commandDict).encode("utf8", "backslashreplace")
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
58 header = struct.pack(b"!II", len(data), zlib.adler32(data) & 0xFFFFFFFF)
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
59 self.__connection.sendall(header)
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
60 self.__connection.sendall(data)
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
61
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
62 def __receiveBytes(self, length):
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
63 """
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
64 Private method to receive the given length of bytes.
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
65
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
66 @param length bytes to receive
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
67 @type int
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
68 @return received bytes or None if connection closed
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
69 @rtype bytes
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
70 """
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
71 data = bytearray()
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
72 while len(data) < length:
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
73 newData = self.__connection.recv(length - len(data))
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
74 if not newData:
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
75 return None
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
76
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
77 data += newData
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
78 return data
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
79
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 def __receiveJson(self):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 """
10522
c04e878aa308 Did some small code optimizations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10439
diff changeset
82 Private method to receive a JSON encoded command and data from the
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 server.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
84
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 @return tuple containing the received command and a dictionary
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 containing the associated data
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 @rtype tuple of (str, dict)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 # step 1: receive the data
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
90 header = self.__receiveBytes(struct.calcsize(b"!II"))
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
91 if not header:
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 return None, None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
93
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
94 length, datahash = struct.unpack(b"!II", header)
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
95
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 length = int(length)
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
97 data = self.__receiveBytes(length)
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
98 if not data or zlib.adler32(data) & 0xFFFFFFFF != datahash:
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
99 self.sendJson(
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
100 "ClientException",
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
101 {
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
102 "ExceptionType": "ProtocolError",
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
103 "ExceptionValue": "The checksum of the data does not match.",
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
104 "ProtocolData": data.decode("utf8", "backslashreplace"),
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
105 },
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
106 )
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
107 return None, None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
108
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 # step 2: decode and convert the data
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
110 jsonString = data.decode("utf8", "backslashreplace")
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 try:
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
112 commandDict = json.loads(jsonString.strip())
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 except (TypeError, ValueError) as err:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
114 self.sendJson(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
115 "ClientException",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
116 {
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
117 "ExceptionType": "ProtocolError",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
118 "ExceptionValue": str(err),
10524
ed4fd87c4d4c JSON server and client
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10522
diff changeset
119 "ProtocolData": jsonString.strip(),
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
120 },
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
121 )
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 return None, None
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
123
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 method = commandDict["method"]
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 params = commandDict["params"]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
126
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 return method, params
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
128
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 def handleCall(self, method, params):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 Public method to handle a method call from the server.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
132
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 Note: This is an empty implementation that must be overridden in
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 derived classes.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
135
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 @param method requested method name
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 @type str
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 @param params dictionary with method specific parameters
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 @type dict
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 pass
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
142
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 def run(self):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 Public method implementing the main loop of the client.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 """
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 try:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 selectErrors = 0
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 while selectErrors <= 10: # selected arbitrarily
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 try:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
151 rrdy, wrdy, xrdy = select.select([self.__connection], [], [])
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
152
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 # Just waiting for self.__connection. Therefor no check
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 # needed.
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 method, params = self.__receiveJson()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 if method is None:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 selectErrors += 1
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 elif method == "Exit":
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 break
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 else:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 self.handleCall(method, params)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
162
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 # reset select errors
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 selectErrors = 0
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
165
10050
3750abc45d5e Corrected some code style issues detected by the extended checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
166 except (KeyboardInterrupt, select.error, socket.error):
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 selectErrors += 1
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
168
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 except Exception:
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 exctype, excval, exctb = sys.exc_info()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 tbinfofile = io.StringIO()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 traceback.print_tb(exctb, None, tbinfofile)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 tbinfofile.seek(0)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 tbinfo = tbinfofile.read()
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 del exctb
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
176 self.sendJson(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
177 "ClientException",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
178 {
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
179 "ExceptionType": str(exctype),
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
180 "ExceptionValue": str(excval),
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
181 "Traceback": tbinfo,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
182 },
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
183 )
8300
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185 # Give time to process latest response on server side
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 with contextlib.suppress(socket.error, OSError):
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 self.__connection.shutdown(socket.SHUT_RDWR)
72ba9635ec5c E5Network
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 self.__connection.close()
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
189
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
190 def poll(self, waitMethod=""):
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
191 """
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
192 Public method to check and receive one message (if available).
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
193
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
194 @param waitMethod name of a method to wait for
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
195 @type str
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
196 @return dictionary containing the data of the waited for method
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
197 @rtype dict
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
198 """
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
199 try:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
200 if waitMethod:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
201 rrdy, wrdy, xrdy = select.select([self.__connection], [], [])
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
202 else:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
203 rrdy, wrdy, xrdy = select.select([self.__connection], [], [], 0)
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
204
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
205 if self.__connection in rrdy:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
206 method, params = self.__receiveJson()
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
207 if method is not None:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
208 if method == "Exit":
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
209 self.__exitClient = True
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
210 elif method == waitMethod:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
211 return params
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
212 else:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
213 self.handleCall(method, params)
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
214
10050
3750abc45d5e Corrected some code style issues detected by the extended checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
215 except (KeyboardInterrupt, select.error, socket.error):
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
216 # just ignore these
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
217 pass
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
218
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
219 except Exception:
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
220 exctype, excval, exctb = sys.exc_info()
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
221 tbinfofile = io.StringIO()
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
222 traceback.print_tb(exctb, None, tbinfofile)
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
223 tbinfofile.seek(0)
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
224 tbinfo = tbinfofile.read()
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
225 del exctb
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
226 self.sendJson(
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
227 "ClientException",
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
228 {
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
229 "ExceptionType": str(exctype),
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
230 "ExceptionValue": str(excval),
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
231 "Traceback": tbinfo,
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
232 },
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
233 )
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
234
8327
666c2b81cbb7 Continued porting eric to PyQt6.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
235 return None

eric ide

mercurial