ó
±xYc           @  s‚  d  Z  d d l m Z d d l Z d d l m Z m Z m Z d d l m	 Z	 d Z
 e d ƒ Z e d	 ƒ Z e d
 ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d	 ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z e d ƒ Z  d e! f d „  ƒ  YZ" d S(   u°   
Parser for the Telnet protocol. (Not a complete implementation of the telnet
specification, but sufficient for a command line interface.)

Inspired by `Twisted.conch.telnet`.
iÿÿÿÿ(   t   unicode_literalsN(   t   int2bytet   binary_typet	   iterbytesi   (   t   loggeru   TelnetProtocolParseri    i   iÿ   iý   iþ   i"   iú   iû   iü   ið   i   iò   ió   iô   iõ   iö   i÷   iø   iù   t   TelnetProtocolParserc           B  sq   e  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(   u  
    Parser for the Telnet protocol.
    Usage::

        def data_received(data):
            print(data)

        def size_received(rows, columns):
            print(rows, columns)

        p = TelnetProtocolParser(data_received, size_received)
        p.feed(binary_data)
    c         C  s5   | |  _  | |  _ |  j ƒ  |  _ |  j j d  ƒ d  S(   N(   t   data_received_callbackt   size_received_callbackt   _parse_coroutinet   _parsert   sendt   None(   t   selfR   R   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   __init__<   s    		c         C  s   |  j  | ƒ d  S(   N(   R   (   R   t   data(    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   received_dataC   s    c         C  s   t  j d | ƒ d S(   u    Received telnet DO command. u   DO %rN(   R   t   info(   R   R   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   do_receivedF   s    c         C  s   t  j d | ƒ d S(   u    Received telnet DONT command. u   DONT %rN(   R   R   (   R   R   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   dont_receivedJ   s    c         C  s   t  j d | ƒ d S(   u    Received telnet WILL command. u   WILL %rN(   R   R   (   R   R   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   will_receivedN   s    c         C  s   t  j d | ƒ d S(   u    Received telnet WONT command. u   WONT %rN(   R   R   (   R   R   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   wont_receivedR   s    c         C  s‡   | t  k r |  j | ƒ ng | t k r8 |  j | ƒ nK | t k rT |  j | ƒ n/ | t k rp |  j | ƒ n t j	 d | | ƒ d  S(   Nu   command received %r %r(
   t   DOR   t   DONTR   t   WILLR   t   WONTR   R   R   (   R   t   commandR   (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   command_receivedV   s    c         C  sT   t  | ƒ d k rC t j t d ƒ | ƒ \ } } |  j | | ƒ n t j d ƒ d S(   u5   
        Received NAWS. (Window dimensions.)
        i   u   !HHu   Wrong number of NAWS bytesN(   t   lent   structt   unpackt   strR   R   t   warning(   R   R   t   columnst   rows(    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   nawsf   s    c         C  sc   | d d !| d } } t  | t ƒ s- t ‚ | t k rI |  j | ƒ n t j d t | ƒ ƒ d S(   u%   
        Got negotiate data.
        i    i   u   Negotiate (%r got bytes)N(   t
   isinstancet   bytest   AssertionErrort   NAWSR"   R   R   R   (   R   R   R   t   payload(    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt	   negotiates   s
    c      
   c  sW  xPt  rRd V} | t d ƒ k r% q | t k rBd V} | t k rT |  j | ƒ qO| t t t t t t	 t
 t t f	 k rŽ |  j | d ƒ qO| t t t t f k rÀ d V} |  j | | ƒ qO| t k rOg  } xQ t  r%d V} | t k rd V} | t k rPq"| j | ƒ qÕ | j | ƒ qÕ W|  j d j | ƒ ƒ qOq |  j | ƒ q Wd S(   u_   
        Parser state machine.
        Every 'yield' expression returns the next byte.
        Ni    t    (   t   TrueR   t   IACR   t   NOPt   DMt   BRKt   IPt   AOt   AYTt   ECt   ELt   GAR   R   R   R   R   R   t   SBt   SEt   appendR(   t   join(   R   t   dt   d2t   d3R   t   d4(    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyR      s2    	'	c         C  sF   t  | t ƒ s t ‚ x* t | ƒ D] } |  j j t | ƒ ƒ q" Wd S(   u*   
        Feed data to the parser.
        N(   R#   R   R%   R   R	   R
   R   (   R   R   t   b(    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   feed¯   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   R   R   R   R"   R(   R   R>   (    (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyR   .   s   										0(   u   TelnetProtocolParser(#   RA   t
   __future__R    R   t   sixR   R   R   t   logR   t   __all__R,   t   SGAR+   R   R   t   LINEMODER5   R   R   t   MODER6   t   ECHOR&   t   SUPPRESS_GO_AHEADR-   R.   R/   R0   R1   R2   R3   R4   t   objectR   (    (    (    sE   lib/python2.7/site-packages/prompt_toolkit/contrib/telnet/protocol.pyt   <module>   s:   