source: trunk/Puzzlebox/Synapse/Client.py @ 413

Last change on this file since 413 was 390, checked in by sc, 8 years ago
  • changes for Jigsaw release 1.2.2
File size: 8.2 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2012)
4#
5# This code is released under the GNU Pulic License (GPL) version 2
6# For more information please refer to http://www.gnu.org/copyleft/gpl.html
7
8__changelog__ = """\
9Last Update: 2012.05.06
10"""
11
12import os, sys,time
13#import signal
14import simplejson as json
15
16import Puzzlebox.Synapse.Configuration as configuration
17
18if configuration.ENABLE_PYSIDE:
19        try:
20                import PySide as PyQt4
21                from PySide import QtCore, QtGui, QtNetwork
22        except Exception, e:
23                print "ERROR: Exception importing PySide:",
24                print e
25                configuration.ENABLE_PYSIDE = False
26        else:
27                print "INFO: [Synapse:Client] Using PySide module"
28
29if not configuration.ENABLE_PYSIDE:
30        print "INFO: [Synapse:Client] Using PyQt4 module"
31        from PyQt4 import QtCore, QtGui, QtNetwork
32
33
34#####################################################################
35# Globals
36#####################################################################
37
38DEBUG = configuration.DEBUG
39
40SERVER_HOST = configuration.SYNAPSE_SERVER_HOST
41SERVER_PORT = configuration.SYNAPSE_SERVER_PORT
42
43CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
44
45DELIMITER = configuration.SYNAPSE_DELIMITER
46
47THINKGEAR_CONFIGURATION_PARAMETERS = configuration.THINKGEAR_CONFIGURATION_PARAMETERS
48
49ENABLE_THINKGEAR_AUTHORIZATION = configuration.ENABLE_THINKGEAR_AUTHORIZATION
50AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
51
52#####################################################################
53# Classes
54#####################################################################
55
56class puzzlebox_synapse_client(QtCore.QThread):
57       
58        def __init__(self, log, \
59                          server_host=SERVER_HOST, \
60                          server_port=SERVER_PORT, \
61                          DEBUG=DEBUG, \
62                          parent=None):
63               
64                QtCore.QThread.__init__(self,parent)
65               
66                self.log = log
67                self.DEBUG = DEBUG
68                self.parent=parent
69               
70                self.server_host = server_host
71                self.server_port = server_port
72               
73                self.is_authorized = True
74               
75                self.configureNetwork()
76       
77       
78        ##################################################################
79       
80        def configureNetwork(self):
81       
82                #self.blockSize = 0
83                self.socket = QtNetwork.QTcpSocket()
84                self.socket.name = 'Synapse:Client'
85               
86                if self.server_host == '*':
87                        self.server_host = '127.0.0.1'
88               
89                self.server_host=QtNetwork.QHostAddress(self.server_host)
90               
91                self.socket.readyRead.connect(self.printReply)
92                self.socket.error.connect(self.displayError)
93               
94                # Perform ThinkGear authorization if enabled
95                if ENABLE_THINKGEAR_AUTHORIZATION:
96                        self.sendCommand(AUTHORIZATION_REQUEST)
97                        self.socket.waitForReadyRead()
98                        self.socket.disconnectFromHost()
99               
100                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS)
101       
102       
103        ##################################################################
104       
105        def printReply(self):
106               
107                socket_buffer = self.socket.readAll()
108               
109                for packet in socket_buffer.split(DELIMITER):
110                       
111                        if packet != '':
112                               
113                                try:
114                                       
115                                        data = json.loads(packet.data())
116                               
117                               
118                                except Exception, e:
119                                       
120                                        if self.DEBUG:
121                                                print "ERROR [%s]: Exception parsing packet:" % self.socket.name,
122                                                print packet.data()
123                                                print "ERROR [%s]: Data packet" % self.socket.name,
124                                                print e
125                                       
126                                        continue
127                               
128                               
129                                else:
130                                       
131                                        if self.DEBUG > 1:
132                                                print "--> [%s] Received:" % self.socket.name,
133                                                print data
134                                       
135                                        #self.processPacketThinkGear(data)
136                                        self.processPacketEEG(data)
137       
138       
139        ##################################################################
140       
141        def displayError(self, socketError):
142               
143                if self.DEBUG:
144                        if ((socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError) and \
145                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
146                                print "ERROR [%s]:" % self.socket.name,
147                                print self.socket.errorString()
148               
149               
150                if (self.parent != None):
151               
152                        if ((socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError) or \
153                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
154                                pass
155                       
156                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
157                                try:
158                                        QtGui.QMessageBox.information(self.parent, \
159                                                                      self.socket.name, \
160                                           "The server host was not found. Please check the host name and "
161                                           "port settings.")
162                                except:
163                                        pass
164                               
165                                if self.DEBUG:
166                                        print "The server host was not found. ",
167                                        print "Please check the host name and ",
168                                        print "port settings."
169
170                       
171                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
172                                try:
173                                        QtGui.QMessageBox.information(self.parent, \
174                                                                   self.socket.name,
175                                           "The server connection was refused by the peer. Make sure the "
176                                           "server is running, and check that the host name "
177                                           "and port settings are correct.")
178                                except:
179                                        pass
180                               
181                                if self.DEBUG:
182                                        print "The server connection was refused by the peer. ",
183                                        print "Make sure the ",
184                                        print "server is running, and check that the host name ",
185                                        print "and port settings are correct."
186
187                       
188                        else:
189##                              try:
190##                                      QtGui.QMessageBox.information(self.parent, \
191##                                                                 self.socket.name, \
192##                                         "The following error occurred: %s." % \
193##                                         self.socket.errorString())
194##                              except:
195##                                      pass
196                               
197                                if self.DEBUG:
198                                        print "The following error occurred: %s." % \
199                                                self.socket.errorString()
200       
201       
202        ##################################################################
203       
204        def sendCommand(self, command):
205               
206                if self.DEBUG:
207                        print "<-- [%s] Sending:" % self.socket.name,
208                        print command
209               
210                self.socket.abort()
211                self.socket.connectToHost(self.server_host, self.server_port)
212               
213                data = json.dumps(command)
214               
215                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
216               
217                self.socket.write(data)
218               
219                try:
220                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
221                except Exception, e:
222                        print "ERROR [%s]: Exception:" % self.socket.name,
223                        print e
224       
225       
226        ##################################################################
227       
228        #def processPacketThinkGear(self, packet):
229        def processPacketEEG(self, packet):
230               
231                # ThinkGear Connect server does not provide a timestamp in its JSON protocol
232                if ('timestamp' not in packet.keys()):
233                        packet['timestamp'] = time.time()
234               
235                if ('isAuthorized' in packet.keys()):
236                        self.isAuthorized = packet['isAuthorized']
237               
238                # Pass GUI updating to Client Interface application
239                if (self.parent != None):
240                        #self.parent.processPacketThinkGear(packet)
241                        self.parent.processPacketEEG(packet)
242               
243       
244        ##################################################################
245       
246        def disconnectFromHost(self):
247               
248                self.socket.disconnectFromHost()
249       
250       
251        ##################################################################
252       
253        def run(self):
254               
255                if self.DEBUG:
256                        print "<---- [%s] Main thread running" % self.socket.name
257               
258                self.exec_()
259       
260       
261        ##################################################################
262       
263        def stop(self):
264               
265                try:
266                        self.disconnectFromHost()
267                except:
268                        pass
269       
270       
271        ##################################################################
272       
273        def exitThread(self, callThreadQuit=True):
274               
275                self.stop()
276               
277                if callThreadQuit:
278                        QtCore.QThread.quit(self)
279
280
281#####################################################################
282# Command line class
283#####################################################################
284
285class puzzlebox_synapse_client_console(puzzlebox_synapse_client):
286       
287        def __init__(self, log, \
288                          command_parameters, \
289                          server_host=SERVER_HOST, \
290                          server_port=SERVER_PORT, \
291                          DEBUG=DEBUG):
292               
293                self.log = log
294                self.DEBUG = DEBUG
295                self.parent = None
296               
297                self.command_parameters = command_parameters
298                self.server_host = server_host
299                self.server_port = server_port
300               
301                self.configureNetwork()
302               
303                self.execute_command_line()
304       
305       
306        ##################################################################
307       
308        def execute_command_line(self):
309               
310                (command) = self.parse_command_line(self.command_parameters)
311               
312                if (command != None):
313               
314                        self.sendCommand(command)
315                       
316                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
317       
318       
319        ##################################################################
320       
321        def parse_command_line(self, command_parameters):
322               
323                command = None
324               
325                for each in command_parameters:
326                        if each.startswith("--command="):
327                                command = each[ len("--command="): ]
328               
329               
330                return(command)
331
Note: See TracBrowser for help on using the repository browser.