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                 

pmsg-scon (last edited 2009-12-25 07:16:59 by localhost)