home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2012 January / maximum-cd-2012-01.iso / DiscContents / digsby_setup.exe / lib / yahoo / yfiletransfer.pyo (.txt) < prev   
Encoding:
Python Compiled Bytecode  |  2011-10-05  |  7.0 KB  |  209 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. from __future__ import with_statement
  5. from httplib import IncompleteRead
  6. from YahooSocket import DEFAULT_YMSG_VERSION
  7. FILE_XFER_URL = 'http://filetransfer.msg.yahoo.com:80/notifyft'
  8. PROXY_FILESIZE_LIMIT = 1048576
  9. import common
  10. from traceback import print_exc
  11. from util import threaded, chained_files
  12. from yahooutil import filename_from_url
  13. import struct
  14. from StringIO import StringIO
  15. from util.net import HTTPConnProgress
  16. from logging import getLogger
  17. log = getLogger('yahoo.ft')
  18. info = log.info
  19. error = log.error
  20. in_cls = common.IncomingHTTPFileTransfer
  21. out_cls = common.filetransfer.OutgoingFileTransfer
  22. PNG_HEADER = struct.pack('8B', 137, 80, 78, 71, 13, 10, 26, 10)
  23.  
  24. class YahooHTTPIncoming(in_cls):
  25.     
  26.     def __init__(self, protocol, buddy, url):
  27.         in_cls.__init__(self, protocol, buddy, filename_from_url(url), url)
  28.  
  29.  
  30.  
  31. def set_buddy_icon(yahoo, image_data):
  32.     log.info('set_buddy_icon %r', yahoo)
  33.     YahooIconSender.send_buddy_icon(yahoo, image_data)
  34.  
  35.  
  36. class OutgoingYHTTPXfer(out_cls):
  37.     direction = 'outgoing'
  38.     http_path = '/notifyft'
  39.     host = 'filetransfer.msg.yahoo.com:80'
  40.     conn_host = 'filetransfer.msg.yahoo.com'
  41.     
  42.     def __init__(self, protocol, buddy = None, fileinfo = None, initiate = True):
  43.         out_cls.__init__(self)
  44.         if fileinfo is not None:
  45.             self.filepath = fpath = fileinfo.files[0]
  46.             self.name = fpath.name
  47.             self.size = fpath.size
  48.         
  49.         self.buddy = buddy
  50.         self.protocol = protocol
  51.         self.cancelled = False
  52.         if hasattr(fileinfo, 'obj'):
  53.             fileinfo.obj.close()
  54.         
  55.         if initiate:
  56.             self.initiate_transfer()
  57.         
  58.  
  59.     
  60.     def initiate_transfer(self, message = ''):
  61.         filesize = self.filepath.size
  62.         if filesize > PROXY_FILESIZE_LIMIT:
  63.             self.state = self.states.PROXY_XFER_FILESIZE_ERROR
  64.             return None
  65.         protocol = self.protocol
  66.         ydata = protocol.yahoo_packet_v_bin(DEFAULT_YMSG_VERSION, 'filetransfer', 'available', 'away_buddy', protocol.self_buddy.name, 'to', self.buddy.name, 'message', message, 'filename', self.name, 'filesize', str(filesize), 'filedata', '')
  67.         sublen = (struct.unpack('!H', ydata[8:10])[0] - (8 + len(str(filesize)))) + 14
  68.         ydata = ydata[:8] + struct.pack('!H', sublen - 1) + ydata[10:-2]
  69.         self.state = self.states.TRANSFERRING
  70.         
  71.         try:
  72.             fileobj = file(self.filepath, 'rb')
  73.         except:
  74.             filesize > PROXY_FILESIZE_LIMIT
  75.             print_exc()
  76.             self.state = self.states.CONN_FAIL
  77.             self.on_error()
  78.  
  79.         self._post_file(ydata, protocol.cookie_str, fileobj = fileobj, filesize = filesize)
  80.  
  81.     
  82.     def cancel(self):
  83.         
  84.         try:
  85.             self.conn.close()
  86.             del self.conn
  87.         except:
  88.             pass
  89.  
  90.         self.cancelled = True
  91.         self.state = self.states.CANCELLED_BY_YOU
  92.  
  93.     
  94.     def _post_file(self, ydata, cookies, fileobj = None, filesize = None):
  95.         
  96.         try:
  97.             self.conn = conn = HTTPConnProgress(self.conn_host)
  98.         except Exception:
  99.             e = None
  100.             print_exc()
  101.             if not self.cancelled:
  102.                 self.state = self.states.CONN_FAIL
  103.                 self.on_error()
  104.             
  105.             return False
  106.  
  107.         conn.putrequest('POST', self.http_path, skip_host = True, skip_accept_encoding = True)
  108.         conn.putheader('Cookie', cookies)
  109.         conn.putheader('Host', self.host)
  110.         conn.putheader('Content-Length', str(len(ydata) + filesize))
  111.         conn.putheader('Cache-Control', 'no-cache')
  112.         conn.endheaders()
  113.         diff = len(ydata) - filesize
  114.         
  115.         try:
  116.             if ydata != '':
  117.                 conn.send_file_cb(chained_files([
  118.                     ydata,
  119.                     fileobj]), self._setcompleted, progressDelta = len(ydata))
  120.             else:
  121.                 conn.send_file_cb(fileobj, self._setcompleted)
  122.         except:
  123.             if not self.cancelled:
  124.                 print_exc()
  125.                 self.state = self.states.CONN_FAIL
  126.             
  127.             
  128.             try:
  129.                 conn.close()
  130.  
  131.         finally:
  132.             
  133.             try:
  134.                 fileobj.close()
  135.             except:
  136.                 pass
  137.  
  138.  
  139.         if self.state != self.states.TRANSFERRING:
  140.             return None
  141.         self._setcompleted(filesize)
  142.         
  143.         try:
  144.             response = conn.getresponse()
  145.             respdata = response.read()
  146.             status = response.status
  147.             log.info('response data %d bytes, status code %s', len(respdata), status)
  148.             log.info('response data %s', respdata)
  149.             if status != 200:
  150.                 self.state = self.states.CONN_FAIL_XFER
  151.                 log.error('ERROR: POST returned a status of %d', status)
  152.                 return False
  153.             info('HTTP POST response status %d', status)
  154.         except IncompleteRead:
  155.             self.state != self.states.TRANSFERRING
  156.             self.state != self.states.TRANSFERRING
  157.             if ydata != '':
  158.                 raise 
  159.             ydata != ''
  160.         except:
  161.             self.state != self.states.TRANSFERRING
  162.         finally:
  163.             conn.close()
  164.  
  165.         self.state = self.states.FINISHED
  166.         self._ondone()
  167.         return True
  168.  
  169.     _post_file = threaded(_post_file)
  170.  
  171.  
  172. class YahooIconSender(OutgoingYHTTPXfer):
  173.     
  174.     def __repr__(self):
  175.         return '<YahooIconSender>'
  176.  
  177.     
  178.     def send_buddy_icon(cls, protocol, image_data):
  179.         Image = Image
  180.         import PIL
  181.         i = Image.open(StringIO(image_data))
  182.         if image_data[:8] != PNG_HEADER or i.size != (96, 96):
  183.             converted = StringIO()
  184.             i2 = i.Resized(96)
  185.             i2.save(converted, 'PNG')
  186.             image_data = converted.getvalue()
  187.         
  188.         xfer = YahooIconSender(protocol, initiate = False)
  189.         selfname = protocol.self_buddy.name
  190.         filesize = len(image_data)
  191.         ydata = protocol.yahoo_packet_v_bin(DEFAULT_YMSG_VERSION, 'picture_upload', 'available', 'frombuddy', selfname, 'expires', struct.pack('6s', '604800'), 'away_buddy', selfname, 'filesize', str(filesize), 'filename', 'myicon.png', 'message', ' ', 'filedata', '')
  192.         sublen = (struct.unpack('!H', ydata[8:10])[0] - (8 + len(str(filesize)))) + 14
  193.         ydata = ydata[:8] + struct.pack('!H', sublen - 1) + ydata[10:-2]
  194.         xfer.state = xfer.states.TRANSFERRING
  195.         log.info('sending %d bytes of image data', filesize)
  196.         xfer._post_file(ydata, protocol.cookie_str, fileobj = StringIO(image_data), filesize = filesize)
  197.  
  198.     send_buddy_icon = classmethod(send_buddy_icon)
  199.     
  200.     def _ondone(self):
  201.         self.setnotifyif('state', self.states.FINISHED)
  202.         self._done = True
  203.  
  204.     
  205.     def on_error(self):
  206.         log.critical('error sending icon')
  207.  
  208.  
  209.