source: trunk/synapse/puzzlebox_synapse_client_thinkgear.py @ 161

Last change on this file since 161 was 160, checked in by sc, 11 years ago

Puzzlebox-Synapse.nsi:

  • 0.3.0 release

puzzlebox_synapse_client_thinkgear.py:

  • fixed localhost addressing issue

puzzlebox_synapse_interface.py:

  • fixed typo

setup_win32.py:

  • initial checkin
  • 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 == '*':
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:
132                                                print "--> [%s] Received:" % self.socket.name,
133                                                print data
134                                       
135                                        self.processPacketThinkGear(data)
136       
137       
138        ##################################################################
139       
140        def displayError(self, socketError):
141               
142                if self.DEBUG:
143                        if ((socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError) and \
144                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
145                                print "ERROR [%s]:" % self.socket.name,
146                                print self.socket.errorString()
147               
148               
149                if (self.parent != None):
150               
151                        if ((socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError) or \
152                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
153                                pass
154                       
155                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
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                       
161                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
162                                QtGui.QMessageBox.information(self.parent, \
163                                                                   self.socket.name,
164                                           "The server connection was refused by the peer. Make sure the "
165                                           "server is running, and check that the host name "
166                                           "and port settings are correct.")
167                       
168                        else:
169                                QtGui.QMessageBox.information(self.parent, \
170                                                                   self.socket.name, \
171                                           "The following error occurred: %s." % \
172                                           self.socket.errorString())
173       
174       
175        ##################################################################
176       
177        def sendCommand(self, command):
178               
179                if self.DEBUG:
180                        print "<-- [%s] Sending:" % self.socket.name,
181                        print command
182               
183                self.socket.abort()
184                self.socket.connectToHost(self.server_host, self.server_port)
185               
186                data = json.dumps(command)
187               
188                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
189               
190                self.socket.write(data)
191               
192                try:
193                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
194                except Exception, e:
195                        print "ERROR [%s]: Exception:" % self.socket.name,
196                        print e
197       
198       
199        ##################################################################
200       
201        def processPacketThinkGear(self, packet):
202               
203                if ('isAuthorized' in packet.keys()):
204                        self.isAuthorized = packet['isAuthorized']
205               
206                # Pass GUI updating to Client Interface application
207                if (self.parent != None):
208                        self.parent.processPacketThinkGear(packet)
209               
210       
211        ##################################################################
212       
213        def disconnectFromHost(self):
214               
215                self.socket.disconnectFromHost()
216       
217       
218        ##################################################################
219       
220        def run(self):
221               
222                if self.DEBUG:
223                        print "<---- [%s] Main thread running" % self.socket.name
224               
225                self.exec_()
226
227
228#####################################################################
229# Command line class
230#####################################################################
231
232class puzzlebox_synapse_client_thinkgear_command_line( \
233              puzzlebox_synapse_client_thinkgear):
234       
235        def __init__(self, log, \
236                          command_parameters, \
237                          server_host=SERVER_HOST, \
238                          server_port=SERVER_PORT, \
239                          DEBUG=DEBUG):
240               
241                self.log = log
242                self.DEBUG = DEBUG
243                self.parent = None
244               
245                self.command_parameters = command_parameters
246                self.server_host = server_host
247                self.server_port = server_port
248               
249                self.configureNetwork()
250               
251                self.execute_command_line()
252       
253       
254        ##################################################################
255       
256        def execute_command_line(self):
257               
258                (command) = self.parse_command_line(self.command_parameters)
259               
260                if (command != None):
261               
262                        self.sendCommand(command)
263                       
264                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
265       
266       
267        ##################################################################
268       
269        def parse_command_line(self, command_parameters):
270               
271                try:
272                        command = command_parameters[0]
273                except:
274                        command = None
275               
276               
277                return(command)
278
279
280#####################################################################
281# Main
282#####################################################################
283
284if __name__ == '__main__':
285       
286        # Perform correct KeyboardInterrupt handling
287        signal.signal(signal.SIGINT, signal.SIG_DFL)
288       
289        #log = puzzlebox_logger.puzzlebox_logger(logfile='client_thinkgear')
290        log = None
291       
292        command_parameters = sys.argv[1:]
293       
294        #log.info("Command parameters: %s" % command_parameters)
295       
296        app = QtCore.QCoreApplication(sys.argv)
297       
298        client = puzzlebox_synapse_client_thinkgear_command_line(log, \
299                    command_parameters, \
300                    server_host=SERVER_HOST, \
301                    server_port=SERVER_PORT, \
302                    DEBUG=DEBUG)
303       
304        #while True:
305                #while client.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
306                        #pass
307       
308        sys.exit(app.exec_())
309
Note: See TracBrowser for help on using the repository browser.