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

Last change on this file since 389 was 389, checked in by sc, 9 years ago
  • work underway to shift session data management from Synapse:ThinkGear:Protocol to Synapse:Session
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 ('timpstamp' not in packet.keys()):
233                        #print packet
234                        packet['timestamp'] = time.time()
235                        #print packet
236               
237                if ('isAuthorized' in packet.keys()):
238                        self.isAuthorized = packet['isAuthorized']
239               
240                # Pass GUI updating to Client Interface application
241                if (self.parent != None):
242                        #self.parent.processPacketThinkGear(packet)
243                        self.parent.processPacketEEG(packet)
244               
245       
246        ##################################################################
247       
248        def disconnectFromHost(self):
249               
250                self.socket.disconnectFromHost()
251       
252       
253        ##################################################################
254       
255        def run(self):
256               
257                if self.DEBUG:
258                        print "<---- [%s] Main thread running" % self.socket.name
259               
260                self.exec_()
261       
262       
263        ##################################################################
264       
265        def stop(self):
266               
267                try:
268                        self.disconnectFromHost()
269                except:
270                        pass
271       
272       
273        ##################################################################
274       
275        def exitThread(self, callThreadQuit=True):
276               
277                self.stop()
278               
279                if callThreadQuit:
280                        QtCore.QThread.quit(self)
281
282
283#####################################################################
284# Command line class
285#####################################################################
286
287class puzzlebox_synapse_client_console(puzzlebox_synapse_client):
288       
289        def __init__(self, log, \
290                          command_parameters, \
291                          server_host=SERVER_HOST, \
292                          server_port=SERVER_PORT, \
293                          DEBUG=DEBUG):
294               
295                self.log = log
296                self.DEBUG = DEBUG
297                self.parent = None
298               
299                self.command_parameters = command_parameters
300                self.server_host = server_host
301                self.server_port = server_port
302               
303                self.configureNetwork()
304               
305                self.execute_command_line()
306       
307       
308        ##################################################################
309       
310        def execute_command_line(self):
311               
312                (command) = self.parse_command_line(self.command_parameters)
313               
314                if (command != None):
315               
316                        self.sendCommand(command)
317                       
318                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
319       
320       
321        ##################################################################
322       
323        def parse_command_line(self, command_parameters):
324               
325                command = None
326               
327                for each in command_parameters:
328                        if each.startswith("--command="):
329                                command = each[ len("--command="): ]
330               
331               
332                return(command)
333
Note: See TracBrowser for help on using the repository browser.