
    d2-                         d Z ddlZddlmZ ddlmZ dZ eeed            G d d	ej                  Z	 G d
 d          Z
d ZdS )a  A class supporting chat-style (command/response) protocols.

This class adds support for 'chat' style protocols - where one side
sends a 'command', and the other sends a response (examples would be
the common internet protocols - smtp, nntp, ftp, etc..).

The handle_read() method looks at the input stream for the current
'terminator' (usually '\r\n' for single-line responses, '\r\n.\r\n'
for multi-line output), calling self.found_terminator() on its
receipt.

for example:
Say you build an async nntp client using this class.  At the start
of the connection, you'll have self.terminator set to '\r\n', in
order to process the single-line greeting.  Just before issuing a
'LIST' command you'll set it to '\r\n.\r\n'.  The output of the LIST
command will be accumulated (using your own 'collect_incoming_data'
method) up to the terminator, and then control will be returned to
you - by calling your self.found_terminator() method.
    N)deque)_deprecatedznThe {name} module is deprecated and will be removed in Python {remove}. The recommended replacement is asyncio)      )removec                       e Zd ZdZdZdZdZdZd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d Zd Zd Zd ZdS )
async_chatzThis is an abstract class.  You must derive from this class, and add
    the two methods collect_incoming_data() and found_terminator()i   r   zlatin-1Nc                     d| _         g | _        t                      | _        t          j                            | ||           d S N    )ac_in_bufferincomingr   producer_fifoasyncore
dispatcher__init__)selfsockmaps        /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/asynchat.pyr   zasync_chat.__init__J   sB    
  #WW$$T455555r   c                      t          d          Nzmust be implemented in subclassNotImplementedErrorr   datas     r   collect_incoming_dataz async_chat.collect_incoming_dataX       !"CDDDr   c                 :    | j                             |           d S N)r   appendr   s     r   _collect_incoming_dataz!async_chat._collect_incoming_data[   s    T"""""r   c                 N    d                     | j                  }| j        d d = |S r   )joinr   )r   ds     r   	_get_datazasync_chat._get_data^   s(    HHT]##M!!!r   c                      t          d          r   r   r   s    r   found_terminatorzasync_chat.found_terminatorc   r   r   c                     t          |t                    r| j        rt          || j                  }n*t          |t
                    r|dk     rt          d          || _        dS )zdSet the input delimiter.

        Can be a fixed string of any length, an integer, or None.
        r   z-the number of received bytes must be positiveN)
isinstancestruse_encodingbytesencodingint
ValueError
terminator)r   terms     r   set_terminatorzasync_chat.set_terminatorf   sj    
 dC   	NT%6 	Nt}--DDc"" 	NtaxxLMMMr   c                     | j         S r    )r2   r(   s    r   get_terminatorzasync_chat.get_terminatorq   s
    r   c                     	 |                      | j                  }n1# t          $ r Y d S t          $ r |                                  Y d S w xY wt          |t                    r!| j        rt          t          | j	                  }| j
        |z   | _
        | j
        rt          | j
                  }|                                 }|s#|                     | j
                   d| _
        nt          |t                    r|}||k     r2|                     | j
                   d| _
        | j        |z
  | _        nM|                     | j
        d |                    | j
        |d          | _
        d| _        |                                  nt          |          }| j
                            |          }|dk    rT|dk    r"|                     | j
        d |                    | j
        ||z   d          | _
        |                                  nxt%          | j
        |          }|r@||k    r8|                     | j
        d |                     | j
        | d          | _
        d S |                     | j
                   d| _
        | j
        d S d S )Nr   r   )recvac_in_buffer_sizeBlockingIOErrorOSErrorhandle_errorr+   r,   r-   r.   r/   r   lenr6   r   r0   r2   r)   findfind_prefix_at_end)r   r   lbr2   nterminator_lenindexs          r   handle_readzasync_chat.handle_ready   s   	99T344DD 	 	 	FF 	 	 	FF	 dC   	-T%6 	-dm,,D -4  3	0T&''B,,..J 00**4+<===$'!!J,, ,066..t/@AAA(+D%&*o&:DOO..t/@!/DEEE(,(9!""(=D%&'DO))++++ "%Z)..z::B;;qyy 2243DVeV3LMMM(,(9%:N:O:O(PD% ))++++ /t/@*MME 	0 B;; 66t7H5&7QRRR040A5&''0JD- 2243DEEE,/)g  3	0 3	0 3	0 3	0 3	0s    
AA
Ac                 .    |                                   d S r    )initiate_sendr(   s    r   handle_writezasync_chat.handle_write   s    r   c                 .    |                                   d S r    )closer(   s    r   handle_closezasync_chat.handle_close   s    

r   c                    t          |t          t          t          f          st	          dt          |                    | j        }t          |          |k    rGt          dt          |          |          D ]'}| j	        
                    ||||z                       (n| j	        
                    |           |                                  d S )Nz#data argument must be byte-ish (%r)r   )r+   r.   	bytearray
memoryview	TypeErrortypeac_out_buffer_sizer>   ranger   r!   rG   )r   r   sabsis       r   pushzasync_chat.push   s    $	: >?? 	(A JJ( ( (&t99t1c$ii.. : :"))$q4x.9999: %%d+++r   c                 b    | j                             |           |                                  d S r    )r   r!   rG   )r   producers     r   push_with_producerzasync_chat.push_with_producer   s1    !!(+++r   c                     dS )z4predicate for inclusion in the readable for select()    r(   s    r   readablezasync_chat.readable   s	     qr   c                      | j         p| j         S )z4predicate for inclusion in the writable for select())r   	connectedr(   s    r   writablezasync_chat.writable   s    !9$.&89r   c                 :    | j                             d           dS )zAautomatically close this channel once the outgoing queue is emptyN)r   r!   r(   s    r   close_when_donezasync_chat.close_when_done   s    !!$'''''r   c                    | j         rE| j        r?| j         d         }|s | j         d= ||                                  d S | j        }	 |d |         }nI# t          $ r< |                                }|r| j                             |           n| j         d= Y w xY wt          |t                    r| j	        rt          || j                  }	 |                     |          }n%# t          $ r |                                  Y d S w xY w|rA|t          |          k     s|t          |          k     r||d          | j         d<   n| j         d= d S d S d S )Nr   )r   r^   rK   rQ   rO   more
appendleftr+   r,   r-   r.   r/   sendr<   r=   r>   )r   firstobsr   num_sents        r   rG   zasync_chat.initiate_send   s     %	T^ %	&q)E &q)=%%'''F )CTcT{   zz|| .&11$7777*1- $$$ 2): 2T4=1199T??   !!###  .c$ii''3U+;+;,1()),<D&q))*1-FK%	 %	 %	 %	s%   
A ABBC$ $DDc                 Z    d| _         | j        d d = | j                                         d S r   )r   r   r   clearr(   s    r   discard_bufferszasync_chat.discard_buffers  s3    M!!!  """""r   )NN)__name__
__module____qualname____doc__r:   rQ   r-   r/   r   r   r"   r&   r)   r4   r6   rE   rH   rK   rU   rX   r\   r_   ra   rG   rk   r[   r   r   r	   r	   ;   sI       F F
 
 LH6 6 6 6E E E# # #  
E E E	 	 	  F0 F0 F0P    
 
 
    : : :( ( (& & &P# # # # #r   r	   c                       e Zd ZddZd ZdS )simple_producer   c                 "    || _         || _        d S r    )r   buffer_size)r   r   rt   s      r   r   zsimple_producer.__init__  s    	&r   c                     t          | j                  | j        k    r/| j        d | j                 }| j        | j        d          | _        |S | j        }d| _        |S r   )r>   r   rt   )r   results     r   rc   zsimple_producer.more  s\    ty>>D,,,Y0 001F	$"2"3"34DIMYFDIMr   N)rr   )rl   rm   rn   r   rc   r[   r   r   rq   rq     s7        ' ' ' '    r   rq   c                     t          |          dz
  }|rA|                     |d |                   s$|dz  }|r|                     |d |                   $|S )NrZ   )r>   endswith)haystackneedlels      r   r@   r@   6  sk    FaA
 H%%fRaRj11 	Q  H%%fRaRj11 Hr   )ro   r   collectionsr   warningsr   _DEPRECATION_MSGrl   r   r	   rq   r@   r[   r   r   <module>r      s   8 (                   N  H&w 7 7 7 7X# X# X# X# X#$ X# X# X#v       @    r   