pmsg-scon-opt.py

-- Zoom.Quiet [2004-09-04 04:14:46]

Contents

   1 # -*- coding: gbk -*-
   2 """minimic 协议信息包处理 Otter 目标代码优化尝试
   3 """
   4 import string
   5 import struct
   6 import zlib
   7 import cPickle
   8 pickle cPickle
   9 from minimic.message import bytemsg
  10 
  11 class minimicPMessage(bytemsg.ByteMessage):
  12     """minimicP 消息基类"""
  13     def __init__(self):
  14         # 消息头
  15         self.head = bytemsg.ByteMessageHead(self)
  16         # 消息体
  17         self.body = bytemsg.ByteMessageBody(self)
  18         # 消息工具
  19         self.msgutilcls = minimicPMessageUtil
  20         # 协议名称
  21         self.protocolname = 'minimicp'
  22         # 当前的消息名称
  23         self.msgname = ''
  24         # 解包长度计数
  25         self.lg = 0
  26     def pack-s(self,key,value):
  27         """定长字串数据打包
  28         """
  29         return struct.pack(key,value)
  30     def unpack-s(self,key,value):
  31         """定长字串数据解包
  32         """
  33         pass
  34     def pack-I(self,value):
  35         """整数数据打包
  36         """
  37         return struct.pack("I",value)
  38     def unpack-I(self,key,value):
  39         """整数数据解包
  40         """
  41         pass
  42     def pack-v(self,fstr,lg,value):
  43         """变长字串数据打包
  44         """
  45         return struct.pack(fstr,lg,value)
  46     def unpack-v(self,key,value):
  47         """变长字串数据解包
  48         """
  49         pass
  50     def pack-z(self,fstr,lg,value):
  51         """压缩字符串打包
  52         """
  53         return struct.pack(fstr,lg,value)
  54     def unpack-z(self,key,value):
  55         """压缩字符串解包
  56         """
  57         pass
  58 
  59     def pack-Z(self,fstr,lg,value):
  60         """压缩序列化对象打包
  61         """
  62         return struct.pack(fstr,lg,value)
  63     def unpack-Z(self,key,value):
  64         """压缩序列化对象解包
  65         """
  66         pass
  67 
  68     def pack-F(self,fields,key,actdict):
  69         """浮动复合数据打包
  70             - fields 应用传入的全部数据
  71             - key "F"数据类别索引
  72             - actdict 对应数据集合结构定义
  73         """
  74         body = ''
  75         body += struct.pack('I', len(fields[key]))
  76         i = 0
  77         while i < len(fields[key]):
  78             body += self.smartpack(fields[key][i],actdict)
  79             i += 1
  80         return body
  81 
  82     def agentfloatunp(self,field,datadict,bodyfield):
  83         """浮动复合数据解包辅助,专门进行复合包的内容解包        
  84             - field 应用传入的对应一段数据类型
  85             - datadict 对应剩余数据
  86             - bodyfield 回填对应的全局字典结点
  87         """
  88         if "s" == field[0]:
  89             packstr = datadict[self.lg:]
  90             stt = field[2]+field[0]
  91             lg = struct.calcsize(stt)
  92             bodyfield[field[1]] = struct.unpack(stt,packstr)
  93             return lg
  94         elif "I" == field[0]:
  95             packstr = datadict[self.lg:]
  96             lg = 4
  97             bodyfield[field[1]] = struct.unpack("I",packstr)
  98             return lg
  99         elif "v" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度 的字串
 100             packet = packet[self.lg:]
 101             lg = struct.unpack('I', packet[:4])
 102             packet = packet[4:]
 103             bodyfield[field[1]] = struct.unpack(str(lg)+'s', packet[:lg])
 104             return 4+lg
 105         elif "z" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度的压缩字串
 106             packet = packet[self.lg:]
 107             lg = struct.unpack('I', packet[:4])
 108             packet = packet[4:]
 109             bodyfield[field[1]] = zlib.decompress( \
 110                 struct.unpack(str(lg)+'s', packet[:lg]))
 111             return 4+lg
 112         elif "Z" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度的串行化对象字串
 113             packet = packet[self.lg:]
 114             lg = struct.unpack('I', packet[:4])
 115             packet = packet[4:]
 116             bodyfield[field[1]] = pickle.loads( \
 117                 zlib.decompress(struct.unpack(str(lg)+'s', packet[:lg])
 118                                 )
 119                             )
 120             return 4+lg
 121         
 122     def smartfloatunp(self,dictli,packet,bodyfield):
 123         """智能浮动复合数据解包
 124             - dictli 复合包结构声明字典列表
 125             - packet 对应剩余数据
 126             - bodyfield 回填对应的全局字典结点
 127         """
 128         for part in dictli
 129             self.lg += self.agentfloatunp(part,packet,bodyfield)
 130             
 131     def unpack-F(self,key,dictli,loop,value):
 132         """浮动复合数据解包
 133             - key self.body.fields回填索引
 134             - dictli 复合包结构声明字典列表
 135             - loop 复合包总数!
 136             - value 对应剩余数据
 137         """
 138         packet = value
 139         self.body.fields[key] = []
 140         i = 0
 141         #fixedstt = '64s16sII'
 142         #fixedlen = struct.calcsize(fixedstt)
 143         while i < loop:                        
 144             for field in actdict:
 145                 self.smartfloatunp(dictli,packet,self.body.fields[key][i])
 146             i += 1
 147 
 148 
 149     def smartagent(self,field,datadict,todotp):
 150         """智能代理,根据行为类型,以及数据类型自动分配处理函式
 151             - field 应用传入的对应一段数据类型
 152             - datadict 应用传入的数据包
 153             - todotp [pack|unpack]即[进行打包|进行解包]
 154         """
 155         if "pack" == todotp:    # 进行数据打包
 156             if "s" == field[0]:
 157                 key = field[2]+field[0]
 158                 return self.pack-s(key,datadict[field[1]])
 159             elif "I" == field[0]:
 160                 return self.pack-I(datadict[field[1]])
 161             elif "v" == field[0]:
 162                 lg = len(datadict[field[1]])
 163                 return self.pack-v('I'+str(lg)+'s',lg,datadict[field[1]])
 164             elif "z" == field[0]:
 165                 zdata = zlib.compress(datadict[field[1]])
 166                 lg = len(zdata)
 167                 return self.pack-z('I'+str(lg)+'s',lg,zdata)
 168             elif "Z" == field[0]:
 169                 zdata = zlib.compress(pickle.dumps(datadict[field[1]]))
 170                 lg = len(zdata)
 171                 return self.pack-Z('I'+str(lg)+'s',lg,zdata)
 172             else:       # "F"浮动复合数据!
 173                 return self.pack-F(datadict,field[1],field[2])
 174 
 175         else:           ## 对应解包处理
 176 
 177             if "s" == field[0]:
 178                 packstr = datadict[self.lg:]
 179                 stt = field[2]+field[0]
 180                 lg = struct.calcsize(stt)
 181                 self.body.fields[field[1]] = struct.unpack(stt,packstr)
 182                 return lg
 183             elif "I" == field[0]:
 184                 packstr = datadict[self.lg:]
 185                 lg = 4
 186                 self.body.fields[field[1]] = struct.unpack("I",packstr)
 187                 return lg
 188             elif "v" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度 的字串
 189                 packet = packet[self.lg:]
 190                 lg = struct.unpack('I', packet[:4])
 191                 packet = packet[4:]
 192                 self.body.fields[field[1]] = struct.unpack(str(lg)+'s', packet[:lg])
 193                 return 4+lg
 194 
 195             elif "z" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度的压缩字串
 196                 packet = packet[self.lg:]
 197                 lg = struct.unpack('I', packet[:4])
 198                 packet = packet[4:]
 199                 self.body.fields[field[1]] = zlib.decompress( \
 200                     struct.unpack(str(lg)+'s', packet[:lg]))
 201                 return 4+lg
 202 
 203             elif "Z" == field[0]:   # "v"变长字串=4位整数长度信息+自声明长度的串行化对象字串
 204                 packet = packet[self.lg:]
 205                 lg = struct.unpack('I', packet[:4])
 206                 packet = packet[4:]
 207                 self.body.fields[field[1]] = pickle.loads( \
 208                     zlib.decompress(struct.unpack(str(lg)+'s', packet[:lg])
 209                                     )
 210                                 )
 211                 return 4+lg
 212             else:       # "F"浮动复合数据!
 213                 packet = packet[self.lg:]   # 得到当前处理的剩余数据字串
 214                 floatlg = struct.unpack('I', packet[:4])
 215                 packet = packet[4:]
 216                 lg = self.unpack-F(field[1],field[2],floatlg,packet)
 217                 return lg
 218 
 219     def smartpack(self,fields,actdict):
 220         """智能打包
 221             - 应用传入的值字典
 222             - 对应的配置XML处理行为字典
 223         """
 224         mess = ""
 225         if 0 == len(actdict):   #空报文
 226             return None
 227         else:
 228             for actfield in actdict:
 229                 mess +=self.smartagent(actfield,fields,"pack")
 230             return mess
 231 
 232     def smartunpack(self,packet,actdict):
 233         """智能数据解包
 234         """
 235         if 0 == len(actdict):   #空报文
 236             pass
 237         else:
 238             for field in actdict:
 239                 self.lg += self.smartagent(field,packet,"unpack")
 240 
 241     
 242     ###     示范代码,列举最典型的三类数据包的处理!
 243     ##
 244     # 
 245     
 246     def pack_minimicp_connect(self, fields):
 247         """connect报文打包"""
 248         actdict=[
 249             ("s","system_id",6)
 250             ,("s","auth_source",16)
 251             ,("I","version",)
 252             ,("v","test",)
 253             ,("z","zip",)
 254             ,("Z","szip",)
 255             ,("s","time_stamp",8)
 256             ]
 257         message = self.smartpack(fields,actdict)
 258         return message
 259 
 260     def unpack_minimicp_connect(self, packet):
 261         """connect报文解包"""
 262         actdict=[
 263             ("s","system_id",6)
 264             ,("s","auth_source",16)
 265             ,("I","version",)
 266             ,("v","test",)
 267             ,("z","zip",)
 268             ,("Z","szip",)
 269             ,("s","time_stamp",8)
 270             ]
 271         self.smartunpack(packet,actdict)
 272 
 273 
 274     def pack_minimicp_terminate(self, fields):
 275         """terminate报文体为空"""
 276         actdict=[]
 277         message = self.smartpack(fields,actdict)
 278         return message
 279 
 280     def unpack_minimicp_terminate(self, packet):
 281         """terminate报文体为空"""
 282         actdict=[]
 283         self.smartunpack(packet,actdict)
 284 
 285 
 286     def pack_minimicp_get_webmail_list_resp(self, fields):
 287         """含有 'F'的复合活动数据报文
 288         """
 289         if fields['status'] == 0:
 290             actdict=[
 291                 ("I","status",)
 292                 ,("I","dataid",)
 293                 ,("I","order",)
 294                 ,("v","test",)
 295                 ,("z","zip",)
 296                 ,("Z","szip",)
 297                 ,("F","maillist",[
 298                     ("s","filename",64)
 299                     ,("v","subject",)
 300                     ,("s","date",16)
 301                     ,("I","size",)
 302                     ,("I","flag",)
 303                     ]
 304                  )
 305                 ]
 306             message = self.smartpack(fields,actdict)
 307             return message
 308         else:
 309             return struct.pack('I', \
 310                 fields['status'])
 311 
 312     def unpack_minimicp_get_webmail_list_resp(self, packet):
 313         """含有 'F'的复合活动数据报文
 314         """
 315         (self.body.fields['status'],) = struct.unpack('I', packet)
 316         if self.body.fields['status'] == 0:
 317             actdict=[
 318                 ("I","status",)
 319                 ,("I","dataid",)
 320                 ,("I","order",)
 321                 ,("v","test",)
 322                 ,("z","zip",)
 323                 ,("Z","szip",)
 324                 ,("F","maillist",[
 325                     ("s","filename",64)
 326                     ,("v","subject",)
 327                     ,("s","date",16)
 328                     ,("I","size",)
 329                     ,("I","flag",)
 330                     ]
 331                  )
 332                 ]
 333             message = self.smartunpack(fields,actdict)
 334         else:
 335             pass

OtterSample/pmsg-scon-opt (last edited 2009-12-25 07:16:31 by localhost)