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

Last change on this file since 281 was 281, checked in by sc, 10 years ago
  • initial work for integration with Puzzlebox Jigsaw
  • searchForThinkGearDevices cleanup for multiple ThinkGear? devices
  • GUI cleanup for multiple ThinkGear? devices
  • Property svn:executable set to *
File size: 7.5 KB
Line 
1# -*- coding: utf-8 -*-
2
3# Copyright Puzzlebox Productions, LLC (2010-2011)
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# Old Class Names:
9#       puzzlebox_synapse_client_thinkgear = QtClient
10#       puzzlebox_synapse_client_thinkgear_command_line = CLIClient
11
12__changelog__ = """\
13Last Update: 2011.02.07
14"""
15
16import os, sys
17import signal
18
19try:
20        import PySide as PyQt4
21        from PySide import QtCore, QtGui, QtNetwork
22except:
23        print "Using PyQt4 module"
24        from PyQt4 import QtCore, QtGui, QtNetwork
25else:
26        print "Using PySide module"
27
28#from PyQt4 import QtNetwork
29import simplejson as json
30import Configuration as configuration
31#import puzzlebox_logger
32
33#####################################################################
34# Globals
35#####################################################################
36
37DEBUG = 2
38
39SERVER_HOST = configuration.THINKGEAR_SERVER_HOST
40SERVER_PORT = configuration.THINKGEAR_SERVER_PORT
41
42CLIENT_NO_REPLY_WAIT = configuration.CLIENT_NO_REPLY_WAIT * 1000
43
44DELIMITER = configuration.THINKGEAR_DELIMITER
45
46THINKGEAR_CONFIGURATION_PARAMETERS = configuration.THINKGEAR_CONFIGURATION_PARAMETERS
47
48ENABLE_THINKGEAR_AUTHORIZATION = configuration.ENABLE_THINKGEAR_AUTHORIZATION
49AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
50
51#####################################################################
52# Classes
53#####################################################################
54
55class QtClient(QtCore.QThread):
56       
57        def __init__(self, log, \
58                          server_host=SERVER_HOST, \
59                          server_port=SERVER_PORT, \
60                          DEBUG=DEBUG, \
61                          parent=None):
62               
63                QtCore.QThread.__init__(self,parent)
64               
65                self.log = log
66                self.DEBUG = DEBUG
67                self.parent=parent
68               
69                self.server_host = server_host
70                self.server_port = server_port
71               
72                self.is_authorized = True
73               
74                self.configureNetwork()
75       
76       
77        ##################################################################
78       
79        def configureNetwork(self):
80       
81                #self.blockSize = 0
82                self.socket = QtNetwork.QTcpSocket()
83                self.socket.name = 'ThinkGear Client'
84               
85                if self.server_host == '*':
86                        self.server_host = '127.0.0.1'
87               
88                self.server_host=QtNetwork.QHostAddress(self.server_host)
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 > 1:
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                                try:
156                                        QtGui.QMessageBox.information(self.parent, \
157                                                                      self.socket.name, \
158                                           "The server host was not found. Please check the host name and "
159                                           "port settings.")
160                                except:
161                                        pass
162                               
163                                if self.DEBUG:
164                                        print "The server host was not found. ",
165                                        print "Please check the host name and ",
166                                        print "port settings."
167
168                       
169                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
170                                try:
171                                        QtGui.QMessageBox.information(self.parent, \
172                                                                   self.socket.name,
173                                           "The server connection was refused by the peer. Make sure the "
174                                           "server is running, and check that the host name "
175                                           "and port settings are correct.")
176                                except:
177                                        pass
178                               
179                                if self.DEBUG:
180                                        print "The server connection was refused by the peer. ",
181                                        print "Make sure the ",
182                                        print "server is running, and check that the host name ",
183                                        print "and port settings are correct."
184
185                       
186                        else:
187##                              try:
188##                                      QtGui.QMessageBox.information(self.parent, \
189##                                                                 self.socket.name, \
190##                                         "The following error occurred: %s." % \
191##                                         self.socket.errorString())
192##                              except:
193##                                      pass
194                               
195                                if self.DEBUG:
196                                        print "The following error occurred: %s." % \
197                                                self.socket.errorString()
198       
199       
200        ##################################################################
201       
202        def sendCommand(self, command):
203               
204                if self.DEBUG:
205                        print "<-- [%s] Sending:" % self.socket.name,
206                        print command
207               
208                self.socket.abort()
209                self.socket.connectToHost(self.server_host, self.server_port)
210               
211                data = json.dumps(command)
212               
213                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
214               
215                self.socket.write(data)
216               
217                try:
218                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
219                except Exception, e:
220                        print "ERROR [%s]: Exception:" % self.socket.name,
221                        print e
222       
223       
224        ##################################################################
225       
226        def processPacketThinkGear(self, packet):
227               
228                if ('isAuthorized' in packet.keys()):
229                        self.isAuthorized = packet['isAuthorized']
230               
231                # Pass GUI updating to Client Interface application
232                if (self.parent != None):
233                        self.parent.processPacketThinkGear(packet)
234               
235       
236        ##################################################################
237       
238        def disconnectFromHost(self):
239               
240                self.socket.disconnectFromHost()
241       
242       
243        ##################################################################
244       
245        def run(self):
246               
247                if self.DEBUG:
248                        print "<---- [%s] Main thread running" % self.socket.name
249               
250                self.exec_()
251
252
253#####################################################################
254# Command line class
255#####################################################################
256
257class CLIClient(QtClient):
258       
259        def __init__(self, log, \
260                          command_parameters, \
261                          server_host=SERVER_HOST, \
262                          server_port=SERVER_PORT, \
263                          DEBUG=DEBUG):
264               
265                self.log = log
266                self.DEBUG = DEBUG
267                self.parent = None
268               
269                self.command_parameters = command_parameters
270                self.server_host = server_host
271                self.server_port = server_port
272               
273                self.configureNetwork()
274               
275                self.execute_command_line()
276       
277       
278        ##################################################################
279       
280        def execute_command_line(self):
281               
282                (command) = self.parse_command_line(self.command_parameters)
283               
284                if (command != None):
285               
286                        self.sendCommand(command)
287                       
288                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
289       
290       
291        ##################################################################
292       
293        def parse_command_line(self, command_parameters):
294               
295                command = None
296               
297                for each in command_parameters:
298                        if each.startswith("--command="):
299                                command = each[ len("--command="): ]
300               
301               
302                return(command)
303
Note: See TracBrowser for help on using the repository browser.