Did a little Camera/Engine work.
[krufty_fps.git] / client_twisted.py
blobdd9a7e35f1720a3fc56f66d097304f5d0dd0d64f
1 #!/usr/bin/python
3 # PyOpenGL + Pygame
5 # various constants
7 CONFIG = 'game_config.xml'
8 PROTOCOL_FILE = 'protocol.py'
10 WINDOW_SIZE = (640, 480)
11 WINDOW_CAPTION = "Testing stuff"
13 BROADCAST = 50030
14 BROADCAST_BIND = 50031
16 MESSAGE = 40030
17 BUFSIZE = 120
18 ECHO_TIME = 5
19 TIMEOUT = .1
20 BROADCAST = ''
21 MULTICAST = '234.0.0.1'
22 SERVER_TIMEOUT = 0
24 protocol_file = open(PROTOCOL_FILE)
25 exec(protocol_file)
26 protocol_file.close()
28 the_functions = {}
29 in_script = 0
31 import os, sys
32 from os import *
33 from os.path import *
34 sys.path.insert(0, 'pygame_gui')
36 import threading
37 from socket import *
38 from xml.dom.minidom import parse, parseString
39 from threading import Lock
40 from signal import *
41 from zipfile import *
43 from twisted.internet.protocol import DatagramProtocol
44 from twisted.internet import reactor
45 from twisted.internet import task
47 import pygame
48 from pygame import *
50 import lamina
52 import OpenGL
53 import OpenGL.GL
54 from OpenGL.GL import *
55 import OpenGL.GLU
56 from OpenGL.GLU import *
58 from DerGUI import GUISystem
60 the_event_receiver = 0
62 global the_engine
63 global the_client
65 class Engine:
67 def __init__(self, config):
69 self.config = config
70 self.running = 1
72 global the_engine
73 the_engine = self
75 video_flags = OPENGL|DOUBLEBUF
77 pygame.init()
78 self.display = pygame.display.set_mode(config['window_size'], video_flags)
79 self.resize((config['window_size']))
81 glShadeModel(GL_SMOOTH)
82 glClearColor(self.config['background_color'][0],
83 self.config['background_color'][1],
84 self.config['background_color'][2],
85 self.config['background_color'][3])
87 glClearDepth(1.0)
88 glEnable(GL_DEPTH_TEST)
89 glDepthFunc(GL_LEQUAL)
90 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
92 pygame.display.set_caption(config['window_title'])
94 self.gui_screen = lamina.LaminaScreenSurface()
96 self.gui_system = GUISystem('widgets.xml', 'theme_two.zip')
97 self.change = 0
99 self.files = {}
100 self.events = EventReceiver()
102 # self.files is a map of filename to file
104 # The file has this:
105 # {parent, [children], {object_defs},
106 # {menu_defs}, {object_instances}, {menu_instances}}
108 self.zipfiles = []
110 for file in listdir(self.config['pack_dir']):
111 if (is_zipfile(os.path.join(self.config['pack_dir'], file))):
112 self.zipfiles.append(ZipFile(os.path.join(self.config['pack_dir'], file)))
114 self.running = self.addFile(self.config['init'], '')
116 if not self.running:
117 print "Engine.__init__(): Failed adding initial file"
119 return
121 def run(self):
123 global the_client
125 self.gui_screen.refresh()
127 while self.running:
129 self.process_events()
131 self.draw()
133 pygame.display.flip()
135 return
137 def killGame(self):
139 reactor.callFromThread(self.killThreadGame)
141 return
143 def killThreadGame(self):
145 reactor.stop()
147 return
149 def process_events(self):
151 change = 0
153 for e in pygame.event.get():
154 if e.type == QUIT:
155 self.running = 0
156 print "Should be quitting..."
158 self.killGame()
160 self.change = self.gui_system.event(e)
162 new_event = self.convertEvent(e)
163 self.events.addEvent(new_event)
165 iterating = 1
166 while iterating:
168 if self.events.size():
169 new_event = self.events.getEvent()
170 else:
171 iterating = 0
173 if not iterating:
174 return
176 if iterating:
177 for file in self.files.keys():
179 for name in self.files[file]['object_instances'].keys():
181 self.files[file]['object_instances'][name].event(new_event[0], new_event[1])
183 return
185 def convertEvent(self, e):
187 data = {}
189 if e.type == QUIT:
190 data['none'] = ''
192 if e.type == ACTIVEEVENT:
193 data['gain'] = e.gain
194 data['state'] = e.state
196 if e.type == KEYDOWN:
197 data['unicode'] = e.unicode
198 data['key'] = e.key
199 data['mod'] = e.mod
201 if e.type == KEYUP:
202 data['key'] = e.key
203 data['mod'] = e.mod
205 if e.type == MOUSEMOTION:
206 data['pos'] = e.pos
207 data['rel'] = e.rel
208 data['buttons'] = e.buttons
210 if e.type == MOUSEBUTTONUP:
211 data['pos'] = e.pos
212 data['button'] = e.button
214 if e.type == MOUSEBUTTONDOWN:
215 data['pos'] = e.pos
216 data['button'] = e.button
218 if e.type == JOYAXISMOTION:
219 data['joy'] = e.joy
220 data['axis'] = e.axis
221 data['value'] = e.value
223 if e.type == JOYBALLMOTION:
224 data['joy'] = e.joy
225 data['ball'] = e.ball
226 data['rel'] = e.rel
228 if e.type == JOYHATMOTION:
229 data['joy'] = e.joy
230 data['hat'] = e.hat
231 data['value'] = e.value
233 if e.type == JOYBUTTONUP:
234 data['joy'] = e.joy
235 data['button'] = e.button
237 if e.type == JOYBUTTONDOWN:
238 data['joy'] = e.joy
239 data['button'] = e.button
241 if e.type == VIDEORESIZE:
242 data['size'] = e.size
243 data['w'] = e.w
244 data['h'] = e.h
246 if e.type == VIDEOEXPOSE:
247 data['none'] = ''
249 if e.type == USEREVENT:
250 data['code'] = e.code
252 type = ''
254 if e.type == QUIT: type = "QUIT"
255 if e.type == ACTIVEEVENT: type = "ACTIVEEVENT"
256 if e.type == KEYDOWN: type = "KEYDOWN"
257 if e.type == KEYUP: type = "KEYUP"
258 if e.type == MOUSEMOTION : type = "MOUSEMOTION"
259 if e.type == MOUSEBUTTONUP: type = "MOUSEBUTTONUP"
260 if e.type == MOUSEBUTTONDOWN: type = "MOUSEBUTTONDOWN"
261 if e.type == JOYAXISMOTION: type = "JOYAXISMOTION"
262 if e.type == JOYBALLMOTION: type = "JOYBALLMOTION"
263 if e.type == JOYHATMOTION: type = "JOYHATMOTION"
264 if e.type == JOYBUTTONUP: type = "JOYBUTTONUP"
265 if e.type == JOYBUTTONDOWN: type = "JOYBUTTONDOWN"
266 if e.type == VIDEORESIZE: type = "VIDEORESIZE"
267 if e.type == VIDEOEXPOSE: type = "VIDEOEXPOSE"
268 if e.type == USEREVENT: type = "USEREVENT"
270 return [type, data]
272 def draw(self):
274 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
275 glLoadIdentity()
277 # draw stuff
279 glLoadIdentity()
281 if self.change:
282 self.gui_system.draw(self.gui_screen.surf)
283 self.gui_screen.refresh()
284 self.gui_screen.display()
286 def resize(self, (width, height)):
287 if height==0:
288 height=1
289 glViewport(0, 0, width, height)
290 glMatrixMode(GL_PROJECTION)
291 glLoadIdentity()
292 gluPerspective(45, 1.0*width/height, 0.1, 100.0)
293 glMatrixMode(GL_MODELVIEW)
294 glLoadIdentity()
296 return
298 def addFile(self, filename, parent):
300 # Because I have alot of nesting in this function,
301 # I am using 2 space formatting
303 for zipfile in self.zipfiles:
305 for file in zipfile.namelist():
307 if (file == filename):
308 dom = parseString(zipfile.read(file))
310 object_instances_d = []
311 menu_instances = []
313 if dom.childNodes[0].nodeName == 'game':
314 self.files[filename] = {
315 'object_defs': {},
316 'children': [],
317 'parent': '',
318 'object_instances': {},
319 'menu_instances': {},
320 'menu_defs': {}}
322 for node in dom.childNodes[0].childNodes:
324 if (node.nodeName == 'def'):
326 for sub_node in node.childNodes:
328 if (sub_node.nodeName == 'object'):
330 temp_object_def = {}
332 for suber_node in sub_node.childNodes:
334 if (suber_node.nodeName == 'name'):
335 if len(suber_node.childNodes):
336 temp_object_def['name'] = suber_node.childNodes[0].nodeValue
338 if (suber_node.nodeName == 'script'):
339 if len(suber_node.childNodes):
340 temp_object_def['script'] = suber_node.childNodes[0].nodeValue
342 if (suber_node.nodeName == 'tangible'):
343 if len(suber_node.childNodes):
344 temp_object_def['tangible'] = suber_node.childNodes[0].nodeValue
346 if (suber_node.nodeName == 'type'):
347 if len(suber_node.childNodes):
348 temp_object_def['type'] = suber_node.childNodes[0].nodeValue
350 self.files[filename]['object_defs'][temp_object_def['name']] = temp_object_def
351 temp_object_def = {}
353 if (sub_node.nodeName == 'menu'):
355 temp_menu_def = {}
356 temp_menu_def['elements'] = {}
358 temp_element_set = {}
360 for suber_node in sub_node.childNodes:
362 if (suber_node.nodeName == 'name'):
363 temp_menu_def['name'] = suber_node.childNodes[0].nodeValue
365 if (suber_node.nodeName == 'elements'):
367 for suberer_node in suber_node.childNodes:
369 if (suberer_node.nodeType != 3 and suberer_node.nodeType != 8):
370 if (suberer_node.hasAttribute('name')):
371 temp_element_set['name'] = suberer_node.getAttribute('name')
373 if (suberer_node.hasAttribute('x')):
374 temp_element_set['x'] = int(suberer_node.getAttribute('x'))
376 if (suberer_node.hasAttribute('y')):
377 temp_element_set['y'] = int(suberer_node.getAttribute('y'))
379 if (suberer_node.hasAttribute('width')):
380 temp_element_set['width'] = int(suberer_node.getAttribute('width'))
382 if (suberer_node.hasAttribute('height')):
383 temp_element_set['height'] = int(suberer_node.getAttribute('height'))
385 if (suberer_node.hasAttribute('parent')):
386 temp_element_set['parent'] = suberer_node.getAttribute('parent')
388 if (suberer_node.hasAttribute('target')):
389 temp_element_set['target'] = suberer_node.getAttribute('target')
391 if (suberer_node.hasAttribute('text')):
392 temp_element_set['text'] = suberer_node.getAttribute('text')
394 temp_element_set['type'] = suberer_node.nodeName
395 temp_menu_def['elements'][temp_element_set['name']] = temp_element_set
396 temp_element_set = {}
398 self.files[filename]['menu_defs'][temp_menu_def['name']] = temp_menu_def
400 temp_menu_def = {}
401 temp_element_set = {}
403 if (node.nodeName == 'instance'):
405 for sub_node in node.childNodes:
407 if (sub_node.nodeName == 'object'):
408 object_instances_d.append(sub_node.childNodes[0].nodeValue)
410 if (sub_node.nodeName == 'menu'):
411 menu_instances.append(sub_node.childNodes[0].nodeValue)
413 if (parent != ''):
414 self.files[parent]['children'].append(filename)
415 self.files[filename]['parent'] = parent
417 # create instances
419 for menuname, menu_data in self.files[filename]['menu_defs'].iteritems():
420 self.files[filename]['menu_instances'][menuname] = Menu(menu_def=menu_data)
422 for menuname in menu_instances:
423 if (self.files[filename]['menu_instances'].has_key(menuname)):
424 self.files[filename]['menu_instances'][menuname].show()
426 for file in self.files.keys():
427 if self.files[file]['menu_instances'].has_key(menuname):
428 self.files[file]['menu_instances'][menuname].show()
430 for objectname in object_instances_d:
431 self.addObject(objectname)
433 return 1
434 return 0
435 # ending 2-space formatting
437 def removeFile(self, filename):
439 if (self.files.has_key(filename)):
441 for child in self.files[filename]['children']:
442 self.removeFile(child)
444 del self.files[filename]['children']
446 parent = self.files[filename]['parent']
448 self.files[parent]['children'].pop(self.files[parent]['children'].index(filename))
450 del self.files[filename]
452 return
454 def getVisibleMenus(self):
456 menus = {}
458 for file, contents in self.files.iteritems():
459 for name, menu in contents['menu_instances'].iteritems():
460 if not menu.hidden:
461 menus[name] = menu
463 return menus
465 def hideAllMenus(self):
467 for file, contents in self.files.iteritems():
468 for name, menu in contents['menu_instances'].iteritems():
469 menu.hide()
471 return
473 def showMenu(self, menu_name):
475 for file, contents in self.files.iteritems():
476 for name, menu in contents['menu_instances'].iteritems():
477 if contents['menu_instances'].has_key(menu_name):
478 contents['menu_instances'][menu_name].show()
480 return
482 def hideMenu(self, menu_name):
484 for file, contents in self.files:
485 for name, menu in contents['menu_instances'].iteritems():
486 if contents['menu_instances'].has_key(menu_name):
487 contents['menu_instances'][menu_name].hide()
489 return
491 def setMenu(self, menu_name):
493 self.hideAllMenus()
494 self.showMenu(menu_name)
496 return
498 def addObject(self, objectname):
500 for file in self.files.keys():
501 if self.files[file]['object_defs'].has_key(objectname):
502 self.files[file]['object_instances'][objectname] = GameObject(
503 self.files[file]['object_defs'][objectname])
505 return
507 def removeObject(self, objectname):
509 for file in self.files.keys():
510 if self.files[file]['object_defs'].has_key(objectname):
511 del self.files[file]['object_instances'][objectname]
513 return
515 def addListItem(self, menuname, item, data, dvalue):
517 print "Engine.addListItem(): Not implemented yet."
519 return
521 def getImage(self, filename):
523 the_buf = pygame.image.load(self.getStringIOFile(filename))
525 return the_buf
527 def getStringIOFile(self, filename):
529 for zip_file in self.zipfiles:
530 for file in zip_file.namelist():
532 if (filename == file):
534 the_string_io = StringIO.StringIO()
535 print >>the_string_io, zip_file.read(file)
536 the_string_io.seek(0)
538 return the_string_io
539 return ''
541 def getStringData(self, filename):
542 for zip_file in self.zipfiles:
543 for file in zip_file.namelist():
545 if (filename == file):
546 return zip_file.read(file)
547 return ''
549 class Menu:
551 def __init__(self, menu_def):
553 self.menu_def = menu_def
554 self.widgets = {}
556 self.gui_system = the_engine.gui_system
558 for name, element in menu_def['elements'].iteritems():
560 multiplier_x = float(the_engine.config['window_size'][0]) / 100
561 multiplier_y = float(the_engine.config['window_size'][1]) / 100.00
563 dx = float(element['x']) * multiplier_x
564 dy = float(element['y']) * multiplier_y
566 dwidth = float(element['width']) * multiplier_x
567 dheight = float(element['height']) * multiplier_y
569 params = {'x': dx, 'y': dy, 'width': dwidth, 'height': dheight }
571 if element['type'] == 'image':
572 print "Widget.__init__(): 'image' widget type not implemented yet."
574 if element['type'] == 'label':
575 params['text'] = element['text']
576 self.widgets[name] = self.gui_system.makeWidget('label', params)
578 if element['type'] == 'button':
579 params['text'] = element['text']
580 self.widgets[name] = self.gui_system.makeWidget('button', params)
581 self.widgets[name].connect('BUTTON_CLICKED', self.clicked, {'name': name})
583 if element['type'] == 'listbox':
584 print "Widget.__init__(): 'listbox' widget type not implemented yet."
586 if element['type'] == 'textbox':
587 params['type'] == element['text']
588 self.widgets[name] = self.gui_system.makeWidget('textbox', params)
589 self.widgets[name].connect('KEYDOWN', self.key_pressed, {'name': name})
591 self.hidden = 0
593 return
595 def show(self):
597 for widget in self.widgets:
598 self.widgets[widget].show()
600 self.hidden = 0
602 return
604 def hide(self):
606 for widget in self.widgets:
607 self.widgets[widget].hide()
609 self.hidden = 1
611 return
613 def clicked(self, params, more_params):
615 #if self.menu_def['elements'].has_key()
616 # to be continued
618 return
620 class GameObject:
622 def __init__(self, dmold):
624 self.mold = dmold
625 global the_functions
626 global in_script
628 if self.mold['script'] != '':
630 in_script = 1
632 the_file = the_engine.getStringData(self.mold['script'])
633 if the_file != '':
634 exec(the_file)
636 in_script = 0
637 self.my_functions = the_functions
639 the_functions = {}
641 def event(self, event, data):
643 if self.my_functions.has_key(event):
645 self.my_functions[event](data)
647 return
649 class Multicast(DatagramProtocol):
651 def startProtocol(self):
652 self.transport.joinGroup(MULTICAST)
654 def datagramReceived(self, datagram, address):
656 pass
658 class QueueLock:
659 def __init__(self):
661 self.items = []
662 self.items_lock = Lock()
664 def size(self):
666 return len(self.items)
668 def getItem(self):
670 self.items_lock.acquire()
671 the_item = self.items.pop(0)
672 self.items_lock.release()
674 return the_item
676 def addItem(self, new_item):
678 self.items_lock.acquire()
679 self.items.append(new_item)
680 self.items_lock.release()
682 return
684 class EventReceiver(QueueLock):
686 def getEvent(self):
687 return self.getItem()
688 def addEvent(self, event):
690 self.addItem(event)
691 return
693 class CommandLine(QueueLock):
695 def getCommand(self):
696 return self.getItem()
697 def addCommand(self, command):
698 self.addItem(command)
699 return
701 class Client(DatagramProtocol):
703 def datagramReceived(self, data, (host, port)):
705 if data[:len(YOUTHERE)] == YOUTHERE:
707 # print "Client.datagramReceived(): Recieved YOUTHERE, responding with IMHERE"
708 self.transport.write(IMHERE, (host, port))
710 if data[:len(SERVEROFFER)] == SERVEROFFER:
712 split_strings = data.split()
714 self.servers[split_strings[2]] = (host, int(split_strings[1]))
716 event = [SERVEROFFER, {'server_name': split_strings[2],
717 'server_address': self.servers[split_strings[2]]}]
718 the_engine.events.addEvent(event)
720 print "Client.datagramReceived(): Received SERVEROFFER"
722 if data[:len(YOUREIN)] == YOUREIN:
724 if (host, port) == self.requested_server:
725 self.current_server = (host, port)
726 self.requested_server = ()
728 event = [YOUREIN]
729 data = {'server': self.current_server}
730 event.append(data)
732 the_engine.events.addEvent(event)
734 print "Client.datagramReceived(): Received YOUREIN, joined server"
736 return
738 if data[:len(LIST)] == LIST:
740 print "Client.datagramReceived(): Received LIST"
742 split_strings = data.split()
744 self.members = []
746 for string in split_strings:
747 if string != LIST:
748 self.members.append(string)
750 event = [LIST]
751 data = {'names': self.members, 'server_address': (host, port)}
752 event.append(data)
754 the_engine.events.addEvent(event)
756 return
758 if data[:len(SOMEONEJOINED)] == SOMEONEJOINED:
760 if (host, port) == self.current_server:
762 print "Client.datagramReceived(): Received SOMEONEJOINED"
764 left_member = ''
766 for member in self.members:
767 if member == data[len(SOMEONEJOINED) + 1:]:
768 left_member = member
770 if left_member == '':
771 self.members.append(data[len(SOMEONEJOINED) + 1:])
773 event = [SOMEONEJOINED]
774 data = {'name': data[len(SOMEONEJOINED) + 1:]}
776 event.append(data)
778 the_engine.events.addEvent(event)
780 return
782 if data[:len(SOMEONELEFT)] == SOMEONELEFT:
784 if (host, port) == self.current_server:
786 name = data[len(SOMEONELEFT) + 1:]
788 if name in self.members:
789 print "Client.datagramReceived(): Received SOMEONELEFT"
791 self.members.remove(name)
793 event = [SOMEONELEFT]
794 data = {'name': name}
796 event.append(data)
798 the_engine.events.addEvent(event)
800 else:
801 print "Client.datagramReceived(): Received SOMEONELEFT, but", name, "not present in roster"
803 return
805 if data[:len(YOUROUT)] == YOUROUT:
807 if (host, port) == self.current_server:
809 print "Client.datagramReceived(): Recieved YOUROUT"
811 self.current_server = ()
813 event = [YOUROUT]
814 data = {}
815 event.append(data)
817 the_engine.events.addEvent(event)
819 return
821 if data[:len(LETTER)] == LETTER:
823 if (host, port) == self.current_server:
824 print "Client.datagramReceived(): Received LETTER"
826 split_strings = data.split(':')
828 message = data[data.find(':', len(LETTER) + 1) + 1:]
829 message_origin = split_strings[1]
831 event = [LETTER]
832 data = {'message': message, 'origin': message_origin}
833 event.append(data)
835 the_engine.events.addEvent(event)
837 return
839 if data[:len(IMHERE)] == IMHERE:
841 if (host, port) == self.current_server:
842 print "Client.datagramReceived(): Received IMHERE from server"
844 self.server_request = 0
846 return
848 def init(self, params):
850 self.params = params
852 self.current_server = ()
853 self.requested_server = ()
854 self.servers = {}
856 self.inited = 1
858 return
860 def serverRequest(self):
862 if self.current_server != ():
864 if self.server_request > SERVER_TIMEOUT:
865 the_engine.events.addEvent([SERVER_GONE, {}])
866 self.current_server = ()
868 else:
869 self.server_request += 1
870 self.transport.write(YOUTHERE, self.current_server)
872 return
874 def executeCommand(self, command, data):
876 reactor.callFromThread(self.executeThreadedCommand, command, data)
878 return
880 def executeThreadedCommand(self, command, data):
881 if command == SERVERKILL:
883 if self.current_server != ():
885 message = ''.join([SERVERKILL, ' '])
887 if data.has_key('password'):
888 message = ''.join([message, data['password']])
890 self.transport.write(message, self.current_server)
892 if command == SERVERREQUEST:
894 message = ''.join([SERVERREQUEST, ' ', str(self.params['message_port'])])
896 the_multicast.transport.write(message, (MULTICAST, self.params['broadcast_port']))
897 # self.transport.write(message, ('255.255.255.255', self.params['broadcast_port']))
899 if command == GETLIST:
901 message = GETLIST
903 if data.has_key('server'):
905 if self.servers.has_key(data['server']):
906 self.transport.write(message, self.servers[data['server']])
908 else:
910 if self.current_server != ():
911 self.transport.write(message, self.current_server)
913 if command == IMOUT:
915 if self.current_server != ():
917 message = IMOUT
919 self.transport.write(message, self.current_server)
921 self.current_server = ()
923 if command == LETTER:
925 if self.current_server != ():
927 message = ''.join([LETTER, ':'])
929 for dest in data['destinations']:
930 if dest in self.members:
931 message = ''.join([message, ' ' , dest])
933 message = ''.join([message, ':', data['message']])
935 self.transport.write(message, self.current_server)
937 if command == WANTIN:
939 if data.has_key('server'):
940 if self.servers.has_key(data['server']):
942 self.transport.write(''.join([WANTIN, ' ', self.params['name']]),
943 self.servers[data['server']])
944 self.current_server = ()
945 self.requested_server = self.servers[data['server']]
947 return
949 def main():
951 if len(sys.argv) > 1:
952 config = sys.argv[1]
953 else:
954 print "main(): No config specified, using", CONFIG
955 config = CONFIG
957 configuration = parse_config(config)
959 if (configuration.has_key('error') and configuration['error']):
960 print "main(): Error in parsing config."
962 the_event_receiver = EventReceiver()
964 global client_params
965 client_params = {'broadcast_port':configuration['broadcast_port'],
966 'broadcast_bind':configuration['broadcast_bind'],
967 'message_port':configuration['message_port'],
968 'name':configuration['name'],
969 'echo_time': configuration['echo_time']}
971 global the_engine
972 global the_client
974 the_engine = Engine(configuration)
976 the_client = Client()
977 the_client_thread = threading.Thread(target=run_net)
979 the_client.server_request = 0
981 the_client.init(client_params)
983 the_client_thread.start()
984 the_engine.run()
986 the_engine.killGame()
988 sys.exit()
990 the_client_thread.join()
992 return
994 def run_net():
996 global client_params
997 global the_multicast
999 the_multicast = Multicast()
1000 config = client_params
1002 reactor.listenMulticast(config['broadcast_bind'], the_multicast)
1003 reactor.listenUDP(config['message_port'], the_client)
1005 echo_request = task.LoopingCall(the_client.serverRequest)
1007 if client_params['echo_time'] != None:
1008 echo_request.start(client_params['echo_time'])
1009 else:
1010 print "run_net(): No ECHO_TIME specified, using default of", ECHO_TIME
1011 echo_request.start(ECHO_TIME)
1013 reactor.run(installSignalHandlers=0)
1015 return
1017 def parse_config(filename):
1018 results = {'error': 1}
1020 if (exists(filename)):
1021 dom = parse(filename)
1022 else:
1023 print "parse_config():", filename, "doesn't exist."
1024 return results
1026 results = {'window_title': None,
1027 'log': None,
1028 'name': None,
1029 'font': None,
1030 'init': None,
1031 'message_port': None,
1032 'broadcast_port': None,
1033 'broadcast_bind': None,
1034 'fullscreen': None,
1035 'background_color': None,
1036 'window_size': None,
1037 'gravity': None,
1038 'step_size': None,
1039 'pack_dir': None,
1040 'echo_time': None}
1042 if (dom.childNodes[0].nodeName == 'config'):
1043 for node in dom.childNodes[0].childNodes:
1045 if (node.nodeName == 'window_title'):
1046 results['window_title'] = node.childNodes[0].nodeValue
1048 if (node.nodeName == 'log'):
1049 results['log'] = node.childNodes[0].nodeValue
1051 if (node.nodeName == 'name'):
1052 results['name'] = node.childNodes[0].nodeValue
1054 if (node.nodeName == 'font'):
1055 results['font'] = node.childNodes[0].nodeValue
1057 if (node.nodeName == 'init'):
1058 results['init'] = node.childNodes[0].nodeValue
1060 if (node.nodeName == 'message_port'):
1061 results['message_port'] = int(node.childNodes[0].nodeValue)
1063 if (node.nodeName == 'broadcast_port'):
1064 results['broadcast_port'] = int(node.childNodes[0].nodeValue)
1066 if (node.nodeName == 'broadcast_bind'):
1067 results['broadcast_bind'] = int(node.childNodes[0].nodeValue)
1069 if (node.nodeName == 'fullscreen'):
1070 results['fullscreen'] = int(node.childNodes[0].nodeValue)
1072 if (node.nodeName == 'background_color'):
1074 string_parts = node.childNodes[0].nodeValue.split()
1075 results['background_color'] = [float(string_parts[0]), float(string_parts[1])]
1076 results['background_color'].append(float(string_parts[2]))
1077 results['background_color'].append(float(string_parts[3]))
1079 if (node.nodeName == 'window_size'):
1081 string_parts = node.childNodes[0].nodeValue.split()
1082 results['window_size'] = ((int(string_parts[0]), int(string_parts[1])))
1084 if (node.nodeName == 'gravity'):
1086 string_parts = node.childNodes[0].nodeValue.split()
1087 results['gravity'] = [float(string_parts[0]), float(string_parts[1])]
1088 results['gravity'].append(float(string_parts[2]))
1090 if (node.nodeName == 'step_size'):
1091 results['step_size'] = float(node.childNodes[0].nodeValue)
1093 if (node.nodeName == 'pack_dir'):
1094 results['pack_dir'] = node.childNodes[0].nodeValue
1096 if (node.nodeName == 'echo_time'):
1097 results['echo_time'] = int(node.childNodes[0].nodeValue)
1099 results['error'] = 0
1101 return results
1103 if __name__ == '__main__':
1104 main()