RefactoringRope/JsonClient.py

Sun, 17 Sep 2017 17:53:20 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 17 Sep 2017 17:53:20 +0200
branch
server_client_variant
changeset 169
fb8a4182f12e
parent 168
53d76b4fc1ac
child 173
2cdb7c48b719
permissions
-rw-r--r--

Modified the JSON client to allow for synchroneous callbacks.

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
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2017 Detlev Offenbach <detlev@die-offenbachs.de>
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 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 def __init__(self, host, port):
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
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 """
166
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 164
diff changeset
37 self.__exitClient = False
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 self.__connection = socket.create_connection((host, port))
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 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
41 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 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
43
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 @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
45 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 @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
47 @type dict
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 commandDict = {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 "jsonrpc": "2.0",
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 "method": command,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 "params": params,
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 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
55 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
56
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 def __receiveJson(self):
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 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
60 server.
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
61
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
62 @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
63 containing the associated data
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
64 @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
65 """
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
66 line = self.__connection.recv(1024 * 1024, socket.MSG_PEEK)
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
67 # 1MB buffer
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 eol = line.find(b'\n')
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 if eol >= 0:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 size = eol + 1
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 # Now we know how big the line is, read it for real.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 line = self.__connection.recv(size).decode(
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 'utf8', 'backslashreplace')
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 commandDict = json.loads(line.strip())
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 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
80 self.sendJson("ClientException", {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 "ExceptionType": "ProtocolError",
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 "ExceptionValue": str(err),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 "ProtocolData": line.strip(),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 })
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
85 return None, None
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 method = commandDict["method"]
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 params = commandDict["params"]
166
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 164
diff changeset
89
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
90 return method, params
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
91
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
92 return None, None
163
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 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
95 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 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
97
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 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
99 derived classes.
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 @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
102 @type str
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 @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
104 @type dict
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 pass
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 def run(self):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 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
111 """
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 while True:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 try:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 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
116 [self.__connection], [], [])
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 except (select.error, KeyboardInterrupt, socket.error):
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 # just carry on
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 continue
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 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
122 method, params = self.__receiveJson()
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
123 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
124 if method == "Exit":
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
125 self.__exitClient = True
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
126 else:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
127 self.handleCall(method, params)
166
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 164
diff changeset
128
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 164
diff changeset
129 if self.__exitClient:
6fc202183b3b Implemented the distributed 'query' methods.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 164
diff changeset
130 break
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 except Exception:
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 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
134 tbinfofile = io.StringIO()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 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
136 tbinfofile.seek(0)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 tbinfo = tbinfofile.read()
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 del exctb
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 self.sendJson("ClientException", {
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 "ExceptionType": str(exctype),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141 "ExceptionValue": str(excval),
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 "Traceback": tbinfo,
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 })
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 # Give time to process latest response on server side
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 self.__connection.shutdown(socket.SHUT_RDWR)
6a9e7b37a18b Refactored some JSON handling code into server and client base classes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 self.__connection.close()
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
148
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
149 def poll(self, wait=False):
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
150 """
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
151 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
152
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
153 @param wait flag indicating to wait until something has been received
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
154 @type bool
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
155 @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
156 containing the associated data
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
157 @rtype tuple of (str, dict)
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
158 """
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
159 try:
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
160 if wait:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
161 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
162 [self.__connection], [], [])
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
163 else:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
164 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
165 [self.__connection], [], [], 0)
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
166
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
167 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
168 method, params = self.__receiveJson()
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
169 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
170 if method == "Exit":
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
171 self.__exitClient = True
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
172 else:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
173 if wait:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
174 # wait means to return the data to the caller
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
175 return method, params
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
176 else:
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
177 # no wait means to pass on to the handler method
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
178 self.handleCall(method, params)
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
179
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
180 except (select.error, KeyboardInterrupt, socket.error):
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
181 # just ignore these
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
182 pass
164
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
183
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
184 except Exception:
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
185 exctype, excval, exctb = sys.exc_info()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
186 tbinfofile = io.StringIO()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
187 traceback.print_tb(exctb, None, tbinfofile)
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
188 tbinfofile.seek(0)
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
189 tbinfo = tbinfofile.read()
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
190 del exctb
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
191 self.sendJson("ClientException", {
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
192 "ExceptionType": str(exctype),
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
193 "ExceptionValue": str(excval),
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
194 "Traceback": tbinfo,
121d426d4ed7 Coded a distributed progress dialog.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 163
diff changeset
195 })
169
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
196
fb8a4182f12e Modified the JSON client to allow for synchroneous callbacks.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 168
diff changeset
197 return None, None

eric ide

mercurial