RefactoringRope/JsonClient.py

Wed, 30 Dec 2020 11:02:11 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 30 Dec 2020 11:02:11 +0100
changeset 346
877cac2e8d94
parent 326
67bcde9c65b9
child 347
b5048b5ff454
permissions
-rw-r--r--

Updated copyright for 2021.

163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
346
877cac2e8d94 Updated copyright for 2021.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 326
diff changeset
3 # Copyright (c) 2017 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing the JSON based client base class.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 from __future__ import unicode_literals
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 bytes = unicode
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 import StringIO as io # __IGNORE_EXCEPTION__
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 except NameError:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 import io # __IGNORE_WARNING__
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 import sys
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 import socket
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 import select
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 import traceback
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 import json
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 class JsonClient(object):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 Class implementing the JSON based client base class.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
28 def __init__(self, host, port, idString=""):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 Constructor
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 @param host ip address the background service is listening
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @param port port of the background service
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @type int
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
36 @param idString assigned client id to be sent back to the server in
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
37 order to identify the connection
203
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
38 @type str
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 self.__connection = socket.create_connection((host, port))
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
41 if idString:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
42 reply = idString + '\n'
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 173
diff changeset
43 self.__connection.sendall(reply.encode('utf8', 'backslashreplace'))
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 def sendJson(self, command, params):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 Public method to send a single refactoring command to the server.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 @param command command name to be sent
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 @param params dictionary of named parameters for the command
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 @type dict
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 commandDict = {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 "jsonrpc": "2.0",
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 "method": command,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 "params": params,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 }
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 cmd = json.dumps(commandDict) + '\n'
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.__connection.sendall(cmd.encode('utf8', 'backslashreplace'))
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 def __receiveJson(self):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 Private method to receive a JSON encode command and data from the
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 server.
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
66
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
67 @return tuple containing the received command and a dictionary
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
68 containing the associated data
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
69 @rtype tuple of (str, dict)
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
210
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
71 # step 1: receive the data
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
72 # The JSON RPC string is prefixed by a 9 character long length field.
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
73 length = self.__connection.recv(9)
243
8ea03231bd47 Fixed an issue in the JSON client class receiving an invalid length prefix.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 241
diff changeset
74 if len(length) < 9:
8ea03231bd47 Fixed an issue in the JSON client class receiving an invalid length prefix.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 241
diff changeset
75 # invalid length string received
8ea03231bd47 Fixed an issue in the JSON client class receiving an invalid length prefix.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 241
diff changeset
76 return None, None
8ea03231bd47 Fixed an issue in the JSON client class receiving an invalid length prefix.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 241
diff changeset
77
210
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
78 length = int(length)
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
79 data = b''
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
80 while len(data) < length:
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
81 newData = self.__connection.recv(length - len(data))
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
82 if not newData:
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
83 return None, None
243
8ea03231bd47 Fixed an issue in the JSON client class receiving an invalid length prefix.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 241
diff changeset
84
210
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
85 data += newData
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
86
210
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
87 # step 2: decode and convert the data
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
88 line = data.decode(
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
89 'utf8', 'backslashreplace')
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
90 try:
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
91 commandDict = json.loads(line.strip())
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
92 except (TypeError, ValueError) as err:
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
93 self.sendJson("ClientException", {
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
94 "ExceptionType": "ProtocolError",
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
95 "ExceptionValue": str(err),
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
96 "ProtocolData": line.strip(),
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
97 })
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
98 return None, None
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
99
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
100 method = commandDict["method"]
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
101 params = commandDict["params"]
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
102
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 204
diff changeset
103 return method, params
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 def handleCall(self, method, params):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 Public method to handle a method call from the server.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 Note: This is an empty implementation that must be overridden in
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 derived classes.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 @param method requested method name
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 @param params dictionary with method specific parameters
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 @type dict
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 pass
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 def run(self):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 Public method implementing the main loop of the client.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 try:
290
6b3530ce34d0 JsonClient: changed the run logic to (hopefully) with a situation causing 100% CPU load when the IDE is not shut down cleanly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 245
diff changeset
124 selectErrors = 0
307
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
125 while selectErrors <= 10: # selected arbitrarily
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 rrdy, wrdy, xrdy = select.select(
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 [self.__connection], [], [])
307
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
129
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
130 # Just waiting for self.__connection. Therefor no check
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
131 # needed.
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
132 method, params = self.__receiveJson()
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
133 if method is None:
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
134 selectErrors += 1
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
135 elif method == "Exit":
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
136 break
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
137 else:
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
138 self.handleCall(method, params)
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
139
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
140 # reset select errors
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
141 selectErrors = 0
84fba41b2f6f JsonClient: fixed am issue causing 100% CPU load if eric is killed or stopps unpleasantly (idea for fix from Tobias).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 302
diff changeset
142
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 except (select.error, KeyboardInterrupt, socket.error):
290
6b3530ce34d0 JsonClient: changed the run logic to (hopefully) with a situation causing 100% CPU load when the IDE is not shut down cleanly.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 245
diff changeset
144 selectErrors += 1
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 except Exception:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 exctype, excval, exctb = sys.exc_info()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 tbinfofile = io.StringIO()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 traceback.print_tb(exctb, None, tbinfofile)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 tbinfofile.seek(0)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 tbinfo = tbinfofile.read()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152 del exctb
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 self.sendJson("ClientException", {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 "ExceptionType": str(exctype),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 "ExceptionValue": str(excval),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 "Traceback": tbinfo,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 })
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 # Give time to process latest response on server side
241
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
160 try:
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
161 self.__connection.shutdown(socket.SHUT_RDWR)
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
162 self.__connection.close()
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
163 except (socket.error, OSError):
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
164 # ignore these; socket might be closed already
e7d5da53faac Fixed a bug in the JsonClient.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 210
diff changeset
165 pass
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
166
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
167 def poll(self, waitMethod=""):
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
168 """
168
53d76b4fc1ac Implemented the distributed History dialog and moved the Undo/Redo functions to this dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 166
diff changeset
169 Public method to check and receive one message (if available).
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
170
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
171 @param waitMethod name of a method to wait for
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
172 @type str
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
173 @return dictionary containing the data of the waited for method
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
174 @rtype dict
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
175 """
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
176 try:
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
177 if waitMethod:
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
178 rrdy, wrdy, xrdy = select.select(
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
179 [self.__connection], [], [])
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
180 else:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
181 rrdy, wrdy, xrdy = select.select(
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
182 [self.__connection], [], [], 0)
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
183
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
184 if self.__connection in rrdy:
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
185 method, params = self.__receiveJson()
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
186 if method is not None:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
187 if method == "Exit":
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
188 self.__exitClient = True
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
189 elif method == waitMethod:
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
190 return params
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
191 else:
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
192 self.handleCall(method, params)
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
193
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
194 except (select.error, KeyboardInterrupt, socket.error):
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
195 # just ignore these
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
196 pass
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
197
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
198 except Exception:
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
199 exctype, excval, exctb = sys.exc_info()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
200 tbinfofile = io.StringIO()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
201 traceback.print_tb(exctb, None, tbinfofile)
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
202 tbinfofile.seek(0)
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
203 tbinfo = tbinfofile.read()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
204 del exctb
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
205 self.sendJson("ClientException", {
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
206 "ExceptionType": str(exctype),
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
207 "ExceptionValue": str(excval),
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
208 "Traceback": tbinfo,
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
209 })
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
210
173
2cdb7c48b719 Finished implementing the distributed rename refactorings.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 169
diff changeset
211 return None

eric ide

mercurial