
[XMc           @   s  d  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 e d k r 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 e Z n( d d l	 m Z m Z m Z m Z m Z d d l m Z m Z m Z d d l m Z m Z m Z d d l m Z m Z m Z d e j f d     YZ  d d d     YZ! d e! e  f d     YZ" d S(   sp   
Various asynchronous UDP classes.

Please do not use this module directly.

Maintainer: Itamar Shtull-Trauring
iN(   t
   implements(   t   platformTypet   win32(   t   WSAEWOULDBLOCK(   t   WSAEINTR(   t   WSAEMSGSIZE(   t   WSAECONNREFUSED(   t   WSAECONNRESET(   t   EWOULDBLOCKt   EINTRt   EMSGSIZEt   ECONNREFUSEDt   EAGAIN(   t   baset   defert   address(   t   logt   reflectt   failure(   t   abstractt   errort
   interfacest   Portc           B   s   e  Z d  Z e e j e j e j  e j	 Z
 e j Z d Z d Z d d d 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.
    i   i   t    i    c         C   sN   t  j j |  |  | |  _ | |  _ | |  _ | |  _ |  j   d |  _	 d S(   s>   
        Initialize with a numeric port to listen on.
        N(
   R   t   BasePortt   __init__t   portt   protocolt   maxPacketSizet	   interfacet	   setLogStrt   Nonet   _connectedAddr(   t   selfR   t   protoR   R   t   reactor(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR   6   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!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   __repr__B   s    c         C   s   |  j  S(   s)   
        Return a socket object.
        (   t   socket(   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt	   getHandleH   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!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   startListeningN   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  d |  _ | |  _ |  j j |  _ d  S(   Ni   s   %s starting on %s(   t   createInternetSockett   bindR   R   R'   R   t   CannotListenErrort   getsocknameR$   R   t   msgR   R%   t	   connectedt   fileno(   R!   t   sktt   le(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR)   X   s     		c         C   s   |  j  j |   |  j   d  S(   N(   R   t   makeConnectiont   startReading(   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR*   i   s    c         C   s   d } x | |  j  k  r y |  j j |  j  \ } } Wn t j k
 r } | j d } | t t t f k rr d S| t	 k s t
 d k r | t k r |  j r |  j j   q q   q	 X| t |  7} y |  j j | |  Wq	 t j   q	 Xq	 Wd S(   s=   
        Called when my socket is ready for reading.
        i    NR   (   t   maxThroughputR'   t   recvfromR   R   t   argsR   R	   R   R   R   R   R    R   t   connectionRefusedt   lent   datagramReceivedR   t   err(   R!   t   readt   datat   addrt   set   no(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   doReadn   s"    $	c         C   s  |  j  r | d	 |  j  f k s$ t  y |  j j |  SWqt j k
 r } | j d } | t k rs |  j |  S| t	 k r t j
 d  q | t k r |  j j   q   qXn | d	 k s t  | d j d d  j   r| d d k rt j d t d d n  y |  j j | |  SWnm t j k
 r} | j d } | t k ra|  j | |  S| t	 k r|t j
 d  q| t k rd	 S  n Xd	 S(
   sz  
        Write a datagram.

        @type datagram: C{str}
        @param datagram: The datagram to be sent.

        @type addr: C{tuple} containing C{str} as first element and C{int} as
            second element, or C{None}
        @param addr: A tuple of (I{stringified dotted-quad IP address},
            I{integer port number}); can be C{None} in connected mode.
        i    s   message too longt   .R   s   <broadcast>s.   Please only pass IPs to write(), not hostnamest
   stackleveli   N(   R    R   t   AssertionErrorR'   t   sendR   R9   R	   t   writeR
   t   MessageLengthErrorR   R   R:   t   replacet   isdigitt   warningst   warnt   DeprecationWarningt   sendto(   R!   t   datagramR@   RA   RB   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyRH      s8    	
-	c         C   s   |  j  d j |  |  d  S(   NR   (   RH   t   join(   R!   t   seqR@   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   writeSequence   s    c         C   sY   |  j  r t d  n  t j |  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   isIPAddresst
   ValueErrorR'   t   connect(   R!   t   hostR   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyRW      s    	c         C   s=   |  j    |  j r9 d d l m } | j d |  j  n  d  S(   Ni(   R#   i    (   t   stopReadingR1   t   twisted.internetR#   t	   callLatert   connectionLost(   R!   R#   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   _loseConnection   s    
	c         C   s3   |  j  r t j   } |  _ n d  } |  j   | S(   N(   R1   R   t   Deferredt   dR   R]   (   R!   t   result(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   stopListening   s
    	
c         C   s$   t  j d t d d |  j   d  S(   Ns-   Please use stopListening() to disconnect portRE   i   (   RL   RM   RN   Ra   (   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   loseConnection   s    c         C   s   t  j d |  j  d |  _ t j j |  |  |  j j   d |  _	 |  j
 j   |  `
 |  ` t |  d  r |  j j d  |  ` n  d S(   s&   
        Cleans up my socket.
        s   (Port %s Closed)i    R_   N(   R   R0   R$   R   R   R   R\   R   t   doStopR1   R'   t   closeR2   t   hasattrR_   t   callback(   R!   t   reason(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR\      s    		c         C   s    t  j |  j j  d |  _ d  S(   Ns    (UDP)(   R   t   qualR   R%   t   logstr(   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR      s    c         C   s   |  j  S(   sK   
        Returns the name of my class, to prefix log entries with.
        (   Ri   (   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/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'   R/   (   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   getHost   s    i   N(!   t   __name__t
   __module__t   __doc__R    R   t   IListeningPortt   IUDPTransportt   ISystemHandleR'   t   AF_INETt   addressFamilyt
   SOCK_DGRAMt
   socketTypeR7   R   R$   R   R&   R(   R+   R)   R*   RC   RH   RS   RW   R]   Ra   Rb   R\   R   Rj   Rm   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR   &   s2   
					
			/							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_ntoat   structt   pack(   R!   t   i(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   getOutgoingInterface   s    c         C   s   |  j  j |  j |  j  S(   s   Returns Deferred of success.(   R#   t   resolvet   addCallbackt   _setInterface(   R!   R@   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   setOutgoingInterface  s    c         C   s/   t  j |  } |  j  j t  j t  j |  d S(   Ni   (   R'   t	   inet_atont
   setsockoptRz   R{   (   R!   R@   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR     s    c         C   s   |  j  j t  j t  j  S(   N(   R'   Ry   Rz   t   IP_MULTICAST_LOOP(   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   getLoopbackMode  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   Rz   R   (   R!   t   mode(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   setLoopbackMode  s    c         C   s   |  j  j t  j t  j  S(   N(   R'   Ry   Rz   t   IP_MULTICAST_TTL(   R!   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   getTTL  s    c         C   s2   t  j d |  } |  j j t j t j |  d  S(   Nt   B(   R}   R~   R'   R   Rz   R   (   R!   t   ttl(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   setTTL  s    R   c         C   s"   |  j  j |  j |  j | d  S(   s4   Join a multicast group. Returns Deferred of success.i   (   R#   R   R   t
   _joinAddr1(   R!   R@   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt	   joinGroup  s    c         C   s"   |  j  j |  j |  j | |  S(   N(   R#   R   R   t
   _joinAddr2(   R!   R@   R   RQ   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR     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   Rz   R   R   t   Failuret   MulticastJoinErrorR9   (   R!   R   R@   RQ   t   cmdt   e(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR      s    	!c         C   s"   |  j  j |  j |  j | d  S(   s2   Leave multicast group, return Deferred of success.i    (   R#   R   R   R   (   R!   R@   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt
   leaveGroup,  s    (   Rn   Ro   Rp   R   R   R   R   R   R   R   R   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyRx      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(   sX   
        @see: L{twisted.internet.interfaces.IReactorMulticast.listenMulticast}
        N(   R   R   t   listenMultiple(   R!   R   R"   R   R   R#   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR   8  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   R,   R   R   R'   t
   SOL_SOCKETt   SO_REUSEADDRRe   R   (   R!   R3   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR,   ?  s    	N(
   Rn   Ro   Rp   R    R   t   IMulticastTransportR   t   FalseR   R,   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyR   1  s   (    (#   Rp   R'   R   R}   RL   t   zope.interfaceR    t   twisted.python.runtimeR   t   errnoR   R   R   R	   R   R
   R   R   R   R   RZ   R   R   R   t   twisted.pythonR   R   R   R   R   R   R   R   Rx   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/udp.pyt   <module>   s(   	(8