home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / oscar / rendezvous / directim.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  10.1 KB  |  215 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. from util import strlist, lookup_table, bitflags_enabled, myip, callsback
  6. from util.packable import Packable
  7. from oscar.rendezvous.peer import OscarPeer
  8. from oscar.rendezvous.rendezvous import rendezvous_tlvs
  9. from oscar.OscarUtil import tlv_list
  10. import oscar
  11. import common
  12. import time
  13. import struct
  14. from logging import getLogger
  15. log = getLogger('oscar.rdv.directim')
  16. info = log.info
  17. import os.path as os
  18. import wx
  19. from util.BeautifulSoup import BeautifulSoup
  20. from functools import partial
  21. from oscar import OscarException
  22. from common.Protocol import StateMixin
  23. import hooks
  24.  
  25. def directconnect(protocol, screenname):
  26.     if not isinstance(screenname, str):
  27.         raise TypeError('screenname must be a str')
  28.     isinstance(screenname, str)
  29.     
  30.     ostrip = lambda s: s.lower().replace(' ', '')
  31.     if ostrip(screenname) == ostrip(protocol.self_buddy.name):
  32.         raise OscarException('You cannot direct connect with yourself.')
  33.     ostrip(screenname) == ostrip(protocol.self_buddy.name)
  34.     cookie = int(time.time() ** 2)
  35.     protocol.rdv_sessions[cookie] = dim = OscarDirectIM(protocol, screenname, cookie)
  36.     dim.request()
  37.     return dim
  38.  
  39.  
  40. class ODCHeader(Packable):
  41.     fmt = strlist('\n        version    4s      # always ODC2\n        hdrlen     H       # length of header\n        one        H       # 1\n        six        H       # 6\n        zero       H       # 0\n        cookie     Q       # sixteen byte rendezvous cookie\n        null       Q\n        length     I\n        encoding   H\n        subset     H\n        flags      I\n        zero       I\n        screenname 16s\n        null2      16s ')
  42.     
  43.     def make(cls, *a, **k):
  44.         k.update(dict(version = 'ODC2', static = 76, one = 1, six = 6, zero = 0, null = 0, null2 = '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'))
  45.         return cls(*a, **k)
  46.  
  47.     make = classmethod(make)
  48.     bitflags = lookup_table({
  49.         1: 'autoresponse',
  50.         2: 'typingpacket',
  51.         4: 'typed',
  52.         8: 'typing',
  53.         32: 'confirmation',
  54.         64: 'mac_confirmation' })
  55.     invars = [
  56.         (lambda o: o.version == 'ODC2')]
  57.  
  58.  
  59. class OscarDirectIM(OscarPeer, StateMixin):
  60.     
  61.     class Statuses:
  62.         DISCONNECTED = 'Disconnected'
  63.         CONNECTING = 'Connecting'
  64.         ERROR = 'Error'
  65.         CONNECTED = 'Connected'
  66.         OFFLINE = DISCONNECTED
  67.  
  68.     
  69.     class Reasons:
  70.         NONE = 'None'
  71.  
  72.     
  73.     def __init__(self, protocol, screenname, cookie):
  74.         StateMixin.__init__(self, self.Statuses.CONNECTING)
  75.         direct_im_cap = oscar.capabilities.by_name['direct_im']
  76.         OscarPeer.__init__(self, protocol, screenname, cookie, direct_im_cap)
  77.         self.buddy = protocol.buddies[screenname]
  78.  
  79.     
  80.     def accept(self):
  81.         info('%r accepted', self)
  82.         self.establish_dc()
  83.  
  84.     
  85.     def handle_request(self, rendtlvs):
  86.         self.send_rdv('cancel')
  87.  
  88.     
  89.     def setup_convo(self):
  90.         self.convo = self.protocol.convo_for(self.screenname)
  91.         self.convo.setnotifyif('type', 'dc')
  92.         self.convo.dc = self
  93.         self.change_state(self.Statuses.CONNECTED)
  94.  
  95.     
  96.     def on_odc_connection(self):
  97.         self.socket.receive_next(ODCHeader, self.odc_header_received)
  98.         self.setup_convo()
  99.         self.send_odc(flags = 96)
  100.  
  101.     
  102.     def odc_header_received(self, data):
  103.         (packet, data) = ODCHeader.unpack(data)
  104.         flags = bitflags_enabled(ODCHeader.bitflags, packet.flags)
  105.         info('incoming ODC header - enabled flags: %s', ', '.join(flags))
  106.         typeset = partial(self.convo.set_typing_status, self.screenname)
  107.         if 'typingpacket' in flags:
  108.             if 'typing' in flags:
  109.                 typeset('typing')
  110.             elif 'typed' in flags:
  111.                 typeset('typed')
  112.             else:
  113.                 typeset(None)
  114.         
  115.         next = self.socket.receive_next
  116.         leftover = packet.hdrlen - ODCHeader._struct.size
  117.         if leftover:
  118.             next(leftover, self.read_leftover(packet.length))
  119.         elif packet.length > 0:
  120.             next(packet.length, self.odc_body_received)
  121.         else:
  122.             next(ODCHeader, self.odc_header_received)
  123.  
  124.     
  125.     def read_leftover(self, paklen):
  126.         info('read %d leftover bytes', paklen)
  127.         next = self.socket.receive_next
  128.         
  129.         def callback(data):
  130.             if paklen > 0:
  131.                 next(paklen, self.odc_body_received)
  132.             else:
  133.                 next(ODCHeader, self.odc_header_received)
  134.  
  135.         return callback
  136.  
  137.     
  138.     def odc_body_received(self, data):
  139.         info('odc_body_received')
  140.         import stdpaths
  141.         assetdir = stdpaths.userdata
  142.         self.convo.incoming_message(self.screenname, msg)
  143.         self.socket.receive_next(ODCHeader, self.odc_header_received)
  144.  
  145.     
  146.     def send_odc(self, data = '', flags = 0):
  147.         bname = self.protocol.self_buddy.name
  148.         packet = ODCHeader.make(cookie = self.cookie, screenname = bname)
  149.         packet.flags = flags
  150.         if isinstance(data, list):
  151.             packet.length = sum((lambda .0: for d in .0:
  152. len(d))(data))
  153.             info('send_odc got a list, summed length is %d', packet.length)
  154.         else:
  155.             packet.length = len(data)
  156.             info('send_odc got a string, length is %d', packet.length)
  157.         packet.hdrlen = len(packet)
  158.         info('sending ODC header to screenname %s (%d bytes of %r)', bname, len(packet), str(type(packet)))
  159.         if isinstance(data, list):
  160.             self.socket.push(packet.pack() + ''.join(data))
  161.         else:
  162.             self.socket.push(packet.pack() + data)
  163.  
  164.     
  165.     def send_typing(self, status):
  166.         flag = {
  167.             'typing': 8,
  168.             'typed': 4,
  169.             None: 0 }[status]
  170.         self.send_odc(flags = 2 | flag)
  171.  
  172.     
  173.     def request(self):
  174.         self.establish_out_dc()
  175.  
  176.     
  177.     def ch2accept(self, data):
  178.         info('incoming dIM got channel 2 accept')
  179.  
  180.     
  181.     def send_message(self, message):
  182.         self.send_odc(message)
  183.  
  184.     
  185.     def decline(self):
  186.         self.send_rdv('cancel')
  187.  
  188.     
  189.     def ch2cancel(self, data):
  190.         info('%r cancelled', self)
  191.         if hasattr(self, 'convo'):
  192.             self.convo.setnotifyif('type', 'im')
  193.         
  194.         self.change_state(self.Statuses.DISCONNECTED)
  195.  
  196.     
  197.     def disconnect(self):
  198.         self.socket.close()
  199.         del self.convo.dc
  200.         self.convo.setnotifyif('type', 'im')
  201.         self.change_state(self.Statuses.DISCONNECTED)
  202.  
  203.     
  204.     def __repr__(self):
  205.         return '<OscarDirectIM with %s>' % self.screenname
  206.  
  207.  
  208.  
  209. def initialize():
  210.     log.info('\tloading rendezvous handler: direct IM')
  211.     import oscar.rendezvous.peer as peer
  212.     peer.register_rdv_factory('direct_im', OscarDirectIM)
  213.  
  214. hooks.Hook('oscar.rdv.load').register(initialize)
  215.