| Home | Trees | Indices | Help |
|
|---|
|
|
1 # Copyright (c) 2011 Mathias Kaerlev.
2 # See LICENSE for details.
3
4 from struct import Struct
5
6 from lacewing.baseloader import _BaseLoader, _EmptyLoader
7 from lacewing.bitdict import BitDict
8 from lacewing.packetloaders.common import (CONNECT, SET_NAME, JOIN_CHANNEL,
9 LEAVE_CHANNEL, CHANNEL_LIST)
10 from lacewing.packetloaders.common import (_BinaryMessageMixin,
11 _ObjectMessageMixin)
12
13 RESPONSE_DATA = Struct('<BB')
14 NAME_DATA = Struct('<B')
15 SUBCHANNEL_DATA = Struct('<B')
16 JOIN_CHANNEL_DATA = Struct('<BB')
17 CHANNEL_ID = Struct('<H')
18 YOUR_ID = Struct('<H')
19 PEER_DATA = Struct('<HBB')
20 CHANNEL_LIST_DATA = Struct('<HB')
21 CHANNEL_MESSAGE_DATA = Struct('<BH')
22 PEER_MESSAGE_DATA = Struct('<BHH')
23 SERVER_CHANNEL_MESSAGE_DATA = Struct('<BH')
24 NEW_PEER_DATA = Struct('<HHB')
25 PEER_LEAVE_DATA = Struct('<HH')
26
28 id = None
29 isMaster = None
30 name = None
31
33 self.id, flags, size = PEER_DATA.unpack_from(data)
34 self.isMaster = flags
35 self.name = str(buffer(data, PEER_DATA.size, size))
36 return PEER_DATA.size + size
37
41
43 response = None
44 success = None
45 welcome = None
46 name = None
47 isMaster = None
48 channel = None
49 peers = None
50 channels = None
51 playerId = None
52 value = None
53
55 self.response, self.success = RESPONSE_DATA.unpack_from(data)
56 data = buffer(data, 2)
57 if self.response == CONNECT and self.success:
58 self.playerId, = YOUR_ID.unpack_from(data)
59 self.welcome = str(buffer(data, 2))
60 elif self.response == SET_NAME:
61 size, = NAME_DATA.unpack_from(data)
62 self.name = str(buffer(data, 1, size))
63 data = buffer(data, 1 + size)
64 elif self.response == JOIN_CHANNEL:
65 self.isMaster, size = JOIN_CHANNEL_DATA.unpack_from(data)
66 self.name = str(buffer(data, JOIN_CHANNEL_DATA.size, size))
67 data = buffer(data, JOIN_CHANNEL_DATA.size + size)
68 if self.success:
69 self.channel, = CHANNEL_ID.unpack_from(data)
70 data = buffer(data, 2)
71 self.peers = peers = []
72 while data:
73 peer = ChannelPeer()
74 peers.append(peer)
75 bytesRead = peer.read(data)
76 data = buffer(data, bytesRead)
77 elif self.response == LEAVE_CHANNEL:
78 self.channel, = CHANNEL_ID.unpack_from(data)
79 data = buffer(data, 2)
80 elif self.response == CHANNEL_LIST and self.success:
81 self.channels = channels = []
82 while data:
83 count, size = CHANNEL_LIST_DATA.unpack_from(data)
84 name = buffer(data, CHANNEL_LIST_DATA.size, size)
85 data = buffer(data, CHANNEL_LIST_DATA.size + size)
86 channels.append((name, count))
87 if not self.success:
88 self.value = str(data)
89
91 if self.peers is None:
92 self.peers = []
93 peer = ChannelPeer()
94 peer.id = id
95 peer.isMaster = isMaster
96 peer.name = name
97 self.peers.append(peer)
98
100 data = RESPONSE_DATA.pack(self.response, self.success)
101 if self.response == CONNECT:
102 data += YOUR_ID.pack(self.playerId or 0)
103 data += self.welcome or ''
104 elif self.response == SET_NAME:
105 data += NAME_DATA.pack(len(self.name)) + self.name
106 elif self.response == JOIN_CHANNEL:
107 data += JOIN_CHANNEL_DATA.pack(
108 int(self.isMaster or 0), len(self.name)) + self.name
109 if self.success:
110 data += CHANNEL_ID.pack(self.channel)
111 for item in self.peers or ():
112 data += item.generate()
113 elif self.response == LEAVE_CHANNEL:
114 data += CHANNEL_ID.pack(self.channel)
115 elif self.response == CHANNEL_LIST and self.success:
116 for (name, count) in self.channels:
117 data += CHANNEL_LIST_DATA.pack(count, len(name)) + name
118 if not self.success:
119 data += self.value or ''
120 return data
121
130
132 subchannel = None
133 channel = None
134 peer = None
136 (self.subchannel, self.channel,
137 self.peer) = PEER_MESSAGE_DATA.unpack_from(data)
138 self.readMessage(buffer(data, PEER_MESSAGE_DATA.size))
139
141 return PEER_MESSAGE_DATA.pack(self.subchannel,
142 self.channel, self.peer) + self.generateMessage()
143
145 subchannel = None
146 channel = None
148 (self.subchannel,
149 self.channel) = SERVER_CHANNEL_MESSAGE_DATA.unpack_from(data)
150 self.readMessage(buffer(data, SERVER_CHANNEL_MESSAGE_DATA.size))
151
153 return SERVER_CHANNEL_MESSAGE_DATA.pack(self.subchannel,
154 self.channel) + self.generateMessage()
155
158
161
164
167
170
173
176
179
181 channel = None
182 peer = None
183 isMaster = None
184 name = None
185
187 if len(data) == PEER_LEAVE_DATA.size:
188 self.channel, self.peer = PEER_LEAVE_DATA.unpack_from(data)
189 else:
190 self.channel, self.peer, self.isMaster = NEW_PEER_DATA.unpack_from(
191 data)
192 self.name = str(buffer(data, NEW_PEER_DATA.size))
193
195 if self.isMaster is None and self.name is None:
196 return PEER_LEAVE_DATA.pack(self.channel, self.peer)
197 else:
198 return NEW_PEER_DATA.pack(self.channel, self.peer,
199 self.isMaster) + self.name
200
203
206
| Home | Trees | Indices | Help |
|
|---|
| Generated by Epydoc 3.0.1 on Thu Dec 22 06:20:00 2011 | http://epydoc.sourceforge.net |