home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / msn / P2P / P2PData2.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  6.0 KB  |  183 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import logging
  5. log = logging.getLogger('msn.p2p.data2')
  6. import struct
  7. import util
  8. import P2PData
  9. from P2PData import flagged
  10.  
  11. class Flags:
  12.     names = {
  13.         0: 'none',
  14.         1: 'syn',
  15.         2: 'r_ack' }
  16.     NONE = 0
  17.     ONE = 1
  18.     UNKNOWN = ONE
  19.     SYNC = ONE
  20.     SYN = ONE
  21.     R_ACK = 2
  22.  
  23.  
  24. class TFlags:
  25.     names = {
  26.         0: 'protocol_more',
  27.         1: 'protocol_start',
  28.         4: 'msno_more',
  29.         5: 'msno_start',
  30.         6: 'file_more',
  31.         7: 'file_start' }
  32.     PROTO_MORE = 0
  33.     PROTO_START = 1
  34.     MSNO_MORE = 4
  35.     MSNO_START = 5
  36.     FILE_MORE = 6
  37.     FILE_START = 7
  38.  
  39.  
  40. class P2PManager(P2PData.P2PManager):
  41.     
  42.     def _on_recv_data(self, transport, sender, data, has_footer = True):
  43.         log.info('Recv data: %r, %r, %r', transport, sender, data)
  44.         packet = MSNC12Packet.unpack(data, has_footer = has_footer)
  45.         if has_footer:
  46.             footer = struct.unpack('>L', packet.footer)[0]
  47.         else:
  48.             footer = 0
  49.         ack_id = packet.tlvs.get(2, None)
  50.         if ack_id is not None:
  51.             self._last_acked = ack_id
  52.             self._process_ack(ack_id)
  53.         
  54.         if flagged(packet.flags, Flags.SYNC):
  55.             transport.peer_info = packet.tlvs[1]
  56.         
  57.         if flagged(packet.tf_combo, TFlags.PROTO_START):
  58.             log.info('Got new message')
  59.             msg = self._process_new(sender, packet)
  60.             transport.p2p_clients += 1
  61.         else:
  62.             msg = self._incoming[packet.package_id]
  63.         if flagged(packet.tf_combo, TFlags.MSNO_MORE):
  64.             msg.write(data)
  65.         
  66.         self.event('recv_data')
  67.         if flagged(packet.tf_combo, TFlags.MSNO_MORE) and struct.unpack('>Q', packet.tlvs.get(1, '\x00\x00\x00\x00\x00\x00\x00\x00'))[0] == 0:
  68.             log.info('Received message (transferred = %r)', msg.transferred)
  69.             transport.p2p_clients -= 1
  70.             self._process_msg(packet)
  71.         elif flagged(packet.flags, Flags.R_ACK):
  72.             self.send_ack(transport, sender, packet)
  73.         
  74.  
  75.     
  76.     def send_ack(self, transport, sender, packet):
  77.         
  78.         try:
  79.             id = self._last_acked + 1
  80.         except:
  81.             id = randid()
  82.         finally:
  83.             self._last_acked = None
  84.  
  85.         ack_msg = MSNC12Packet(**vars(packet))
  86.         ack_msg.payload = ''
  87.         ack_msg.tlvs = {
  88.             2: struct.pack('>I', packet.seqnum + len(packet.payload)) }
  89.         ack_msg.flags = 0
  90.         log.info('ack msg: %r', vars(ack_msg))
  91.         self.send_message(ack_msg)
  92.  
  93.     
  94.     def _process_new(self, sender, packet):
  95.         msg = P2PMessage(sender, None, header.msgid, header.flags, header.session, footer, header.total, content)
  96.         msg = None
  97.         self._incoming[packet.package_id] = msg
  98.         self.event('recv_msg_start', None)
  99.         return msg
  100.  
  101.  
  102.  
  103. class P2PTransport(P2PData.P2PTransport):
  104.     pass
  105.  
  106.  
  107. class MSNC12Packet(object):
  108.     
  109.     def __init__(self, **kws):
  110.         util.autoassign(self, kws)
  111.  
  112.     
  113.     def pack(self):
  114.         tlvs2_packed = self.pack_tlvs(self.tlvs2)
  115.         inner_header_len = len(self.tlvs2) + 8
  116.         inner = struct.pack('>BBHI', inner_header_len, self.tf_combo, self.package_id, self.session_id) + tlvs2_packed + self.payload
  117.         tlvs_packed = self.pack_tlvs(self.tlvs)
  118.         outer_header_len = len(self.tlvs) + 8
  119.         outer = struct.pack('>BBHI', outer_header_len, self.flags, len(inner), self.seqnum) + tlvs_packed + inner + self.footer
  120.         return outer
  121.  
  122.     
  123.     def unpack(cls, data, has_footer = True):
  124.         _data = data
  125.         (header_len, opcode, data_len, seqnum) = struct.unpack('>BBHI', data[:8])
  126.         data = data[8:]
  127.         tlvs = data[:header_len - 8]
  128.         data = data[header_len - 8:]
  129.         payload = data[:data_len]
  130.         data = data[data_len:]
  131.         if has_footer:
  132.             footer = data
  133.         else:
  134.             footer = ''
  135.         data = payload
  136.         (header2_len, tf_combo, package_id, session_id) = struct.unpack('>BBHI', data[:8])
  137.         data = data[8:]
  138.         tlvs2 = data[:header2_len - 8]
  139.         data = data[header2_len - 8:]
  140.         payload = data
  141.         return cls(flags = opcode, seqnum = seqnum, tlvs = cls.unpack_tlvs(tlvs), footer = footer, tf_combo = tf_combo, package_id = package_id, session_id = session_id, tlvs2 = cls.unpack_tlvs(tlvs2), payload = payload)
  142.  
  143.     unpack = classmethod(unpack)
  144.     
  145.     def unpack_tlvs(data):
  146.         _data = data
  147.         tlvs = { }
  148.         while data:
  149.             if data[0] == '\x00':
  150.                 data = ''
  151.                 break
  152.             
  153.             (t, l) = struct.unpack('>BB', data[:2])
  154.             data = data[2:]
  155.             v = data[:l]
  156.             data = data[l:]
  157.             tlvs[t] = v
  158.         return tlvs
  159.  
  160.     unpack_tlvs = staticmethod(unpack_tlvs)
  161.     
  162.     def pack_tlvs(tlvs):
  163.         data = []
  164.         for k, v in tlvs.items():
  165.             data.append(struct.pack('>BB', k, len(v)))
  166.             data.append(v)
  167.         
  168.         data = ''.join(data)
  169.         datalen = len(data)
  170.         missing = 4 - datalen % 4
  171.         if datalen != 4:
  172.             data += missing * '\x00'
  173.         
  174.         return data
  175.  
  176.     pack_tlvs = staticmethod(pack_tlvs)
  177.     
  178.     def __repr__(self):
  179.         return '<%s %s>' % (type(self).__name__, ' '.join((lambda .0: for i in .0:
  180. '%s=%r' % i)(vars(self).items())))
  181.  
  182.  
  183.