
>Mc           @   s?  d  Z  d d l m Z m Z m Z m Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z m Z d e j f d     YZ d f  d     YZ d e e f d     YZ  d S(   s   
UDP support for IOCP reactor
i(   t   defert   addresst   errort
   interfaces(   t   isIPAddress(   t   logt   reflectt   failure(   t
   implementsN(   t   ERROR_IO_PENDING(   t   ERROR_CONNECTION_REFUSED(   t   ERROR_PORT_UNREACHABLE(   t   IReadWriteHandle(   t   iocpsupportt   abstractt   Portc           B   s  e  Z d  Z e e e j e j e j  e	 j
 Z e	 j Z e Z d Z d d d d  Z d   Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z d d  Z d   Z d   Z d   Z d   Z  d   Z! d d  Z" d   Z# d   Z$ d   Z% RS(   s*   
    UDP port, listening for packets.
    t    i    c         C   s   | |  _  | |  _ | |  _ | |  _ |  j   d |  _ t j j	 |  |  t
 j
 |  j |  j  } t j | j    } t j |  |  _ t j t j d   |  _ d S(   s>   
        Initialize with a numeric port to listen on.
        t   iN(   t   portt   protocolt   readBufferSizet	   interfacet	   setLogStrt   Nonet   _connectedAddrR   t
   FileHandlet   __init__t   sockett   addressFamilyt
   socketTypet   _iocpt
   maxAddrLent   filenot   AllocateReadBuffert   addressBuffert   structt   calcsizet   addressLengthBuffer(   t   selfR   t   protoR   t   maxPacketSizet   reactort   sktt   addrLen(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   (   s    				
	c         C   s;   |  j  d  k	 r& d |  j j |  j  f Sd |  j j f Sd  S(   Ns
   <%s on %s>s   <%s not connected>(   t   _realPortNumberR   R   t	   __class__(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   __repr__>   s    c         C   s   |  j  S(   s)   
        Return a socket object.
        (   R   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt	   getHandleF   s    c         C   s   |  j    |  j   d S(   s   
        Create and bind my socket, and begin listening on it.

        This is called on unserialization, and must be called after creating a
        server to begin listening on the specified port.
        N(   t   _bindSockett   _connectToProtocol(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   startListeningM   s    
c         C   s   |  j  j |  j |  j  S(   N(   R)   t   createSocketR   R   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR3   X   s    c         C   s   y) |  j    } | j |  j |  j f  Wn1 t j k
 r\ } t j |  j |  j | f  n X| j   d |  _ t	 j
 d |  j j |  j f  t |  _ | |  _ |  j j |  _ d  S(   Ni   s   %s starting on %s(   R3   t   bindR   R   R   R   t   CannotListenErrort   getsocknameR,   R   t   msgR   R-   t   Truet	   connectedR    t   getFileHandle(   R&   R*   t   le(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR0   \   s    			c         C   s.   |  j  j |   |  j   |  j j |   d  S(   N(   R   t   makeConnectiont   startReadingR)   t   addActiveHandle(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR1   o   s    
c         C   s-   |  j  r) |  j | | |  |  j   n  d  S(   N(   t   readingt
   handleReadt   doRead(   R&   t   rct   bytest   evt(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   cbReadu   s    	c         C   s   | t  j t  j t t f k r: |  j r |  j j   q ns | ri t j	 d t  j
 j | d  | f  nD y0 |  j j t | j |   t j | j   Wn t j   n Xd  S(   Ns   error in recvfrom -- %s (%s)s   unknown error(   t   errnot   WSAECONNREFUSEDt   WSAECONNRESETR
   R   R   R   t   connectionRefusedR   R7   t	   errorcodet   gett   datagramReceivedt   strt   buffR   t   makesockaddrt	   addr_bufft   err(   R&   RB   RC   RD   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR@   {   s    		 c         C   s   t  j |  j |   } |  j d | _ } |  j | _ } |  j | _ } t  j	 |  j
   | | | |  \ } } | r | t k r |  j | | |  n  d  S(   Ni    (   R   t   EventRE   t   _readBuffersRN   R"   RP   R%   t   addr_len_bufft   recvfromR:   R	   R@   (   R&   RD   RN   RP   RT   RB   RC   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyRA      s    c         C   s  |  j  r | d |  j  f k s$ t  y |  j j |  SWqt j k
 r } | j d } | t j k rv |  j	 |  S| t j
 k r t j d  q | t j t j t t f k r |  j j   q   qXn | d k s t  | d j d d  j   st j d t d d n  y |  j j | |  SWn t j k
 r} | j d } | t j k rk|  j	 | |  S| t j
 k rt j d  q| t j t j t t f k rd S  n Xd S(	   s~   
        Write a datagram.

        @param addr: should be a tuple (ip, port), can be None in connected
        mode.
        i    s   message too longt   .R   s.   Please only pass IPs to write(), not hostnamest
   stackleveli   N(   R   R   t   AssertionErrorR   t   sendR   t   argsRF   t   WSAEINTRt   writet   WSAEMSGSIZEt   MessageLengthErrorRG   RH   R
   R   R   RI   t   replacet   isdigitt   warningst   warnt   DeprecationWarningt   sendto(   R&   t   datagramt   addrt   set   no(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR\      s<    	
	c         C   s   |  j  d j |  |  d  S(   NR   (   R\   t   join(   R&   t   seqRf   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   writeSequence   s    c         C   sY   |  j  r t d   n  t |  s0 t d  n  | | f |  _  |  j j | | f  d S(   s-   
        'Connect' to remote server.
        s\   already connected, reconnecting is not currently supported (talk to itamar if you want this)s/   please pass only IP addresses, not domain namesN(   R   t   RuntimeErrorR   t
   ValueErrorR   t   connect(   R&   t   hostR   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyRn      s    	c         C   sM   |  j    |  j j |   |  j rI d d l m } | j d |  j  n  d  S(   Ni(   R)   i    (   t   stopReadingR)   t   removeActiveHandleR9   t   twisted.internett	   callLatert   connectionLost(   R&   R)   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   _loseConnection   s
    
	c         C   s3   |  j  r t j   } |  _ n d  } |  j   | S(   N(   R9   R    t   Deferredt   dR   Ru   (   R&   t   result(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   stopListening   s
    	
c         C   s$   t  j d t d d |  j   d  S(   Ns-   Please use stopListening() to disconnect portRW   i   (   Ra   Rb   Rc   Ry   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   loseConnection   s    	c         C   s   t  j d |  j  d |  _ |  j   t |  d  rF |  j j   n  t |  _	 t
 |  _ |  j j   |  ` |  ` t |  d  r |  j j d  |  ` n  d S(   s&   
        Cleans up my socket.
        s   (Port %s Closed)R   Rw   N(   R   R7   R,   R   Rp   t   hasattrR   t   doStopt   FalseR9   R8   t   disconnectedR   t   closeR:   Rw   t   callback(   R&   t   reason(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyRt      s    	
		c         C   s    t  j |  j j  d |  _ d  S(   Ns    (UDP)(   R   t   qualR   R-   t   logstr(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR     s    c         C   s   |  j  S(   sK   
        Returns the name of my class, to prefix log entries with.
        (   R   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt	   logPrefix  s    c         C   s   t  j d |  j j    S(   si   
        Returns an IPv4Address.

        This indicates the address from which I am connecting.
        t   UDP(   R   t   IPv4AddressR   R6   (   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   getHost  s    N(&   t   __name__t
   __module__t   __doc__R   R   R   t   IListeningPortt   IUDPTransportt   ISystemHandleR   t   AF_INETR   t
   SOCK_DGRAMR   R}   t   dynamicReadBuffersR   R,   R   R.   R/   R2   R3   R0   R1   RE   R@   RA   R\   Rk   Rn   Ru   Ry   Rz   Rt   R   R   R   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR      s:   
											-								t   MulticastMixinc           B   sw   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d d	  Z
 d
   Z d   Z d d  Z RS(   s,   
    Implement multicast functionality.
    c         C   s4   |  j  j t  j t  j  } t  j t j d |   S(   Ns   @i(   R   t
   getsockoptt
   IPPROTO_IPt   IP_MULTICAST_IFt	   inet_ntoaR#   t   pack(   R&   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   getOutgoingInterface  s    c         C   s   |  j  j |  j |  j  S(   s.   
        Returns Deferred of success.
        (   R)   t   resolvet   addCallbackt   _setInterface(   R&   Rf   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   setOutgoingInterface#  s    c         C   s/   t  j |  } |  j  j t  j t  j |  d S(   Ni   (   R   t	   inet_atont
   setsockoptR   R   (   R&   Rf   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   *  s    c         C   s   |  j  j t  j t  j  S(   N(   R   R   R   t   IP_MULTICAST_LOOP(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   getLoopbackMode0  s    c         C   s;   t  j d t j |   } |  j j t j t j |  d  S(   Nt   b(   R#   R   t   operatort   truthR   R   R   R   (   R&   t   mode(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   setLoopbackMode5  s    c         C   s   |  j  j t  j t  j  S(   N(   R   R   R   t   IP_MULTICAST_TTL(   R&   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   getTTL;  s    c         C   s2   t  j d |  } |  j j t j t j |  d  S(   Nt   B(   R#   R   R   R   R   R   (   R&   t   ttl(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   setTTL@  s    R   c         C   s"   |  j  j |  j |  j | d  S(   sF   
        Join a multicast group. Returns Deferred of success.
        i   (   R)   R   R   t
   _joinAddr1(   R&   Rf   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt	   joinGroupE  s    c         C   s"   |  j  j |  j |  j | |  S(   N(   R)   R   R   t
   _joinAddr2(   R&   Rf   R   Ri   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   M  s    c         C   s   t  j |  } t  j |  } | r0 t  j } n	 t  j } y! |  j  j t  j | | |  Wn2 t  j k
 r } t j t j	 | | | j
   SXd  S(   N(   R   R   t   IP_ADD_MEMBERSHIPt   IP_DROP_MEMBERSHIPR   R   R   R   t   Failuret   MulticastJoinErrorRZ   (   R&   R   Rf   Ri   t   cmdt   e(    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   R  s    	!c         C   s"   |  j  j |  j |  j | d  S(   sD   
        Leave multicast group, return Deferred of success.
        i    (   R)   R   R   R   (   R&   Rf   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt
   leaveGroup`  s    (   R   R   R   R   R   R   R   R   R   R   R   R   R   R   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR     s   									t   MulticastPortc           B   s9   e  Z d  Z e e j  d d d e d  Z d   Z	 RS(   s.   
    UDP Port that supports multicasting.
    R   i    c         C   s)   t  j |  | | | | |  | |  _ d  S(   N(   R   R   t   listenMultiple(   R&   R   R'   R   R(   R)   R   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   q  s    c         C   sc   t  j |   } |  j r_ | j t j t j d  t t d  r_ | j t j t j d  q_ n  | S(   Ni   t   SO_REUSEPORT(	   R   R3   R   R   R   t
   SOL_SOCKETt   SO_REUSEADDRR{   R   (   R&   R*   (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR3   w  s    	N(
   R   R   R   R   R   t   IMulticastTransportR   R}   R   R3   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyR   i  s
   (!   R   Rr   R    R   R   R   t   twisted.internet.abstractR   t   twisted.pythonR   R   R   t   zope.interfaceR   R   R   R#   Ra   RF   t"   twisted.internet.iocpreactor.constR	   R
   R   t'   twisted.internet.iocpreactor.interfacesR   t   twisted.internet.iocpreactorR   R   R   R   R   R   R   (    (    (    sD   /usr/lib/python2.7/dist-packages/twisted/internet/iocpreactor/udp.pyt   <module>   s   "< Q