source: synapse/puzzlebox_synapse_client_thinkgear.py @ 157

Last change on this file since 157 was 152, checked in by sc, 12 years ago

synapse/puzzlebox_synapse_client_thinkgear.py:

  • updated for PySide? QHostAddress handling

synapse/puzzlebox_synapse_protocol_thinkgear.py:

  • packet processing handed off to parent

synapse/puzzlebox_synapse_interface.py:

  • updateInterface added
  • interface updated via timer instead of child processes
  • support for ThinkGear? Connect client processing (commented out by default)

synapse/puzzlebox_synapse_server_thinkgear.py:

  • Emulation timer only called in emulation mode
  • processPacketThinkGear added
  • updateStatus cleanup
  • Property svn:executable set to *
File size: 7.7 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Synapse -Client - Thinkgear
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# This code is released under the GNU Pulic License (GPL) version 2
9# For more information please refer to http://www.gnu.org/copyleft/gpl.html
10#
11# Last Update: 2010.08.09
12#
13#####################################################################
14
15import os, sys
16import signal
17
18try:
19        import PySide as PyQt4
20        from PySide import QtCore
21except:
22        print "Using PyQt4 module"
23        from PyQt4 import QtCore
24else:
25        print "Using PySide module"
26
27from PyQt4 import QtNetwork
28
29import simplejson as json
30
31import puzzlebox_synapse_configuration as configuration
32#import puzzlebox_logger
33
34#####################################################################
35# Globals
36#####################################################################
37
38DEBUG = 1
39
40SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
41SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
42
43CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
44
45DELIMITER = configuration.THINKGEAR_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_thinkgear(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 = 'ThinkGear Client'
85               
86                if ((self.server_host == '') or \
87                         (self.server_host == '*')):
88                        self.server_host=QtNetwork.QHostAddress.Any
89               
90                self.socket.readyRead.connect(self.printReply)
91                self.socket.error.connect(self.displayError)
92               
93                # Perform ThinkGear authorization if enabled
94                if ENABLE_THINKGEAR_AUTHORIZATION:
95                        self.sendCommand(AUTHORIZATION_REQUEST)
96                        self.socket.waitForReadyRead()
97                        self.socket.disconnectFromHost()
98               
99                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS)
100       
101       
102        ##################################################################
103       
104        def printReply(self):
105               
106                socket_buffer = self.socket.readAll()
107               
108                for packet in socket_buffer.split(DELIMITER):
109                       
110                        if packet != '':
111                               
112                                try:
113                                       
114                                        data = json.loads(packet.data())
115                               
116                               
117                                except Exception, e:
118                                       
119                                        if self.DEBUG:
120                                                print "ERROR [%s]: Exception parsing packet:" % self.socket.name,
121                                                print packet.data()
122                                                print "ERROR [%s]: Data packet" % self.socket.name,
123                                                print e
124                                       
125                                        continue
126                               
127                               
128                                else:
129                                       
130                                        if self.DEBUG:
131                                                print "--> [%s] Received:" % self.socket.name,
132                                                print data
133                                       
134                                        self.processPacketThinkGear(data)
135       
136       
137        ##################################################################
138       
139        def displayError(self, socketError):
140               
141                if self.DEBUG:
142                        if ((socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError) and \
143                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
144                                print "ERROR [%s]:" % self.socket.name,
145                                print self.socket.errorString()
146               
147               
148                if (self.parent != None):
149               
150                        if ((socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError) or \
151                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
152                                pass
153                       
154                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
155                                QtGui.QMessageBox.information(self.parent, \
156                                                                   self.socket.name, \
157                                           "The server host was not found. Please check the host name and "
158                                           "port settings.")
159                       
160                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
161                                QtGui.QMessageBox.information(self.parent, \
162                                                                   self.socket.name,
163                                           "The server connection was refused by the peer. Make sure the "
164                                           "server is running, and check that the host name "
165                                           "and port settings are correct.")
166                       
167                        else:
168                                QtGui.QMessageBox.information(self.parent, \
169                                                                   self.socket.name, \
170                                           "The following error occurred: %s." % \
171                                           self.socket.errorString())
172       
173       
174        ##################################################################
175       
176        def sendCommand(self, command):
177               
178                if self.DEBUG:
179                        print "<-- [%s] Sending:" % self.socket.name,
180                        print command
181               
182                self.socket.abort()
183                self.socket.connectToHost(self.server_host, self.server_port)
184               
185                data = json.dumps(command)
186               
187                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
188               
189                self.socket.write(data)
190               
191                try:
192                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
193                except Exception, e:
194                        print "ERROR [%s]: Exception:" % self.socket.name,
195                        print e
196       
197       
198        ##################################################################
199       
200        def processPacketThinkGear(self, packet):
201               
202                if ('isAuthorized' in packet.keys()):
203                        self.isAuthorized = packet['isAuthorized']
204               
205                # Pass GUI updating to Client Interface application
206                if (self.parent != None):
207                        self.parent.processPacketThinkGear(packet)
208               
209       
210        ##################################################################
211       
212        def disconnectFromHost(self):
213               
214                self.socket.disconnectFromHost()
215       
216       
217        ##################################################################
218       
219        def run(self):
220               
221                if self.DEBUG:
222                        print "<---- [%s] Main thread running" % self.socket.name
223               
224                self.exec_()
225
226
227#####################################################################
228# Command line class
229#####################################################################
230
231class puzzlebox_synapse_client_thinkgear_command_line( \
232              puzzlebox_synapse_client_thinkgear):
233       
234        def __init__(self, log, \
235                          command_parameters, \
236                          server_host=SERVER_HOST, \
237                          server_port=SERVER_PORT, \
238                          DEBUG=DEBUG):
239               
240                self.log = log
241                self.DEBUG = DEBUG
242                self.parent = None
243               
244                self.command_parameters = command_parameters
245                self.server_host = server_host
246                self.server_port = server_port
247               
248                self.configureNetwork()
249               
250                self.execute_command_line()
251       
252       
253        ##################################################################
254       
255        def execute_command_line(self):
256               
257                (command) = self.parse_command_line(self.command_parameters)
258               
259                if (command != None):
260               
261                        self.sendCommand(command)
262                       
263                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
264       
265       
266        ##################################################################
267       
268        def parse_command_line(self, command_parameters):
269               
270                try:
271                        command = command_parameters[0]
272                except:
273                        command = None
274               
275               
276                return(command)
277
278
279#####################################################################
280# Main
281#####################################################################
282
283if __name__ == '__main__':
284       
285        # Perform correct KeyboardInterrupt handling
286        signal.signal(signal.SIGINT, signal.SIG_DFL)
287       
288        #log = puzzlebox_logger.puzzlebox_logger(logfile='client_thinkgear')
289        log = None
290       
291        command_parameters = sys.argv[1:]
292       
293        #log.info("Command parameters: %s" % command_parameters)
294       
295        app = QtCore.QCoreApplication(sys.argv)
296       
297        client = puzzlebox_synapse_client_thinkgear_command_line(log, \
298                    command_parameters, \
299                    server_host=SERVER_HOST, \
300                    server_port=SERVER_PORT, \
301                    DEBUG=DEBUG)
302       
303        #while True:
304                #while client.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
305                        #pass
306       
307        sys.exit(app.exec_())
308
Note: See TracBrowser for help on using the repository browser.