1 import asyncore
2 import socket
3 import types
4
5 import SpecConnection
6 import SpecMessage
7
8
10 - def __init__(self, request, client_address, server):
11 asyncore.dispatcher.__init__(self, request)
12
13 self.client_address = client_address
14 self.server = server
15 self.sendq = []
16 self.receivedStrings = []
17 self.outputStrings = []
18 self.message = None
19 self.clientVersion = None
20 self.clientOrder = ""
21
22
24 self.receivedStrings.append(self.recv(32768))
25 s = ''.join(self.receivedStrings)
26 sbuffer = buffer(s)
27 consumedBytes = 0
28 offset = 0
29
30 while offset < len(sbuffer):
31 if self.message is None:
32 self.message = SpecMessage.message(version = self.clientVersion, order=self.clientOrder)
33
34 consumedBytes = self.message.readFromStream(sbuffer[offset:])
35
36 if consumedBytes == 0:
37 break
38
39 offset += consumedBytes
40
41 if self.message.isComplete():
42
43 if self.message.cmd == SpecMessage.HELLO:
44 self.clientOrder = self.message.packedHeaderDataFormat[0]
45 print "client byte order: ", self.clientOrder
46 self.clientVersion = self.message.vers
47 self.send_hello_reply(self.message.sn, str(self.server.name))
48 else:
49 if not self.dispatchIncomingMessage(self.message):
50 self.send_error(self.message.sn, '', 'unsupported command type : %d' % self.message.cmd)
51
52 self.message = None
53
54 self.receivedStrings = [ s[offset:] ]
55
56
58 return len(self.sendq) > 0 or sum(map(len, self.outputStrings)) > 0
59
60
62
63
64
65 while len(self.sendq) > 0:
66 self.outputStrings.append(self.sendq.pop().sendingString())
67
68 outputBuffer = ''.join(self.outputStrings)
69
70 sent = self.send(outputBuffer)
71 self.outputStrings = [ outputBuffer[sent:] ]
72
73
75 self.close()
76 self.server.clients.remove(self)
77
78
81
82
84 if SpecMessage.NULL in cmdstr:
85 cmdparts = cmdstr.split(SpecMessage.NULL)
86 command = cmdparts[0]
87 args = tuple([ eval(cmdpart) for cmdpart in cmdparts[1:] ])
88 return command, args
89
90 cmdpartLength = cmdstr.find('(')
91
92 if cmdpartLength < 0:
93 return cmdstr, ()
94
95 try:
96 command = cmdstr[:cmdpartLength]
97 args = eval(cmdstr[cmdpartLength:])
98 except:
99 print 'error parsing command string %s' % cmdstr
100 return '', ()
101 else:
102 if not type(args) == types.TupleType:
103 args = (args, )
104
105 return command, args
106
107
109 if len(cmd) == 0 or replyID is None:
110 return
111
112 if len(args) == 0:
113 cmdstr = str(cmd)
114 command, args = self.parseCommandString(cmdstr)
115 else:
116 command = cmd
117
118
119 func = None
120
121 if hasattr(self, command):
122 func = getattr(self, command)
123 elif hasattr(self.server, command):
124 func = getattr(self.server, command)
125 else:
126 self.send_error(replyID, '', '"' + command + '" command does not exist.')
127 return
128
129 print 'executeCommandAndReply: func=%s, args=%s' % (repr(func), args)
130
131 if callable(func):
132 try:
133 ret = func(*args)
134 except:
135 import traceback
136 traceback.print_exc()
137
138 self.send_error(replyID, '', 'Failed to execute command "' + command)
139 else:
140 if ret is None:
141 self.send_error(replyID, '', command + ' returned None.')
142 else:
143 self.send_reply(replyID, '', ret)
144 else:
145 self.send_error(replyID, '', command + ' is not callable on server.')
146
147
150
151
153 self.sendq.append(SpecMessage.reply_message(replyID, name, data, version = self.clientVersion, order=self.clientOrder))
154
155
157 self.sendq.append(SpecMessage.error_message(replyID, name, data, version = self.clientVersion, order=self.clientOrder))
158
159
161 self.sendq.append(SpecMessage.msg_event(chanName, value, version = self.clientVersion, order=self.clientOrder))
162
163
166 asyncore.dispatcher.__init__(self)
167
168 self.name = name
169 self.RequestHandlerClass = handler
170 self.clients = []
171
172 self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
173
174 self.set_reuse_addr()
175
176 if type(name) == type(''):
177 for p in range(SpecConnection.MIN_PORT, SpecConnection.MAX_PORT):
178 self.server_address = ( host, p )
179
180 try:
181 self.bind(self.server_address)
182 except:
183 continue
184 else:
185 break
186 else:
187 self.server_address = (host, name)
188 self.bind(self.server_address)
189
190
191 self.listen(5)
192
193
195 try:
196 conn, addr = self.accept()
197 except:
198 return
199 else:
200 conn.setblocking(0)
201 self.clients.append(self.RequestHandlerClass(conn, addr, self))
202
203
206