pmsg-scon.py
-- Zoom.Quiet [2004-09-04 04:12:41]
Contents
1 from minimic.message import bytemsg
2 import struct
3 import zlib
4 import cPickle
5 pickle cPickle
6
7
8 class minimicPMessage(bytemsg.ByteMessage):
9 """minimicP 消息基类"""
10 def __init__(self):
11 # 消息头
12 self.head = bytemsg.ByteMessageHead(self)
13 # 消息体
14 self.body = bytemsg.ByteMessageBody(self)
15 # 消息工具
16 self.msgutilcls = minimicPMessageUtil
17 # 协议名称
18 self.protocolname = 'minimicp'
19 # 当前的消息名称
20 self.msgname = ''
21
22 def pack_minimicp_connect(self, fields):
23 """connect报文打包"""
24 message = struct.pack('6s16sI8s',
25 fields['system_id'], \
26 fields['auth_source'], \
27 fields['version'], \
28 fields['time_stamp'])
29 len = len(fields['test'])
30 message += struct.pack('I'+str(len)+'s', \
31 len, \
32 fields['test'])
33 zdata = zlib.compress(field['zip'])
34 len = len(zdata)
35 message += struct.pack('I'+str(len)+'s', \
36 len, \
37 zdata)
38 zdata = zlib.compress(pickle.dumps(field['szip']))
39 len = len(zdata)
40 message += struct.pack('I'+str(len)+'s', \
41 len, \
42 zdata)
43 return message
44
45 def unpack_minimicp_connect(self, packet):
46 """connect报文解包"""
47 stt = '6s16sI8s'
48 len = struct.calcsize(stt)
49 self.body.fields['system_id'], \
50 self.body.fields['auth_source'], \
51 self.body.fields['version'], \
52 self.body.fields['time_stamp'] = \
53 struct.unpack(stt,packet[:len])
54
55 packet = packet[len:]
56 len = struct.unpack('I', packet[:4])
57 packet = packet[4:]
58 self.body.fields['test'] = struct.unpack(str(len)+'s', packet[:len])
59 packet = packet[len:]
60 len = struct.unpack('I', packet[:4])
61 packet = packet[4:]
62 self.body.fields['zip'] = zlib.decompress( \
63 struct.unpack(str(len)+'s', packet[:len]))
64 packet = packet[len:]
65 len = struct.unpack('I', packet[:4])
66 packet = packet[4:]
67 self.body.fields['szip'] = pickle.loads( \
68 zlib.decompress(struct.unpack(str(len)+'s', packet[:len])))
69
70 def pack_minimicp_connect_resp(self, fields):
71 """connect_resp报文打包"""
72 message = struct.pack('II',
73 fields['status'], \
74 fields['version'])
75 return message
76
77 def unpack_minimicp_connect_resp(self, packet):
78 """connect_resp报文解包"""
79 stt = 'II'
80 len = struct.calcsize(stt)
81 self.body.fields['status'], \
82 self.body.fields['version'] = \
83 struct.unpack(stt,packet[:len])
84
85 def pack_minimicp_terminate(self, fields):
86 """terminate报文体为空"""
87 return None
88
89 def unpack_minimicp_terminate(self, packet):
90 """terminate报文体为空"""
91 pass
92
93 def pack_minimicp_terminate_resp(self, fields):
94 """terminate_resp报文体为空"""
95 return None
96
97 def unpack_minimicp_terminate_resp(self, packet):
98 """terminate_resp报文体为空"""
99 pass
100
101 def pack_minimicp_add_user(self, fields):
102 """add_user报文打包"""
103 message = struct.pack('32s',
104 fields['uid'])
105 return message
106
107 def unpack_minimicp_add_user(self, packet):
108 """add_user报文解包"""
109 stt = '32s'
110 len = struct.calcsize(stt)
111 self.body.fields['uid'], \
112 struct.unpack(stt,packet[:len])
113
114 def pack_minimicp_add_user_resp(self, fields):
115 """add_user_resp报文打包"""
116 message = struct.pack('I',
117 fields['status'])
118 return message
119
120 def unpack_minimicp_add_user_resp(self, packet):
121 """add_user_resp报文解包"""
122 stt = 'I'
123 len = struct.calcsize(stt)
124 self.body.fields['status'], \
125 struct.unpack(stt,packet[:len])
126
127 def pack_minimicp_del_user(self, fields):
128 """del_user报文打包"""
129 message = struct.pack('32s',
130 fields['uid'])
131 return message
132
133 def unpack_minimicp_del_user(self, packet):
134 """del_user报文解包"""
135 stt = '32s'
136 len = struct.calcsize(stt)
137 self.body.fields['uid'], \
138 struct.unpack(stt,packet[:len])
139
140 def pack_minimicp_del_user_resp(self, fields):
141 """del_user_resp报文打包"""
142 message = struct.pack('I',
143 fields['status'])
144 return message
145
146 def unpack_minimicp_del_user_resp(self, packet):
147 """del_user_resp报文解包"""
148 stt = 'I'
149 len = struct.calcsize(stt)
150 self.body.fields['status'], \
151 struct.unpack(stt,packet[:len])
152
153 def pack_minimicp_add_mail(self, fields):
154 """add_mail报文打包"""
155 message = struct.pack('32s32s64s72s72s16sII',
156 fields['uid'], \
157 fields['foldername'], \
158 fields['filename'], \
159 fields['subject'], \
160 fields['mailfrom'], \
161 fields['date'], \
162 fields['size'], \
163 fields['flag'])
164 return message
165
166 def unpack_minimicp_add_mail(self, packet):
167 """add_mail报文解包"""
168 stt = '32s32s64s72s72s16sII'
169 len = struct.calcsize(stt)
170 self.body.fields['uid'], \
171 self.body.fields['foldername'], \
172 self.body.fields['filename'], \
173 self.body.fields['subject'], \
174 self.body.fields['mailfrom'], \
175 self.body.fields['date'], \
176 self.body.fields['size'], \
177 self.body.fields['flag'] = \
178 struct.unpack(stt,packet[:len])
179
180 def pack_minimicp_add_mail_resp(self, fields):
181 """add_mail_resp报文打包"""
182 message = struct.pack('I',
183 fields['status'])
184 return message
185
186 def unpack_minimicp_add_mail_resp(self, packet):
187 """add_mail_resp报文解包"""
188 stt = 'I'
189 len = struct.calcsize(stt)
190 self.body.fields['status'], \
191 struct.unpack(stt,packet[:len])
192
193 def pack_minimicp_del_mail(self, fields):
194 """del_mail报文打包"""
195 message = struct.pack('32s32s64s',
196 fields['uid'], \
197 fields['foldername'], \
198 fields['filename'])
199 return message
200
201 def unpack_minimicp_del_mail(self, packet):
202 """del_mail报文解包"""
203 stt = '32s32s64s'
204 len = struct.calcsize(stt)
205 self.body.fields['uid'], \
206 self.body.fields['foldername'], \
207 self.body.fields['filename'] = \
208 struct.unpack(stt,packet[:len])
209
210 def pack_minimicp_del_mail_resp(self, fields):
211 """del_mail_resp报文打包"""
212 message = struct.pack('I',
213 fields['status'])
214 return message
215
216 def unpack_minimicp_del_mail_resp(self, packet):
217 """del_mail_resp报文解包"""
218 stt = 'I'
219 len = struct.calcsize(stt)
220 self.body.fields['status'], \
221 struct.unpack(stt,packet[:len])
222
223 def pack_minimicp_get_webmail_list(self, fields):
224 """get_webmail_list报文打包"""
225 message = struct.pack('32s32sIII',
226 fields['uid'], \
227 fields['foldername'], \
228 fields['dataid'], \
229 fields['flag'], \
230 fields['mailnum'])
231 return message
232
233 def unpack_minimicp_get_webmail_list(self, packet):
234 """get_webmail_list报文解包"""
235 stt = '32s32sIII'
236 len = struct.calcsize(stt)
237 self.body.fields['uid'], \
238 self.body.fields['foldername'], \
239 self.body.fields['dataid'], \
240 self.body.fields['flag'], \
241 self.body.fields['mailnum'] = \
242 struct.unpack(stt,packet[:len])
243
244 def pack_minimicp_get_webmail_list_resp(self, fields):
245 """
246 """
247 if fields['status'] == 0:
248 start = struct.pack('III',
249 fields['status'], \
250 fields['dataid'], \
251 fields['order'])
252
253 len = len(fields['test'])
254 start += struct.pack('I'+str(len)+'s', \
255 len, \
256 fields['test'])
257 zdata = zlib.compress(fields['zip'])
258 len = len(zdata)
259 start += struct.pack('I'+str(len)+'s', \
260 len, zdata)
261 zdata = zlib.compress(pickle.dumps(fields['szip']))
262 len = len(zdata)
263 start += struct.pack('I'+str(len)+'s', \
264 len,zdata)
265 body = ''
266 body += struct.pack('I', len(fields['maillist']))
267 i = 0
268 while i < len(fields['maillist']):
269 body += struct.pack('64s16sII', \
270 fields['maillist'][i]['filename'], \
271 fields['maillist'][i]['date'], \
272 fields['maillist'][i]['size'], \
273 fields['maillist'][i]['flag'])
274 len = len(fields['maillist'][i]['subject'])
275 body += struct.pack('I'+str(len)+'s', \
276 len, \
277 fields['maillist'][i]['subject'])
278 len = len(fields['maillist'][i]['mailfrom'])
279 body += struct.pack('I'+str(len)+'s', \
280 len, \
281 fields['maillist'][i]['mailfrom'])
282 i += 1
283 return start+body
284 else:
285 return struct.pack('I', \
286 fields['status'])
287
288 def unpack_minimicp_get_webmail_list_resp(self, packet):
289 """
290 """
291 (self.body.fields['status'],) = struct.unpack('I', packet)
292 if self.body.fields['status'] == 0:
293 stt = 'III'
294 len = struct.calcsize(stt)
295 self.body.fields['status'], \
296 self.body.fields['dataid'], \
297 self.body.fields['order'] = \
298 struct.unpack(stt, packet[:len])
299
300 packet = packet[len:]
301 len = struct.unpack('I', packet[:4])
302 packet = packet[4:]
303 self.body.fields['test'] = struct.unpack(str(len)+'s', packet[:len])
304
305 packet = packet[len:]
306 len = struct.unpack('I', packet[:4])
307 packet = packet[4:]
308 self.body.fields['zip'] = \
309 zlib.decompress(struct.unpack(str(len)+'s', packet[:len]))
310 packet = packet[len:]
311 len = struct.unpack('I', packet[:4])
312 packet = packet[4:]
313 self.body.fields['szip'] = \
314 pickle.loads(zlib.decompress(struct.unpack(str(len)+'s', packet[:len])))
315 # "F"浮动数据开始
316 maillistlen = struct.unpack('I', packet[:4])
317 self.body.fields['maillist'] = []
318 i = 0
319 fixedstt = '64s16sII'
320 fixedlen = struct.calcsize(fixedstt)
321 while i < maillistlen:
322 self.body.fields['maillist'][i]['filename'], \
323 self.body.fields['maillist'][i]['date'], \
324 self.body.fields['maillist'][i]['size'], \
325 fields['maillist'][i]['flag'] = \
326 struct.unpack(fixedstt, packet[:fixedlen])
327 packet = packet[fixedlen:]
328
329 len = struct.unpack('I', packet[:4])
330 packet = packet[4:]
331 self.body.fields['maillist'][i]['subject'] = struct.unpack(str(len)+'s', packet[:len])
332 packet = packet[len:]
333
334 len = struct.unpack('I', packet[:4])
335 packet = packet[4:]
336 self.body.fields['maillist'][i]['mailfrom'] = struct.unpack(str(len)+'s', packet[:len])
337 packet = packet[len:]
338
339 i += 1
340 else:
341 pass
342
343 def pack_minimicp_get_popmail_list(self, fields):
344 """get_popmail_list报文打包"""
345 message = struct.pack('32s',
346 fields['uid'])
347 return message
348
349 def unpack_minimicp_get_popmail_list(self, packet):
350 """get_popmail_list报文解包"""
351 stt = '32s'
352 len = struct.calcsize(stt)
353 self.body.fields['uid'], \
354 struct.unpack(stt,packet[:len])
355
356 def pack_minimicp_get_popmail_list_resp(self, fields):
357 """get_popmail_list_resp报文打包"""
358 message = struct.pack('II',
359 fields['mailnum'], \
360 fields['status'])
361 return message
362
363 def unpack_minimicp_get_popmail_list_resp(self, packet):
364 """get_popmail_list_resp报文解包"""
365 stt = 'II'
366 len = struct.calcsize(stt)
367 self.body.fields['mailnum'], \
368 self.body.fields['status'] = \
369 struct.unpack(stt,packet[:len])
370
371 def pack_minimicp_move_mail(self, fields):
372 """move_mail报文打包"""
373 message = struct.pack('32s32s32sI',
374 fields['uid'], \
375 fields['foldername'], \
376 fields['oldfoldername'], \
377 fields['filename'])
378 return message
379
380 def unpack_minimicp_move_mail(self, packet):
381 """move_mail报文解包"""
382 stt = '32s32s32sI'
383 len = struct.calcsize(stt)
384 self.body.fields['uid'], \
385 self.body.fields['foldername'], \
386 self.body.fields['oldfoldername'], \
387 self.body.fields['filename'] = \
388 struct.unpack(stt,packet[:len])
389
390 def pack_minimicp_move_mail_resp(self, fields):
391 """move_mail_resp报文打包"""
392 message = struct.pack('I',
393 fields['status'])
394 return message
395
396 def unpack_minimicp_move_mail_resp(self, packet):
397 """move_mail_resp报文解包"""
398 stt = 'I'
399 len = struct.calcsize(stt)
400 self.body.fields['status'], \
401 struct.unpack(stt,packet[:len])
402
403
404 class minimicMessageHead(bytemsg.ByteMessageHead):
405 """minimicP消息的消息头抽像类"""
406 def __init__(self, parent):
407 # 长度
408 self.length = 8
409 # 命令ID
410 self.id = 0
411 # 他爹
412 self.parent = parent
413
414 def __len__(self):
415 """包头定长8"""
416 return 8
417
418 def setId(self,id):
419 """设置命令ID"""
420 self.id = id
421
422 def setLength(self, length):
423 """包的整长"""
424 self.length = length
425
426 def loadHead(self, header):
427 """转换一个PDU (protocol data unit)到一个消息头
428 消息头的格式为length(4字节)、commandid(4字节),共8字节长度
429 """
430 self.length,self.id = struct.unpack('>II', header)
431
432 def packed(self):
433 """转换一个消息头为二进制流
434 消息头的格式为length(4字节)、commandid(4字节,共12字节长度
435 """
436 return struct.pack('>II', self.length, self.id)
437
438 def __str__(self):
439 """字符串化"""
440 plist = []
441 plist.append("消息ID:%s" % self.id)
442 plist.append("消息长度:%s" % self.length)
443 return reduce(lambda x,y: x + "\n" + y, plist)
444
445 class minimicPMessageUtil(bytemsg.ByteMessageUtil):
446 """minimicP消息处理工具类"""
447 def __init__(self):
448 pass
449
450 # minimicP Message定义
451 minimicPMessageUtil.commandinfo = {
452 0x00000001L : 'connect', ###
453 0xff000001L : 'connect_resp', ###
454 0x00000002L : 'terminate', ###
455 0xff000002L : 'terminate_resp', ###
456 0x00000021L : 'add_user', ###
457 0xff000021L : 'add_user_resp', ###
458 0x00000015L : 'del_user', ###
459 0xff000015L : 'del_user_resp', ###
460 0x00000017L : 'add_mail', ###
461 0xff000017L : 'add_mail_resp', ###
462 0x00000018L : 'del_mail', ###
463 0xff000018L : 'del_mail_resp', ###
464 0x00000013L : 'get_webmail_list', ###
465 0xff000013L : 'get_webmail_list_resp', ###
466 0x00000014L : 'get_popmail_list', ###
467 0xff000014L : 'get_popmail_list_resp', ###
468 0x00000019L : 'move_mail', ###
469 0xff000019L : 'move_mail_resp' ###
470 }
471
472 # 通过名称查出消息ID的结构定义
473 minimicPMessageUtil.nametoid = {}
474 for k in minimicPMessageUtil.commandinfo.keys():
475 minimicPMessageUtil.nametoid[minimicPMessageUtil.commandinfo[k]] = k
476
477