a
    ‰©lc¬  ã                   @   s   d Z ddlZddlmZmZ ddlmZ dgZee	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`.
é    N)ÚCallableÚ	Generatoré   )ÚloggerÚTelnetProtocolParser)ÚnumberÚreturnc                 C   s
   t | fƒS ©N)Úbytes)r   © r   úb/var/www/html/django/DPS/env/lib/python3.9/site-packages/prompt_toolkit/contrib/telnet/protocol.pyÚint2byte   s    r   é   éÿ   éý   éþ   é"   éú   éû   éü   éð   é   é   éò   éó   éô   éõ   éö   é÷   éø   éù   c                   @   sþ   e Zd ZdZeegdf eeegdf eegdf ddœdd„Zeddœdd„Z	eddœd	d
„Z
eddœdd„Zeddœdd„Zeddœdd„Zeeddœdd„Zeddœdd„Zeddœdd„Zeddœdd„Zededf dœdd„Ze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)
    N)Ú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__D   s
    
zTelnetProtocolParser.__init__)Údatar   c                 C   s   |   |¡ d S r	   )r!   ©r'   r)   r   r   r   Úreceived_dataR   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_receivedU   s    z TelnetProtocolParser.do_receivedc                 C   s   t  d|¡ dS )zReceived telnet DONT command.zDONT %rNr,   r*   r   r   r   Údont_receivedY   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_receiveda   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)
ÚDOr.   ÚDONTr/   ÚWILLr0   ÚWONTr1   r   r-   )r'   r2   r)   r   r   r   Úcommand_receivede   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)   ÚcolumnsÚrowsr   r   r   Únawsu   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   rC   ‚   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))ÚNAWSr?   ÚTTYPErC   r   r-   r9   )r'   r)   r2   Úpayloadr   r   r   Ú	negotiate   s    zTelnetProtocolParser.negotiate)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	v r^|  |d¡ qâ|ttttfv 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ÚGAr7   r3   r4   r5   r6   ÚSBÚSEÚappendrG   Ú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.feed)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r
   ÚintÚstrr(   r+   r.   r/   r0   r1   r7   r?   rC   rG   r   r$   rY   r   r   r   r   r   5   s"   û0)%r]   r:   Útypingr   r   Úlogr   Ú__all__r^   r
   r   rJ   ZSGArI   r3   r4   ZLINEMODErS   r5   r6   ZMODErT   ÚECHOrD   ZSUPPRESS_GO_AHEADrE   ZSENDrA   rK   rL   rM   rN   rO   rP   rQ   rR   r   r   r   r   r   Ú<module>   sB   ÿ