
                            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  G d de!      Z"y)z
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`.
    )unicode_literalsN)int2bytebinary_type	iterbytes   )logger)TelnetProtocolParser            "                                          c                   R    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d Zy)r	   a  
    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                     || _         || _        | j                         | _        | j                  j	                  d        y N)data_received_callbacksize_received_callback_parse_coroutine_parsersend)selfr   r    s      9lib/third_party/prompt_toolkit/contrib/telnet/protocol.py__init__zTelnetProtocolParser.__init__<   s4    &<#&<#,,.$    c                 &    | j                  |       y r   )r   r$   datas     r%   received_dataz"TelnetProtocolParser.received_dataC   s    ##D)r'   c                 0    t        j                  d|       y)z Received telnet DO command. zDO %rNr   infor)   s     r%   do_receivedz TelnetProtocolParser.do_receivedF   s    GT"r'   c                 0    t        j                  d|       y)z Received telnet DONT command. zDONT %rNr-   r)   s     r%   dont_receivedz"TelnetProtocolParser.dont_receivedJ       It$r'   c                 0    t        j                  d|       y)z Received telnet WILL command. zWILL %rNr-   r)   s     r%   will_receivedz"TelnetProtocolParser.will_receivedN   r2   r'   c                 0    t        j                  d|       y)z Received telnet WONT command. zWONT %rNr-   r)   s     r%   wont_receivedz"TelnetProtocolParser.wont_receivedR   r2   r'   c                 
   |t         k(  r| j                  |       y |t        k(  r| j                  |       y |t        k(  r| j                  |       y |t        k(  r| j                  |       y t        j                  d||       y )Nzcommand received %r %r)
DOr/   DONTr1   WILLr4   WONTr6   r   r.   )r$   commandr*   s      r%   command_receivedz%TelnetProtocolParser.command_receivedV   si    b=T"_t$_t$_t$ KK0'4@r'   c                     t        |      dk(  r5t        j                  t        d      |      \  }}| j	                  ||       yt        j                  d       y)z5
        Received NAWS. (Window dimensions.)
           z!HHzWrong number of NAWS bytesN)lenstructunpackstrr    r   warning)r$   r*   columnsrowss       r%   nawszTelnetProtocolParser.nawsf   sF     t9> #MM#e*d;MGT''g6NN78r'   c                     |dd |dd }}t        |t              sJ |t        k(  r| j                  |       yt	        j
                  dt        |             y)z%
        Got negotiate data.
        r   r   NzNegotiate (%r got bytes))
isinstancebytesNAWSrG   r   r.   r@   )r$   r*   r<   payloads       r%   	negotiatezTelnetProtocolParser.negotiates   sO      !9d12h'5)))d?IIgKK2CI>r'   c           
   #   h  K   	 d}|t        d      k(  rn|t        k(  rd}|t        k(  r| j                  |       n|t        t        t
        t        t        t        t        t        t        f	v r| j                  |d       n|t        t        t        t         fv rd}| j                  ||       n}|t"        k(  rtg }	 d}|t        k(  r d}|t$        k(  rn$|j'                  |       n|j'                  |       ?| j)                  dj+                  |             n| j                  |       .w)z_
        Parser state machine.
        Every 'yield' expression returns the next byte.
        Nr   r'   )r   IACr+   NOPDMBRKIPAOAYTECELGAr=   r8   r9   r:   r;   SBSEappendrM   join)r$   dd2d3r*   d4s         r%   r!   z%TelnetProtocolParser._parse_coroutine   s    
 AHQK c9&&r* CS"b#r2rBB))"d3 BdD11B))"b1 2XD"9!&B!Rx % $B KKO  NN388D>2""1%S s   D0D2c                     t        |t              sJ t        |      D ]&  }| j                  j	                  t        |             ( y)z*
        Feed data to the parser.
        N)rI   r   r   r"   r#   r   )r$   r*   bs      r%   feedzTelnetProtocolParser.feed   s8     $,,,4ALLhqk* !r'   N)__name__
__module____qualname____doc__r&   r+   r/   r1   r4   r6   r=   rG   rM   r!   rc    r'   r%   r	   r	   .   s@     *#%%%A 9
?.&`+r'   r	   )#rg   
__future__r   rA   sixr   r   r   logr   __all__rP   SGArO   r8   r9   LINEMODErY   r:   r;   MODErZ   ECHOrK   SUPPRESS_GO_AHEADrQ   rR   rS   rT   rU   rV   rW   rX   objectr	   rh   r'   r%   <module>rs      s   (  0 0 
 A;A;C=C=C=B<C=C=C=A;C=A;B<B<QK C=C=C=C=C=C=C=C=G+6 G+r'   