ó
±xYc           @  sÕ  d  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	 m
 Z
 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 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  m! Z! m" Z" m# Z# m$ Z$ m% Z% m& Z& m' Z' m( Z( m) Z) d d l m* Z* d d l+ m, Z, d Z- d „  Z. d e/ f d „  ƒ  YZ0 d e/ f d „  ƒ  YZ1 d e f d „  ƒ  YZ2 d e/ f d „  ƒ  YZ3 d S(   uT  
Telnet server.

Example usage::

    class MyTelnetApplication(TelnetApplication):
        def client_connected(self, telnet_connection):
            # Set CLI with simple prompt.
            telnet_connection.set_application(
                telnet_connection.create_prompt_application(...))

        def handle_command(self, telnet_connection, document):
            # When the client enters a command, just reply.
            telnet_connection.send('You said: %r

' % document.text)

        ...

    a = MyTelnetApplication()
    TelnetServer(application=a, host='127.0.0.1', port=23).run()
iÿÿÿÿ(   t   unicode_literalsN(   t   int2bytet	   text_typet   binary_type(   t   getincrementaldecoder(   t   DEFAULT_BUFFER(   t	   EventLoop(   t   CommandLineInterfacet   Application(   t   Size(   t   create_prompt_application(   t   InputStream(   t   Vt100_Outputi   (   t   logger(
   t   IACt   DOt   LINEMODEt   SBt   MODEt   SEt   WILLt   ECHOt   NAWSt   SUPPRESS_GO_AHEAD(   t   TelnetProtocolParser(   t   TelnetApplicationu   TelnetServerc         C  s   t  j d ƒ |  j t t t ƒ |  j t t t ƒ |  j t t t t	 t
 d ƒ t t ƒ |  j t t t ƒ |  j t t t ƒ d  S(   Nu   Initializing telnet connectioni    (   R   t   infot   sendR   R   R   R   R   R   R   R   R   R   R   (   t
   connection(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   _initialize_telnet3   s    +t   _ConnectionStdoutc           B  s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   uk   
    Wrapper around socket which provides `write` and `flush` methods for the
    Vt100_Output output.
    c         C  s   | |  _  | |  _ g  |  _ d  S(   N(   t	   _encodingt   _connectiont   _buffer(   t   selfR   t   encoding(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   __init__L   s    		c         C  s?   t  | t ƒ s t ‚ |  j j | j |  j ƒ ƒ |  j ƒ  d  S(   N(   t
   isinstanceR   t   AssertionErrorR!   t   appendt   encodeR   t   flush(   R"   t   data(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   writeQ   s    c         C  sW   y  |  j  j d j |  j ƒ ƒ Wn' t j k
 rI } t j d | ƒ n Xg  |  _ d  S(   Nt    u"   Couldn't send data over socket: %s(   R    R   t   joinR!   t   sockett   errorR   (   R"   t   e(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR)   V   s
     (   t   __name__t
   __module__t   __doc__R$   R+   R)   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR   G   s   		t   TelnetConnectionc           B  sP   e  Z d  Z d „  Z d d „ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   u6   
    Class that represents one Telnet connection.
    c           sC  t  | t ƒ s t ‚ t  | t ƒ s* t ‚ t  | t ƒ s? t ‚ t  | t ƒ sT t ‚ | ˆ  _ | ˆ  _ | ˆ  _ t	 ˆ  _
 t ˆ  _ | ˆ  _ | ˆ  _ d  ˆ  _ t d d d d ƒ ˆ  _ t | ƒ ‡  f d †  } t | d | ƒˆ  _ t ˆ  j | d t	 ƒˆ  _ t | ƒ ˆ  _ ˆ  j t ƒ  ƒ | j ˆ  ƒ t	 ˆ  _ ˆ  j j ƒ  d  S(   Nt   rowsi(   t   columnsiO   c             s   ˆ  j  S(   N(   t   size(    (   R"   (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   get_sizey   s    R#   t   write_binary(   R%   t   tupleR&   R   t   TelnetServerR   t   connt   addrt   applicationt   Falset   closedt   Truet   handling_commandt   serverR#   t   Nonet   callbackR	   R7   R   R   t   stdoutR   t   vt100_outputt   _TelnetEventLoopInterfacet	   eventloopt   set_applicationR
   t   client_connectedt   clit   _redraw(   R"   R<   R=   R>   RC   R#   R8   (    (   R"   sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR$   c   s,    								
	c           sâ   t  | t ƒ s t ‚ | d k s3 t | ƒ s3 t ‚ t d | d ˆ j d ˆ j ƒ ˆ _ | ˆ _	 ˆ j j
 ƒ  ‰  t ˆ  j ƒ ‰ t ˆ j ƒ ‰ ˆ ƒ  g ‰ t ˆ j _ ‡ ‡ ‡ f d †  } ‡  ‡ f d †  } t | | ƒ ˆ _ d S(   uí   
        Set ``CommandLineInterface`` instance for this connection.
        (This can be replaced any time.)

        :param cli: CommandLineInterface instance.
        :param callback: Callable that takes the result of the CLI.
        R>   RI   t   outputc           s_   t  |  t ƒ s t ‚ y$ ˆ d j |  ƒ } ˆ  j | ƒ Wn t k
 rZ ˆ ƒ  ˆ d <d SXd S(   u/    TelnetProtocolParser 'data_received' callback i    u    N(   R%   R   R&   t   decodet   feedt   UnicodeDecodeError(   R*   t   result(   t   inputstreamt   stdin_decodert   stdin_decoder_cls(    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   data_received©   s    c           s&   t  d |  d | ƒ ˆ _ ˆ  j ƒ  d S(   u/    TelnetProtocolParser 'size_received' callback R5   R6   N(   R	   R7   t   terminal_size_changed(   R5   R6   (   t   cbR"   (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   size_received´   s    N(   R%   R   R&   RD   t   callableR   RI   RG   RL   RE   t   create_eventloop_callbacksR   t   feed_keyR   R#   RA   t   _is_runningR   t   parser(   R"   t   appRE   RV   RY   (    (   RX   RS   R"   RT   RU   sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRJ   ‹   s    		c         C  s¥   t  | t ƒ s t ‚ |  j j | ƒ |  j j ƒ  |  j j r¡ y |  j j ƒ  } Wn= t	 t
 f k
 r } t j d t | ƒ j ƒ |  j ƒ  d SX|  j | ƒ n  d S(   uF   
        Handler for incoming data. (Called by TelnetServer.)
        u   %s, closing connection.N(   R%   R   R&   R^   RP   RL   RM   t   is_returningt   return_valuet   EOFErrort   KeyboardInterruptR   R   t   typeR1   t   closet   _handle_command(   R"   R*   Ra   R0   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRP   »   s    
c           sH   t  j d ˆ  ƒ ‡  ‡ ‡ f d †  } ‡ f d †  ‰ ˆ j j | ƒ d S(   us   
        Handle command. This will run in a separate thread, in order not
        to block the event loop.
        u   Handle command %rc             sG   t  ˆ _ z& ˆ j d  k	 r. ˆ j ˆ ˆ  ƒ n  Wd  ˆ j j ˆ ƒ Xd  S(   N(   RA   RB   RE   RD   RC   t   call_from_executor(    (   t   commandt   doneR"   (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   in_executorÚ   s
    	c             sd   t  ˆ  _ ˆ  j s` ˆ  j j ƒ  ˆ  j j t j ƒ  ˆ  j j j ƒ  ˆ  j	 j
 ƒ  ˆ  j j ƒ  n  d  S(   N(   R?   RB   R@   RL   t   resett   buffersR   t   renderert    request_absolute_cursor_positionRG   R)   RM   (    (   R"   (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRi   â   s    		N(   R   R   RC   t   run_in_executor(   R"   Rh   Rj   (    (   Rh   Ri   R"   sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRf   Ó   s    c         C  s1   |  j  j ƒ  |  j  j d d ƒ |  j  j ƒ  d S(   u&   
        Erase output screen.
        i    N(   RG   t   erase_screent   cursor_gotoR)   (   R"   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRp   ð   s    c         C  sB   t  | t ƒ s t ‚ |  j j | j d d ƒ ƒ |  j j ƒ  d S(   u*   
        Send text to the client.
        u   
u   
N(   R%   R   R&   RF   R+   t   replaceR)   (   R"   R*   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR   ø   s    c         C  s*   |  j  j |  ƒ |  j j ƒ  t |  _ d S(   u'   
        Close the connection.
        N(   R>   t   client_leavingR<   Re   RA   R@   (   R"   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRe     s    N(   R1   R2   R3   R$   RD   RJ   RP   Rf   Rp   R   Re   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR4   _   s   	(0				RH   c           B  sP   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z	 d „  Z
 RS(	   uD   
    Eventloop object to be assigned to `CommandLineInterface`.
    c         C  s   | |  _  d  S(   N(   t   _server(   R"   RC   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR$     s    c         C  s   d S(   u	    Ignore. N(    (   R"   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRe     s    c         C  s   d S(   u	    Ignore. N(    (   R"   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   stop  s    c         C  s   |  j  j | ƒ d  S(   N(   Rt   Ro   (   R"   RE   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRo     s    c         C  s   |  j  j | ƒ d  S(   N(   Rt   Rg   (   R"   RE   t   _max_postpone_until(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRg     s    c         C  s
   t  ‚ d  S(   N(   t   NotImplementedError(   R"   t   fdRE   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt
   add_reader!  s    c         C  s
   t  ‚ d  S(   N(   Rw   (   R"   Rx   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   remove_reader$  s    N(   R1   R2   R3   R$   Re   Ru   Ro   RD   Rg   Ry   Rz   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRH     s   					R;   c           B  sh   e  Z d  Z d d d d d „ Z e d „  ƒ Z d „  Z d „  Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z RS(   u'   
    Telnet server implementation.
    u	   127.0.0.1i   u   utf-8c         C  sÀ   t  | t ƒ s t ‚ t  | t ƒ s* t ‚ t  | t ƒ s? t ‚ t  | t ƒ sT t ‚ | |  _ | |  _ | |  _ | |  _ t	 ƒ  |  _
 g  |  _ t j ƒ  |  _ t j |  j d t j t j ƒ d  S(   Ni    (   R%   R   R&   t   intR   t   hostt   portR>   R#   t   sett   connectionst   _calls_from_executort   ost   pipet   _schedule_pipet   fcntlt   F_SETFLt
   O_NONBLOCK(   R"   R|   R}   R>   R#   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR$   ,  s    					c         C  sU   t  j  t  j t  j ƒ } | j t  j t  j d ƒ | j | | f ƒ | j d ƒ | S(   Ni   i   (   R.   t   AF_INETt   SOCK_STREAMt
   setsockoptt
   SOL_SOCKETt   SO_REUSEADDRt   bindt   listen(   t   clsR|   R}   t   s(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   create_socket?  s
    c         C  s   t  j d | ƒ j ƒ  d  S(   Nt   target(   t	   threadingt   Threadt   start(   R"   RE   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRo   I  s    c         C  s7   |  j  j | ƒ |  j r3 t j |  j d d ƒ n  d  S(   Ni   t   x(   R€   R'   Rƒ   R   R+   (   R"   RE   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRg   L  s    	c         C  sF   t  j |  j d d ƒ |  j g  } |  _ x | D] } | ƒ  q1 Wd S(   uK   
        Process callbacks from `call_from_executor` in eventloop.
        i    i   N(   R   t   readRƒ   R€   (   R"   t   calls_from_executort   c(    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   _process_callbacksR  s    c         C  sR  |  j  |  j |  j ƒ } t j d |  j |  j ƒ zxt r>t g  |  j D] } | j sJ | ^ qJ ƒ |  _ t g  |  j D] } | j	 sx | ^ qx ƒ } | |  j
 d g g  | D] } | j ^ q­ } t j | g  g  ƒ \ } } } xW | D]O } | | k r
|  j | ƒ qè | |  j
 d k r*|  j ƒ  qè |  j | ƒ qè Wq7 WWd | j ƒ  Xd S(   u:   
        Run the eventloop for the telnet server.
        u.   Listening for telnet connections on %s port %ri    N(   R   R|   R}   R   R   RA   R~   R   R@   RB   Rƒ   R<   t   selectt   _acceptR™   t   _handle_incoming_dataRe   (   R"   t   listen_socketR˜   R   t	   read_listR–   t   _R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   run^  s     	.+c         C  sW   | j  ƒ  \ } } t | | |  j |  d |  j ƒ} |  j j | ƒ t j d | Œ d S(   u1   
        Accept new incoming connection.
        R#   u   New connection %r %rN(   t   acceptR4   R>   R#   R   t   addR   R   (   R"   R   R<   R=   R   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR›   „  s    !c         C  sh   g  |  j  D] } | j | k r
 | ^ q
 d } | j d ƒ } | rT | j | ƒ n |  j  j | ƒ d S(   u1   
        Handle incoming data on socket.
        i    i   N(   R   R<   t   recvRP   t   remove(   R"   R<   R˜   R   R*   (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyRœ   Ž  s
    /N(   R1   R2   R3   RD   R$   t   classmethodR   Ro   Rg   R™   R    R›   Rœ   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyR;   (  s   
				&	
(   u   TelnetServer(4   R3   t
   __future__R    R.   Rš   R’   R   R„   t   sixR   R   R   t   codecsR   t   prompt_toolkit.enumsR   t   prompt_toolkit.eventloop.baseR   t   prompt_toolkit.interfaceR   R   t   prompt_toolkit.layout.screenR	   t   prompt_toolkit.shortcutsR
   t#   prompt_toolkit.terminal.vt100_inputR   t$   prompt_toolkit.terminal.vt100_outputR   t   logR   t   protocolR   R   R   R   R   R   R   R   R   R   R   R>   R   t   __all__R   t   objectR   R4   RH   R;   (    (    (    sC   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/server.pyt   <module>   s2   F	¯