source: remote_control/puzzlebox_brainstorms_network_client_thinkgear.py @ 111

Last change on this file since 111 was 111, checked in by sc, 11 years ago
  • PySide? import attempted before PyQt4 where available
  • problem specifying port when calling socket.listen on QTcpServer
File size: 7.4 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Network - 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.07.10
12#
13#####################################################################
14
15import os, sys
16import signal
17
18try:
19        import PySide as PyQt4
20        from PySide import QtCore, QtNetwork
21except:
22        print "Using PyQt4 module"
23        from PyQt4 import QtCore, QtNetwork
24else:
25        print "Using PySide module"
26
27#from PyQt4 import QtCore, QtNetwork
28
29import simplejson as json
30
31import puzzlebox_brainstorms_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
49THINKGEAR_AUTHORIZATION_ENABLED = configuration.THINKGEAR_AUTHORIZATION_ENABLED
50AUTHORIZATION_REQUEST = configuration.THINKGEAR_AUTHORIZATION_REQUEST
51
52#####################################################################
53# Classes
54#####################################################################
55
56class puzzlebox_brainstorms_network_client_thinkgear:
57       
58        def __init__(self, log, \
59                          server_host=SERVER_HOST, \
60                          server_port=SERVER_PORT, \
61                          DEBUG=DEBUG, \
62                          parent=None):
63               
64                self.log = log
65                self.DEBUG = DEBUG
66                self.parent=parent
67               
68                self.server_host = server_host
69                self.server_port = server_port
70               
71                self.is_authorized = True
72               
73                self.configureNetwork()
74       
75       
76        ##################################################################
77       
78        def configureNetwork(self):
79       
80                #self.blockSize = 0
81                self.socket = QtNetwork.QTcpSocket()
82                self.socket.name = 'ThinkGear Client'
83               
84                self.socket.readyRead.connect(self.printReply)
85                self.socket.error.connect(self.displayError)
86               
87                # Perform ThinkGear authorization if enabled
88                if THINKGEAR_AUTHORIZATION_ENABLED:
89                        self.sendCommand(AUTHORIZATION_REQUEST)
90                        self.socket.waitForReadyRead()
91                        self.socket.disconnectFromHost()
92               
93                self.sendCommand(THINKGEAR_CONFIGURATION_PARAMETERS)
94       
95       
96        ##################################################################
97       
98        def printReply(self):
99               
100                socket_buffer = self.socket.readAll()
101               
102                for packet in socket_buffer.split(DELIMITER):
103                       
104                        if packet != '':
105                               
106                                try:
107                                       
108                                        data = json.loads(packet.data())
109                               
110                               
111                                except Exception, e:
112                                       
113                                        if self.DEBUG:
114                                                print "ERROR [%s]: Exception parsing packet:" % self.socket.name,
115                                                print packet.data()
116                                                print "ERROR [%s]: Data packet" % self.socket.name,
117                                                print e
118                                       
119                                        continue
120                               
121                               
122                                else:
123                                       
124                                        if self.DEBUG:
125                                                print "--> [%s] Received:" % self.socket.name,
126                                                print data
127                                       
128                                        self.processPacketThinkGear(data)
129       
130       
131        ##################################################################
132       
133        def displayError(self, socketError):
134               
135                if self.DEBUG:
136                        if ((socketError != QtNetwork.QAbstractSocket.RemoteHostClosedError) and \
137                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
138                                print "ERROR [%s]:" % self.socket.name,
139                                print self.socket.errorString()
140               
141               
142                if (self.parent != None):
143               
144                        if ((socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError) or \
145                                 (socketError != QtNetwork.QAbstractSocket.SocketTimeoutError)):
146                                pass
147                       
148                        elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
149                                QtGui.QMessageBox.information(self.parent, \
150                                                                   self.socket.name, \
151                                           "The server host was not found. Please check the host name and "
152                                           "port settings.")
153                       
154                        elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
155                                QtGui.QMessageBox.information(self.parent, \
156                                                                   self.socket.name,
157                                           "The server connection was refused by the peer. Make sure the "
158                                           "server is running, and check that the host name "
159                                           "and port settings are correct.")
160                       
161                        else:
162                                QtGui.QMessageBox.information(self.parent, \
163                                                                   self.socket.name, \
164                                           "The following error occurred: %s." % \
165                                           self.socket.errorString())
166       
167       
168        ##################################################################
169       
170        def sendCommand(self, command):
171               
172                if self.DEBUG:
173                        print "<-- [%s] Sending:" % self.socket.name,
174                        print command
175               
176                self.socket.abort()
177                self.socket.connectToHost(self.server_host, self.server_port)
178               
179                data = json.dumps(command)
180               
181                self.socket.waitForConnected(CLIENT_NO_REPLY_WAIT)
182               
183                self.socket.write(data)
184               
185                try:
186                        self.socket.waitForBytesWritten(CLIENT_NO_REPLY_WAIT)
187                except Exception, e:
188                        print "ERROR [%s]: Exception:" % self.socket.name,
189                        print e
190       
191       
192        ##################################################################
193       
194        def processPacketThinkGear(self, packet):
195               
196                if ('isAuthorized' in packet.keys()):
197                        self.isAuthorized = packet['isAuthorized']
198               
199                # Pass GUI updating to Client Interface application
200                if (self.parent != None):
201                        self.parent.processPacketThinkGear(packet)
202               
203       
204        ##################################################################
205       
206        def disconnectFromHost(self):
207               
208                self.socket.disconnectFromHost()
209
210
211#####################################################################
212# Command line class
213#####################################################################
214
215class puzzlebox_brainstorms_network_client_thinkgear_command_line( \
216              puzzlebox_brainstorms_network_client_thinkgear):
217       
218        def __init__(self, log, \
219                          command_parameters, \
220                          server_host=SERVER_HOST, \
221                          server_port=SERVER_PORT, \
222                          DEBUG=DEBUG):
223               
224                self.log = log
225                self.DEBUG = DEBUG
226                self.parent = None
227               
228                self.command_parameters = command_parameters
229                self.server_host = server_host
230                self.server_port = server_port
231               
232                self.configureNetwork()
233               
234                self.execute_command_line()
235       
236       
237        ##################################################################
238       
239        def execute_command_line(self):
240               
241                (command) = self.parse_command_line(self.command_parameters)
242               
243                if (command != None):
244               
245                        self.sendCommand(command)
246                       
247                        self.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT)
248       
249       
250        ##################################################################
251       
252        def parse_command_line(self, command_parameters):
253               
254                try:
255                        command = command_parameters[0]
256                except:
257                        command = None
258               
259               
260                return(command)
261
262
263#####################################################################
264# Main
265#####################################################################
266
267if __name__ == '__main__':
268       
269        # Perform correct KeyboardInterrupt handling
270        signal.signal(signal.SIGINT, signal.SIG_DFL)
271       
272        #log = puzzlebox_logger.puzzlebox_logger(logfile='client_thinkgear')
273        log = None
274       
275        command_parameters = sys.argv[1:]
276       
277        #log.info("Command parameters: %s" % command_parameters)
278       
279        app = QtCore.QCoreApplication(sys.argv)
280       
281        client = puzzlebox_brainstorms_network_client_thinkgear_command_line(log, \
282                    command_parameters, \
283                    server_host=SERVER_HOST, \
284                    server_port=SERVER_PORT, \
285                    DEBUG=DEBUG)
286       
287        #while True:
288                #while client.socket.waitForReadyRead(CLIENT_NO_REPLY_WAIT):
289                        #pass
290       
291        sys.exit(app.exec_())
292
Note: See TracBrowser for help on using the repository browser.