
CMc           @   s1  d  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 m Z y d d l	 m
 Z
 Wn e k
 r d Z
 n Xd d l m Z d d l m Z m Z e d k re   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 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) e   Z* e Z+ d d l m Z, d d l- m. Z/ n 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 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& 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, d d" l m/ Z/ d d# l m0 Z0 d d$ l1 m2 Z2 m3 Z3 m4 Z4 d d% l5 m6 Z6 d d& l m7 Z7 m8 Z8 m9 Z9 d d' l: m; Z; d d( l< m= Z= d d) l1 m> Z> m? Z? m@ Z@ mA ZA d* e f d+     YZB d, d= d-     YZC d. e f d/     YZD i  d0  ZE d1 e> jF eB f d2     YZG e
 re eG e@ jH  n  d3 eG f d4     YZI d5 eI f d6     YZJ d7 eG f d8     YZK d9 e2 jL eB f d:     YZM d; e2 jN f d<     YZO d S(>   s   
Various asynchronous TCP/IP classes.

End users shouldn't use this module directly - use the reactor APIs instead.

Maintainer: Itamar Shtull-Trauring
iN(   t
   implementst   classImplements(   t   SSL(   t   platformType(   t   versionst	   deprecatet   win32(   t	   WSAEINVAL(   t   WSAEWOULDBLOCK(   t   WSAEINPROGRESS(   t   WSAEALREADY(   t   WSAECONNRESET(   t
   WSAEISCONN(   t   WSAENOTCONN(   t   WSAEINTR(   t
   WSAENOBUFS(   t	   WSAEMFILE(   t   formatError(   t   EPERM(   t   EINVAL(   t   EWOULDBLOCK(   t   EINPROGRESS(   t   EALREADY(   t
   ECONNRESET(   t   EISCONN(   t   ENOTCONN(   t   EINTR(   t   ENOBUFS(   t   EMFILE(   t   ENFILE(   t   ENOMEM(   t   EAGAIN(   t   ECONNABORTED(   t   strerror(   t	   errorcode(   t   baset   addresst   fdesc(   t
   deferLater(   t   logt   failuret   reflect(   t
   unsignedID(   t   CannotListenError(   t   abstractt   maint
   interfacest   errort   _SocketCloserc           B   s   e  Z d  Z d   Z RS(   t   shutdownc         C   sc   |  j  } y t | |  j  d  Wn t  j k
 r9 n Xy | j   Wn t  j k
 r^ n Xd  S(   Ni   (   t   sockett   getattrt   _socketShutdownMethodR/   t   close(   t   selft   skt(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   _closeSocketV   s    	(   t   __name__t
   __module__R4   R8   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR0   S   s   t	   _TLSMixinc           B   s   e  Z d  Z d Z d Z e Z Z d   Z d   Z	 d   Z
 d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z RS(   t   sock_shutdowni    c         C   s   |  j  j   S(   N(   R2   t   get_peer_certificate(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   getPeerCertificateo   s    c         C   s  |  j  r t j S|  j r/ d |  _ |  j   n  y t j |   SWn t j k
 rZ t j St j	 k
 rn d  St j
 k
 r d |  _ t j |   t j |   d  St j k
 r \ } } | d k r | d k s | d k r t j St j   t j St j k
 r} | SXd  S(   Ni    i   is   Unexpected EOF(   t   disconnectedR-   t   CONNECTION_DONEt   writeBlockedOnReadt   _resetReadWritet
   Connectiont   doReadR   t   ZeroReturnErrort   WantReadErrort   WantWriteErrort   readBlockedOnWritet   startWritingt   stopReadingt   SysCallErrort   CONNECTION_LOSTR'   t   errt   Error(   R6   t   retvalt   desct   e(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRD   r   s0    				
c         C   sR   |  j  r |  j   S|  j r& |  j   S|  j rE d |  _ |  j   n  t j |   S(   Ni    (   R?   t   _postLoseConnectiont   _writeDisconnectedt   _closeWriteConnectionRH   RB   RC   t   doWrite(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRU      s    	
	
		c         C   s   y t  j |  |  SWn t j k
 r+ d St j k
 rb d |  _ t  j |   t  j |   d St j k
 ry t	 j
 St j k
 r } | d d k r | d k r d St	 j
 Sn t j k
 r } | SXd  S(   Ni    i   it    (   RC   t   writeSomeDataR   RG   RF   RA   t   stopWritingt   startReadingRE   R-   RL   RK   RN   (   R6   t   dataRQ   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRW      s"    	
c         C   s;   t  |  _ t |  j d  r1 |  j j t j  n  |  j   S(   s   
        Gets called after loseConnection(), after buffered data is sent.

        We try to send an SSL shutdown alert, but if it doesn't work, retry
        when the socket is writable.
        t   set_shutdown(   t   TrueR?   t   hasattrR2   R[   R   t   RECEIVED_SHUTDOWNt   _sendCloseAlert(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRR      s    	c         C   s(  y t  j |  j j   d  Wn7 t k
 rV } | j d t t t f k rO d St	 j
 SXy t |  j d  r |  j j   } |  j j | t j B |  j j   } | t j @s |  j j t j  q n |  j j   t } Wn t j k
 r } | SX| r|  j   t	 j S|  j   |  j   d  Sd  S(   NRV   i    R[   (   t   ost   writeR2   t   filenot   OSErrort   argsR   R   R   R-   RL   R]   t   get_shutdownR[   R   R^   R1   t   SENT_SHUTDOWNR\   RN   RX   R@   RI   RY   t   None(   R6   t   set	   laststatet   doneRQ   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR_      s.    



c         C   s,   |  j    } | t j k r( t j |   S| S(   N(   R_   R-   R@   RC   RT   (   R6   t   result(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRT   !  s    c         C   s#   t  |  _ |  j s t j |   Sd  S(   N(   R\   t   _userWantReadRH   RC   RY   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRY   )  s    		c         C   s#   t  |  _ |  j s t j |   Sd  S(   N(   t   FalseRl   RA   RC   RJ   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRJ   .  s    		c         C   s#   t  |  _ |  j s t j |   Sd  S(   N(   R\   t   _userWantWriteRA   RC   RI   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRI   3  s    		c         C   s#   t  |  _ |  j s t j |   Sd  S(   N(   Rm   Rn   RH   RC   RX   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRX   8  s    		c         C   sD   |  j  r |  j   n
 |  j   |  j r6 |  j   n
 |  j   d  S(   N(   Rn   RI   RX   Rl   RY   RJ   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRB   =  s    	
	(   R9   R:   R4   RA   RH   R\   Rl   Rn   R>   RD   RU   RW   RR   R_   RT   RY   RJ   RI   RX   RB   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR;   h   s    
		*				A					t   _TLSDelayedc           B   s   e  Z d  Z d   Z RS(   s  
    State tracking record for TLS startup parameters.  Used to remember how
    TLS should be started when starting it is delayed to wait for the output
    buffer to be flushed.

    @ivar bufferedData: A C{list} which contains all the data which was
        written to the transport after an attempt to start TLS was made but
        before the buffers outstanding at that time could be flushed and TLS
        could really be started.  This is appended to by the transport's
        write and writeSequence methods until it is possible to actually
        start TLS, then it is written to the TLS-enabled transport.

    @ivar context: An SSL context factory object to use to start TLS.

    @ivar extra: An extra argument to pass to the transport's C{startTLS}
        method.
    c         C   s   | |  _  | |  _ | |  _ d  S(   N(   t   bufferedDatat   contextt   extra(   R6   Rp   Rq   Rr   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   __init__^  s    		(   R9   R:   t   __doc__Rs   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRo   L  s   c         C   s:   |  | k r2 d t  |  f d     Y} | | |  <n  | |  S(   Nt   TLSConnectionc           B   s   e  Z e e j  RS(    (   R9   R:   R    R.   t   ISSLTransport(    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRu   g  s   (   R;   (   t   klasst	   _existingRu   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   _getTLSClasse  s    RC   c           B   s   e  Z d  Z e e j e j  d Z d d  Z	 e
 rm d Z d   Z d   Z d   Z d   Z d   Z n  d   Z d	   Z d
   Z d   Z d   Z d   Z d Z d   Z d   Z d   Z d   Z d   Z RS(   s
  
    Superclass of all socket-based FileDescriptors.

    This is an abstract superclass of all objects which represent a TCP/IP
    connection based socket.

    @ivar logstr: prefix used when logging events related to this connection.
    @type logstr: C{str}
    i    c         C   sH   t  j j |  d | | |  _ |  j j d  | j |  _ | |  _ d  S(   Nt   reactori    (   R,   t   FileDescriptorRs   R2   t   setblockingRb   t   protocol(   R6   R7   R}   Rz   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRs   }  s
    	c         C   s   |  j  s t  |  j s" |  j r; t g  | |  |  _ t S|  j   |  j   |  j	   t
 j | j   |  j  |  _ |  j j |  _ |  j   t S(   N(   t   TLSt   AssertionErrort
   dataBuffert   _tempDataBufferRo   t   _tlsWaitingRm   RJ   RX   t	   _startTLSR   RC   t
   getContextR2   Rb   RY   R\   (   R6   t   ctxRr   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   startTLS  s    



c         C   s   d |  _  t |  j  |  _ d  S(   Ni   (   R~   Ry   t	   __class__(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    	c         C   s<   |  j  d  k	 r% |  j  j j |  n t j j |  |  d  S(   N(   R   Rg   Rp   t   appendR,   R{   Ra   (   R6   t   bytes(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRa     s    c         C   s<   |  j  d  k	 r% |  j  j j |  n t j j |  |  d  S(   N(   R   Rg   Rp   t   extendR,   R{   t   writeSequence(   R6   t   iovec(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    c         C   sw   t  j j |   } |  j d  k	 rs |  j rs |  j rs |  j } d  |  _ |  j | j | j	  |  j
 | j  qs n  | S(   N(   R,   R{   RU   R   Rg   R   R   R   Rq   Rr   R   Rp   (   R6   Rk   t   waiting(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRU     s    		c         C   s   |  j  S(   s&   Return the socket for this connection.(   R2   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt	   getHandle  s    c         C   s   y |  j  j |  j  } Wn4 t  j k
 rO } | j d t k rE d St j Sn X| s] t j S|  j	 j
 |  } | d k	 r |  j	 j
 } d } t j | t j d d d d  d | } t j | |  n  | S(   s\  Calls self.protocol.dataReceived with all available data.

        This reads up to self.bufferSize bytes of data from its socket, then
        calls self.dataReceived(data) to process it.  If the connection is not
        lost through an error in the physical recv(), this function will return
        the result of the dataReceived call.
        i    NsP   Returning a value other than None from %(fqpn)s is deprecated since %(version)s.t   Twistedi   t   format(   R2   t   recvt
   bufferSizeR/   Rd   R   R-   RL   R@   R}   t   dataReceivedRg   R   t   getDeprecationWarningStringR   t   Versiont   warnAboutFunction(   R6   RZ   Rh   t   rvalt   offendert   warningFormatt   warningString(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRD     s"    	c         C   s   y# |  j  j t | d |  j   SWnZ t  j k
 r } | j d t k rX |  j |  S| j d t t	 f k ru d St
 j Sn Xd S(   s  
        Write as much as possible of the given data to this TCP connection.

        This sends up to C{self.SEND_LIMIT} bytes from C{data}.  If the
        connection is lost, an exception is returned.  Otherwise, the number
        of bytes successfully written is returned.
        i    N(   R2   t   sendt   buffert
   SEND_LIMITR/   Rd   R   RW   R   R   R-   RL   (   R6   RZ   Rh   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRW     s    #c         C   s   y t  |  j |  j  d  Wn t j k
 r3 n Xt j |  j d   } | r y | j   Wq t	 j
   } t j   |  j |  q Xn  d  S(   Ni   (   R3   R2   R4   R/   R.   t   IHalfCloseableProtocolR}   Rg   t   writeConnectionLostR(   t   FailureR'   RM   t   connectionLost(   R6   t   pt   f(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRT     s    
c         C   sd   t  j |  j d   } | rS y | j   Wq` t j   |  j t j	    q` Xn |  j |  d  S(   N(
   R.   R   R}   Rg   t   readConnectionLostR'   RM   R   R(   R   (   R6   t   reasonR   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    
c         C   sI   t  j j |  |  |  j   |  j } |  ` |  ` |  ` | j |  d S(   s6   See abstract.FileDescriptor.connectionLost().
        N(   R,   R{   R   R8   R}   R2   Rb   (   R6   R   R}   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    
	t   Uninitializedc         C   s   |  j  S(   sE   Return the prefix to log with when I own the logging thread.
        (   t   logstr(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt	   logPrefix  s    c         C   s"   t  j |  j j t j t j   S(   N(   t   operatort   truthR2   t
   getsockoptt   IPPROTO_TCPt   TCP_NODELAY(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   getTcpNoDelay  s    c         C   s    |  j  j t  j t  j |  d  S(   N(   R2   t
   setsockoptR   R   (   R6   t   enabled(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   setTcpNoDelay  s    c         C   s"   t  j |  j j t j t j   S(   N(   R   R   R2   R   t
   SOL_SOCKETt   SO_KEEPALIVE(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   getTcpKeepAlive   s    c         C   s    |  j  j t  j t  j |  d  S(   N(   R2   R   R   R   (   R6   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   setTcpKeepAlive$  s    N(   R9   R:   Rt   R    R.   t   ITCPTransportt   ISystemHandleR~   Rg   Rs   R   R   R   R   Ra   R   RU   R   RD   RW   RT   R   R   R   R   R   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRC   n  s.   															t
   BaseClientc           B   s}   e  Z d  Z e j Z e j Z d   Z d d  Z	 d   Z
 d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z RS(   s8   A base class for client TCP (and similiar) sockets.
    c         C   sa   | rG t  j |  | d |  |  j |  _ |  j |  _ | j d |  n | j d |  j |  d S(   sC   Called by base classes to continue to next stage of initialization.i    N(   RC   Rs   Rg   t	   doConnectRU   RD   t	   callLatert   failIfNotConnected(   R6   t   whenDoneR7   R/   Rz   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   _finishInit0  s    i   c         C   s?   t  j |  | |  r; | r+ |  j j   q; |  j j   n  d  S(   N(   RC   R   R2   t   set_connect_statet   set_accept_state(   R6   R   t   client(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   :  s    c         C   s   |  j  t j    d S(   s   Stop attempt to connect.N(   R   R/   t	   UserError(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   stopConnectingB  s    c         C   s   |  j  s" |  j s" t |  d  r& d S|  j j t j |   t |  d  rk |  j   |  j   |  ` n  y |  j	   Wn t
 k
 r n X|  ` |  ` d S(   s   
        Generic method called when the attemps to connect failed. It basically
        cleans everything it can: call connectionFailed, stop read and write,
        delete socket related members.
        t	   connectorNRz   (   t	   connectedR?   R]   R   t   connectionFailedR(   R   RJ   RX   R8   t   AttributeErrorR2   Rb   (   R6   RM   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   F  s    

	c         C   s<   t  j  |  j |  j  } | j d  t j | j    | S(   sc   (internal) Create a non-blocking socket using
        self.addressFamily, self.socketType.
        i    (   R2   t   addressFamilyt
   socketTypeR|   R%   t   _setCloseOnExecRb   (   R6   t   s(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   createInternetSocket^  s    c         C   s`   t  j |  j d  r- |  j |  j d  n/ |  j j |  j d  } | j |  j |  j  d  S(   Ni    (   R,   t   isIPAddresst   addrt   _setRealAddressRz   t   resolvet   addCallbacksR   (   R6   t   d(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   resolveAddressg  s    c         C   s$   | |  j  d f |  _ |  j   d  S(   Ni   (   R   t   realAddressR   (   R6   R$   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   n  s    c         C   sJ  t  |  d  s d S|  j j t j t j  } | rZ |  j t j | t |  f   d Sy |  j j	 |  j
  } Wn# t j k
 r } | j d } n X| r| t k r q| t t t f k s | t k r t d k r |  j   |  j   d S|  j t j | t |  f   d Sn  |  ` |  ` |  j   |  j   |  j   d S(   sm   I connect the socket.

        Then, call the protocol's makeConnection, and start waiting for data.
        R   Ni    R   (   R]   R2   R   R   t   SO_ERRORR   R/   t   getConnectErrorR!   t
   connect_exR   Rd   R   R   R   R   R   R   RY   RI   RU   RD   RJ   RX   t   _connectDone(   R6   RM   t   connectResultRh   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   r  s2    "


"

c         C   sX   |  j  j |  j    |  _ d |  _ |  j j j d |  _ |  j   |  j j	 |   d  S(   Ni   s   ,client(
   R   t   buildProtocolt   getPeerR}   R   R   R9   R   RY   t   makeConnection(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s
    	
c         C   sI   |  j  s% |  j t j d |   n  t j |  |  |  j j |  d  S(   Nt   string(   R   R   R/   t   ConnectErrorRC   R   R   (   R6   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    	(   R9   R:   Rt   R2   t   AF_INETR   t   SOCK_STREAMR   R   R   R   R   R   R   R   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   *  s   			
							2	t   Clientc           B   s5   e  Z d  Z d d  Z d   Z d   Z d   Z RS(   s   A TCP client.c   
      C   s   | |  _  | | f |  _ |  j } d  } d  } y |  j   } Wn6 t j k
 ru }	 t j |	 d |	 d  } d  } n X| r | d  k	 r y | j |  Wq t j k
 r }	 t j |	 d |	 d  } d  } q Xn  |  j	 | | | |  d  S(   Ni    i   (
   R   R   R   Rg   R   R2   R/   t   ConnectBindErrort   bindR   (
   R6   t   hostt   portt   bindAddressR   Rz   R   RM   R7   Rh   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRs     s"    		
c         C   s   t  j d |  j j    S(   s`   Returns an IPv4Address.

        This indicates the address from which I am connecting.
        t   TCP(   R$   t   IPv4AddressR2   t   getsockname(   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   getHost  s    c         C   s   t  j d |  j  S(   s\   Returns an IPv4Address.

        This indicates the address that I am connected to.
        R   (   R$   R   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    c         C   s#   d |  j  |  j t |   f } | S(   Ns   <%s to %s at %x>(   R   R   R*   (   R6   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   __repr__  s    N(   R9   R:   Rt   Rg   Rs   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s
   		t   Serverc           B   s>   e  Z d  Z d   Z d   Z d d  Z d   Z d   Z RS(   s   
    Serverside socket-stream connection class.

    This is a serverside network connection transport; a socket which came from
    an accept() on a server.
    c         C   s   t  j |  | | |  | |  _ | |  _ | |  _ | d |  _ d |  j j j | |  j f |  _	 d |  j j j |  j |  j j
 f |  _ |  j   d |  _ d S(   s  
        Server(sock, protocol, client, server, sessionno)

        Initialize it with a socket, a protocol, a descriptor for my peer (a
        tuple of host, port describing the other end of the connection), an
        instance of Port, and a session number.
        i    s   %s,%s,%ss   <%s #%s on %s>i   N(   RC   Rs   t   serverR   t	   sessionnot   hostnameR}   R   R9   R   t   _realPortNumbert   repstrRY   R   (   R6   t   sockR}   R   R   R   Rz   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRs     s    			
c         C   s   |  j  S(   s4   A string representation of this connection.
        (   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    i   c         C   s?   t  j |  | |  r; | r+ |  j j   q; |  j j   n  d  S(   N(   RC   R   R2   R   R   (   R6   R   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    c         C   s   t  j d |  j j    S(   sN   Returns an IPv4Address.

        This indicates the server's address.
        R   (   R$   R   R2   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   
  s    c         C   s   t  j d |  j  S(   sN   Returns an IPv4Address.

        This indicates the client's address.
        R   (   R$   R   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    (   R9   R:   Rt   Rs   R   R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s   			t   Portc           B   s   e  Z d  Z e e j  e j Z e j	 Z
 e Z d Z d Z d Z d Z d d d d  Z d   Z d   Z d   Z d   Z d	   Z e j e j  d
  Z e Z d   Z d   Z d   Z  d   Z! RS(   s  
    A TCP server port, listening for connections.

    When a connection is accepted, this will call a factory's buildProtocol
    with the incoming address as an argument, according to the specification
    described in L{twisted.internet.interfaces.IProtocolFactory}.

    If you wish to change the sort of transport that will be used, the
    C{transport} attribute will be called with the signature expected for
    C{Server.__init__}, so it can be replaced.

    @ivar deferred: a deferred created when L{stopListening} is called, and
        that will fire when connection is lost. This is not to be used it
        directly: prefer the deferred returned by L{stopListening} instead.
    @type deferred: L{defer.Deferred}

    @ivar disconnecting: flag indicating that the L{stopListening} method has
        been called and that no connections should be accepted anymore.
    @type disconnecting: C{bool}

    @ivar connected: flag set once the listen has successfully been called on
        the socket.
    @type connected: C{bool}
    i    RV   i2   c         C   s>   t  j j |  d | | |  _ | |  _ | |  _ | |  _ d S(   s5   Initialize with a numeric port to listen on.
        Rz   N(   R#   t   BasePortRs   R   t   factoryt   backlogt	   interface(   R6   R   R   R   R   Rz   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRs   B  s
    			c         C   sG   |  j  d  k	 r, d |  j |  j j |  j  f Sd |  j |  j j f Sd  S(   Ns   <%s of %s on %s>s   <%s of %s (not listening)>(   R   Rg   R   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   K  s    c         C   sM   t  j j |   } t d k rI t j d k rI | j t j t j	 d  n  | S(   Nt   posixt   cygwini   (
   R#   R   R   R   t   syst   platformR   R2   R   t   SO_REUSEADDR(   R6   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR   R  s    c         C   s   y) |  j    } | j |  j |  j f  Wn. t j k
 rY } t |  j |  j | f  n X| j   d |  _ t	 j
 d |  j j |  j f  |  j j   | j |  j  t |  _ | |  _ |  j j |  _ d |  _ |  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.
        i   s   %s starting on %sid   N(   R   R   R   R   R2   R/   R+   R   R   R'   t   msgR   R   t   doStartt   listenR   R\   R   Rb   t   numberAcceptsRY   (   R6   R7   t   le(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   startListeningY  s     			c         C   s   | \ } } t  j d | |  S(   NR   (   R$   t   _ServerFactoryIPv4Address(   R6   t   .1R   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt
   _buildAddrw  s    	c   	      C   s  yt  d k r |  j } n d } xxt |  D]Z} |  j rA d Sy |  j j   \ } } Wn t j k
 r } | j d t t	 f k r | |  _ Pn^ | j d t
 k r q. nE | j d t t t t t f k r t j d t | j d f  Pn    n Xt j | j    |  j j |  j |   } | d k rD| j   q. n  |  j } | d |  _ |  j | | | |  | |  j  } | j |  q. W|  j d |  _ Wn t j   n Xd S(   s   Called when my socket is ready for reading.

        This accepts a connection and calls self.protocol() to handle the
        wire-level protocol.
        R   i   Ni    s$   Could not accept new connection (%s)i   (    R   R   t   ranget   disconnectingR2   t   acceptR/   Rd   R   R   R   R   R   R   R   R    R'   R   R"   R%   R   Rb   R   R   R  Rg   R5   R   t	   transportRz   R   t   deferr(	   R6   t
   numAcceptst   iR7   R   RQ   R}   R   R  (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRD   {  s@    		"	
	!c         C   sE   t  |  _ |  j   |  j rA t |  j d |  j |  |  _ |  j Sd S(   s  
        Stop accepting connections on this port.

        This will shut down the socket and call self.connectionLost().  It
        returns a deferred which will fire successfully when the port is
        actually closed, or with a failure if an error occurs shutting down.
        i    N(   R\   R  RJ   R   R&   Rz   R   t   deferred(   R6   t   connDone(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   loseConnection  s    	
	c         C   s   t  j d |  j f  d S(   s.   
        Log message for closing port
        s   (TCP Port %s Closed)N(   R'   R   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   _logConnectionLostMsg  s    c         C   sg   |  j    d |  _ t j j |  |  t |  _ |  j   |  `	 |  `
 z |  j j   Wd t |  _ Xd S(   s'   
        Cleans up the socket.
        N(   R  Rg   R   R#   R   R   Rm   R   R8   R2   Rb   R   t   doStopR  (   R6   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    
		
c         C   s   t  j |  j j  S(   sB   Returns the name of my class, to prefix log entries with.
        (   R)   t   qualR   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    c         C   s   t  j d |  j j    S(   sN   Returns an IPv4Address.

        This indicates the server's address.
        R   (   R$   R   R2   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s    N("   R9   R:   Rt   R    R.   t   IListeningPortR2   R   R   R   R   R   R  R   R   R   Rg   R   Rs   R   R   R  R  RD   R(   R   R-   R@   R  t   stopListeningR  R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR     s*   								G			t	   Connectorc           B   s&   e  Z d d   Z d   Z d   Z RS(   c         C   s   | |  _  t | t j  ri y t j | d  } Wqi t j k
 re } t j d d | | f   qi Xn  | |  _ | |  _	 t
 j j |  | | |  d  S(   Nt   tcpR   s   %s (%r)(   R   t
   isinstancet   typest   StringTypesR2   t   getservbynameR/   t   ServiceNameUnknownErrorR   R   R#   t   BaseConnectorRs   (   R6   R   R   R   t   timeoutR   Rz   RQ   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyRs     s    	#		c         C   s"   t  |  j |  j |  j |  |  j  S(   N(   R   R   R   R   Rz   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   _makeTransport  s    c         C   s   t  j d |  j |  j  S(   NR   (   R$   R   R   R   (   R6   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   getDestination	  s    N(   R9   R:   Rg   Rs   R  R  (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyR    s   	(    (P   Rt   R`   R  R2   R   R   t   zope.interfaceR    R   t   OpenSSLR   t   ImportErrorRg   t   twisted.python.runtimeR   t   twisted.pythonR   R   t   objectR   t   errnoR   R   R   R   R	   R   R
   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R    t   twisted.python.win32R   R!   R"   t   twisted.internetR#   R$   R%   t   twisted.internet.taskR&   R'   R(   R)   t   twisted.python.utilR*   t   twisted.internet.errorR+   R,   R-   R.   R/   R0   R;   Ro   Ry   R{   RC   t   ITLSTransportR   R   R   R   R   R  R  (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/tcp.pyt   <module>   s   
			"	,;