U
    Z¨+dÏ  ã                   @  s,  d Z ddlmZ ddlZddlmZmZ ddlmZ dgZ	dd	d
œd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 e
dƒZ!e
dƒZ"e
dƒZ#G d d„ dƒZ$dS )!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`.
é    )ÚannotationsN)ÚCallableÚ	Generatoré   )ÚloggerÚTelnetProtocolParserÚintÚbytes)ÚnumberÚreturnc                 C  s
   t | fƒS ©N)r	   )r
   © r   úJ/tmp/pip-unpacked-wheel-blk8czbf/prompt_toolkit/contrib/telnet/protocol.pyÚint2byte   s    r   é   éÿ   éý   éþ   é"   éú   éû   éü   éð   é   é   éò   éó   éô   éõ   éö   é÷   éø   éù   c                   @  sÔ   e Zd ZdZdddddœdd„Zd	dd
œdd„Zd	dd
œdd„Zd	dd
œdd„Zd	dd
œdd„Zd	dd
œdd„Z	d	d	ddœdd„Z
d	dd
œdd„Zd	dd
œdd„Zd	dd
œdd„Zddœd d!„Zd	dd
œd"d#„Zd$S )%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)
    zCallable[[bytes], None]zCallable[[int, int], None]zCallable[[str], None]ÚNone)Údata_received_callbackÚsize_received_callbackÚttype_received_callbackr   c                 C  s,   || _ || _|| _|  ¡ | _| j d ¡ d S r   )r$   r%   r&   Ú_parse_coroutineÚ_parserÚsend)Úselfr$   r%   r&   r   r   r   Ú__init__F   s
    
zTelnetProtocolParser.__init__r	   )Údatar   c                 C  s   |   |¡ d S r   )r$   ©r*   r,   r   r   r   Úreceived_dataS   s    z"TelnetProtocolParser.received_datac                 C  s   t  d|¡ dS )zReceived telnet DO command.zDO %rN©r   Úinfor-   r   r   r   Údo_receivedV   s    z TelnetProtocolParser.do_receivedc                 C  s   t  d|¡ dS )zReceived telnet DONT command.zDONT %rNr/   r-   r   r   r   Údont_receivedZ   s    z"TelnetProtocolParser.dont_receivedc                 C  s   t  d|¡ dS )zReceived telnet WILL command.zWILL %rNr/   r-   r   r   r   Úwill_received^   s    z"TelnetProtocolParser.will_receivedc                 C  s   t  d|¡ dS )zReceived telnet WONT command.zWONT %rNr/   r-   r   r   r   Úwont_receivedb   s    z"TelnetProtocolParser.wont_received)Úcommandr,   r   c                 C  sb   |t kr|  |¡ nJ|tkr(|  |¡ n6|tkr<|  |¡ n"|tkrP|  |¡ nt 	d||¡ d S )Nzcommand received %r %r)
ÚDOr1   ÚDONTr2   ÚWILLr3   ÚWONTr4   r   r0   )r*   r5   r,   r   r   r   Úcommand_receivedf   s    z%TelnetProtocolParser.command_receivedc                 C  s8   t |ƒdkr*t d|¡\}}|  ||¡ n
t d¡ dS )z5
        Received NAWS. (Window dimensions.)
        é   z!HHzWrong number of NAWS bytesN)ÚlenÚstructÚunpackr%   r   Úwarning)r*   r,   ÚcolumnsZrowsr   r   r   Únawsv   s    zTelnetProtocolParser.nawsc                 C  sF   |dd… |dd…  }}|t kr8| d¡}|  |¡ n
t d¡ dS )z)
        Received terminal type.
        r   r   NÚasciiz.Received a non-IS terminal type Subnegotiation)ÚISÚdecoder&   r   r?   )r*   r,   ZsubcmdÚttyper   r   r   rE   ƒ   s
    
zTelnetProtocolParser.ttypec                 C  sV   |dd… |dd…  }}|t kr.|  |¡ n$|tkrB|  |¡ nt dt|ƒ¡ dS )z%
        Got negotiate data.
        r   r   NzNegotiate (%r got bytes))ÚNAWSrA   ÚTTYPErE   r   r0   r<   )r*   r,   r5   Úpayloadr   r   r   Ú	negotiateŽ   s    zTelnetProtocolParser.negotiatezGenerator[None, bytes, None])r   c              
   c  sè   dV }|t dƒkrq |tkrØdV }|tkr6|  |¡ qâ|ttttttt	t
tf	kr^|  |d¡ qâ|ttttfkr‚dV }|  ||¡ qâ|tkrâg }dV }|tkrºdV }|tkr®qÆqÄ| |¡ qŽ| |¡ qŽ|  d |¡¡ q |  |¡ q dS )z_
        Parser state machine.
        Every 'yield' expression returns the next byte.
        Nr   ó    )r   ÚIACr.   ÚNOPÚDMÚBRKÚIPÚAOÚAYTÚECÚELÚGAr:   r6   r7   r8   r9   ÚSBÚSEÚappendrI   Újoin)r*   ÚdZd2Zd3r,   Zd4r   r   r   r'   ›   s.    z%TelnetProtocolParser._parse_coroutinec                 C  s   |D ]}| j  t|ƒ¡ qdS )z*
        Feed data to the parser.
        N)r(   r)   r   )r*   r,   Úbr   r   r   ÚfeedË   s    zTelnetProtocolParser.feedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   r.   r1   r2   r3   r4   r:   rA   rE   rI   r'   r[   r   r   r   r   r   7   s   0)%r_   Ú
__future__r   r=   Útypingr   r   Úlogr   Ú__all__r   rL   ZSGArK   r6   r7   ZLINEMODErU   r8   r9   ZMODErV   ÚECHOrF   ZSUPPRESS_GO_AHEADrG   ZSENDrC   rM   rN   rO   rP   rQ   rR   rS   rT   r   r   r   r   r   Ú<module>   sD   ÿ