RefactoringRope/JsonServer.py

Mon, 10 May 2021 20:13:48 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 10 May 2021 20:13:48 +0200
changeset 360
2b35968f3d02
parent 358
84c2fd80c949
permissions
-rw-r--r--

Version 8.0.0
- bug fixes
- removed the included 'rope' library and have it as an external dependency installed during the plug-in installation (for eric > 21.5)

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 server 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 import json
354
a967ff16629a - implemented some code simplifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 353
diff changeset
11 import contextlib
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
320
91b171fdd85f Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 303
diff changeset
13 from PyQt5.QtCore import (
358
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
14 pyqtSlot, QProcess, QProcessEnvironment, QCoreApplication, QEventLoop,
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
15 QTimer
320
91b171fdd85f Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 303
diff changeset
16 )
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 from PyQt5.QtNetwork import QTcpServer, QHostAddress
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 from E5Gui import E5MessageBox
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 import Preferences
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 import Utilities
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
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 class JsonServer(QTcpServer):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 Class implementing the JSON based server base class.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 """
197
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
29 def __init__(self, name="", multiplex=False, parent=None):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 Constructor
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32
197
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
33 @param name name of the server (used for output only)
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
34 @type str
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
35 @param multiplex flag indicating a multiplexing server
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
36 @type bool
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 @param parent parent object
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @type QObject
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 """
354
a967ff16629a - implemented some code simplifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 353
diff changeset
40 super().__init__(parent)
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41
203
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
42 self.__name = name
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
43 self.__multiplex = multiplex
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
44 if self.__multiplex:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
45 self.__clientProcesses = {}
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
46 self.__connections = {}
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
47 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
48 self.__clientProcess = None
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
49 self.__connection = None
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 # setup the network interface
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 networkInterface = Preferences.getDebugger("NetworkInterface")
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 if networkInterface == "all" or '.' in networkInterface:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 # IPv4
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.__hostAddress = '127.0.0.1'
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 else:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 # IPv6
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.__hostAddress = '::1'
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.listen(QHostAddress(self.__hostAddress))
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
194
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
61 self.newConnection.connect(self.handleNewConnection)
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 port = self.serverPort()
203
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
64 ## Note: Need the port if client is started external in debugger.
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
65 print('JSON server ({1}) listening on: {0:d}' # __IGNORE_WARNING__
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
66 .format(port, self.__name))
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 @pyqtSlot()
194
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
69 def handleNewConnection(self):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
194
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
71 Public slot for new incoming connections from a client.
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 connection = self.nextPendingConnection()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 if not connection.isValid():
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 return
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
77 if self.__multiplex:
293
dd1c7ed6d880 Code Assist: started to move the Mouse Click handler to Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 285
diff changeset
78 if not connection.waitForReadyRead(1000):
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
79 return
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
80 idString = bytes(connection.readLine()).decode(
195
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
81 "utf-8", 'backslashreplace').strip()
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
82 if idString in self.__connections:
195
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
83 self.__connections[idString].close()
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
84 self.__connections[idString] = connection
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
85 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
86 idString = ""
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
87 if self.__connection is not None:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
88 self.__connection.close()
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
89
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
90 self.__connection = connection
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
91
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
92 connection.readyRead.connect(
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
93 lambda: self.__receiveJson(idString))
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
94 connection.disconnected.connect(
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
95 lambda: self.__handleDisconnect(idString))
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 @pyqtSlot()
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
98 def __handleDisconnect(self, idString):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
100 Private slot handling a disconnect of the client.
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
101
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
102 @param idString id of the connection been disconnected
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
103 @type str
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
105 if idString:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
106 if idString in self.__connections:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
107 self.__connections[idString].close()
197
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
108 del self.__connections[idString]
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
109 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
110 if self.__connection is not None:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
111 self.__connection.close()
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
112
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
113 self.__connection = None
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114
195
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
115 def connectionNames(self):
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
116 """
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
117 Public method to get the list of active connection names.
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
118
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
119 If this is not a multiplexing server, an empty list is returned.
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
120
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
121 @return list of active connection names
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
122 @rtype list of str
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
123 """
265
68152c23837a Fixed a bug in the JsonServer class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 251
diff changeset
124 if self.__multiplex:
68152c23837a Fixed a bug in the JsonServer class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 251
diff changeset
125 return list(self.__connections.keys())
68152c23837a Fixed a bug in the JsonServer class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 251
diff changeset
126 else:
68152c23837a Fixed a bug in the JsonServer class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 251
diff changeset
127 return []
195
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
128
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 @pyqtSlot()
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
130 def __receiveJson(self, idString):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 Private slot handling received data from the client.
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
133
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
134 @param idString id of the connection been disconnected
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
135 @type str
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
137 if idString:
209
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
138 try:
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
139 connection = self.__connections[idString]
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
140 except KeyError:
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
141 connection = None
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
142 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
143 connection = self.__connection
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
144
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
145 while connection and connection.canReadLine():
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
146 data = connection.readLine()
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 jsonLine = bytes(data).decode("utf-8", 'backslashreplace')
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148
347
b5048b5ff454 - updated to rope 0.18.0+
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 346
diff changeset
149 #- print("JSON Server ({0}): {1}".format(self.__name, jsonLine))
353
d38295fd97c2 Added code to suppress a code style warning.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 347
diff changeset
150 # __IGNORE_WARNING_M891__
347
b5048b5ff454 - updated to rope 0.18.0+
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 346
diff changeset
151 #- this is for debugging only
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 clientDict = json.loads(jsonLine.strip())
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 except (TypeError, ValueError) as err:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 E5MessageBox.critical(
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 None,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 self.tr("JSON Protocol Error"),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 self.tr("""<p>The response received from the client"""
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 """ could not be decoded. Please report"""
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 """ this issue with the received data to the"""
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 """ eric bugs email address.</p>"""
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 """<p>Error: {0}</p>"""
208
df77c3a4976d Updated translations.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 203
diff changeset
164 """<p>Data:<br/>{1}</p>""").format(
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 str(err), Utilities.html_encode(jsonLine.strip())),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 E5MessageBox.StandardButtons(
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 E5MessageBox.Ok))
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 return
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 method = clientDict["method"]
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 params = clientDict["params"]
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 self.handleCall(method, params)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
175 def sendJson(self, command, params, flush=False, idString=""):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
177 Public method to send a single command to a client.
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 @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
180 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 @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
182 @type dict
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
183 @param flush flag indicating to flush the data to the socket
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
184 @type bool
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
185 @param idString id of the connection to send data to
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
186 @type str
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 commandDict = {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 "jsonrpc": "2.0",
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 "method": command,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 "params": params,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 }
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 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
194
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
195 if idString:
209
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
196 try:
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
197 connection = self.__connections[idString]
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
198 except KeyError:
c1dce8630555 Improved handling of died connections/processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 208
diff changeset
199 connection = None
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
200 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
201 connection = self.__connection
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
202
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
203 if connection is not None:
210
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 209
diff changeset
204 data = cmd.encode('utf8', 'backslashreplace')
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 209
diff changeset
205 length = "{0:09d}".format(len(data))
8b07adc3cb87 Fixed an issue receiving the data sent by the server on the client side.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 209
diff changeset
206 connection.write(length.encode() + data)
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
207 if flush:
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
208 connection.flush()
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209
285
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
210 def startClient(self, interpreter, clientScript, clientArgs, idString="",
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
211 environment=None):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
213 Public method to start a client process.
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 @param interpreter interpreter to be used for the client
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 @param clientScript path to the client script
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 @param clientArgs list of arguments for the client
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
220 @param idString id of the client to be started
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
221 @type str
285
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
222 @param environment dictionary of environment settings to pass
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
223 @type dict
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
224 @return flag indicating a successful client start and the exit code
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
225 in case of an issue
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
226 @rtype bool, int
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 if interpreter == "" or not Utilities.isinpath(interpreter):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 return False
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
231 exitCode = None
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
232
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 proc = QProcess()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 proc.setProcessChannelMode(QProcess.ForwardedChannels)
285
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
235 if environment is not None:
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
236 env = QProcessEnvironment()
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
237 for key, value in list(environment.items()):
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
238 env.insert(key, value)
247d62c682dc CodeAssistServer, RefactoringServer, JsonServer: adapted the code to the virtual environment extensions as of eric6 18.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 265
diff changeset
239 proc.setProcessEnvironment(env)
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 args = [clientScript, self.__hostAddress, str(self.serverPort())]
195
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
241 if idString:
5d614a567be3 Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 194
diff changeset
242 args.append(idString)
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 args.extend(clientArgs)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 proc.start(interpreter, args)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 if not proc.waitForStarted(10000):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 proc = None
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
248 if idString:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
249 self.__clientProcesses[idString] = proc
358
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
250 if proc:
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
251 timer = QTimer()
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
252 timer.setSingleShot(True)
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
253 timer.start(30000) # 30s timeout
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
254 while (
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
255 idString not in self.connectionNames() and
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
256 timer.isActive()
358
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
257 ):
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
258 # Give the event loop the chance to process the new
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
259 # connection of the client (= slow start).
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
260 QCoreApplication.processEvents(
84c2fd80c949 JsonServer: modified 'startClient()' such, that events are processed for max. 30 seconds to allow the client to connect before trying to send any command.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 354
diff changeset
261 QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
262
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
263 # check if client exited prematurely
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
264 if proc.state() == QProcess.ProcessState.NotRunning:
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
265 exitCode = proc.exitCode()
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
266 proc = None
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
267 self.__clientProcesses[idString] = None
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
268 break
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
269 else:
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
270 if proc:
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
271 timer = QTimer()
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
272 timer.setSingleShot(True)
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
273 timer.start(1000) # 1s timeout
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
274 while timer.isActive():
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
275 # check if client exited prematurely
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
276 QCoreApplication.processEvents(
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
277 QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
278 if proc.state() == QProcess.ProcessState.NotRunning:
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
279 exitCode = proc.exitCode()
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
280 proc = None
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
281 break
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
282 self.__clientProcess = proc
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
284 return proc is not None, exitCode
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
286 def stopClient(self, idString=""):
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
288 Public method to stop a client process.
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
289
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
290 @param idString id of the client to be stopped
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
291 @type str
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 """
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
293 self.sendJson("Exit", {}, flush=True, idString=idString)
166
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
294
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
295 if idString:
203
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
296 try:
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
297 connection = self.__connections[idString]
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
298 except KeyError:
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
299 connection = None
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
300 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
301 connection = self.__connection
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
302 if connection is not None:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
303 connection.waitForDisconnected()
166
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
304
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
305 if idString:
354
a967ff16629a - implemented some code simplifications
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 353
diff changeset
306 with contextlib.suppress(KeyError):
360
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
307 if self .__clientProcesses[idString] is not None:
2b35968f3d02 Version 8.0.0
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 358
diff changeset
308 self .__clientProcesses[idString].close()
203
c38750e1bafd Performed some code cleanup actions.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 197
diff changeset
309 del self.__clientProcesses[idString]
192
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
310 else:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
311 if self.__clientProcess is not None:
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
312 self.__clientProcess.close()
20950ed6b384 Extended the JsonServer to handle multiple clients simultaneously.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 189
diff changeset
313 self.__clientProcess = None
194
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
314
197
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
315 def stopAllClients(self):
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
316 """
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
317 Public method to stop all clients.
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
318 """
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
319 clientNames = self.connectionNames()[:]
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
320 for clientName in clientNames:
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
321 self.stopClient(clientName)
7046ac1bcb4b Continued implementing the distributed Code Assist.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 195
diff changeset
322
194
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
323 #######################################################################
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
324 ## The following methods should be overridden by derived classes
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
325 #######################################################################
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
326
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
327 def handleCall(self, method, params):
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
328 """
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
329 Public method to handle a method call from the client.
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
330
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
331 Note: This is an empty implementation that must be overridden in
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
332 derived classes.
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
333
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
334 @param method requested method name
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
335 @type str
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
336 @param params dictionary with method specific parameters
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
337 @type dict
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
338 """
5c297b473425 Some more refactorings of the code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 192
diff changeset
339 pass

eric ide

mercurial