
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    ¡ê,a@,  ã                   @   sD   d Z ddlZddlmZ G dd„ dejƒZG dd„ dƒZd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)Údequec                   @   sª   e Zd ZdZdZdZdZdZd(dd„Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ ZdS ))Ú
async_chatz‡This 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                 C   s(   d| _ g | _tƒ | _tj | ||¡ d S ©Nó    )Úac_in_bufferÚincomingr   Úproducer_fifoÚasyncoreÚ
dispatcherÚ__init__)ÚselfZsockÚmap© r   ú-/opt/alt/python38/lib64/python3.8/asynchat.pyr   C   s    zasync_chat.__init__c                 C   s   t dƒ‚d S ©Nzmust be implemented in subclass©ÚNotImplementedError©r   Údatar   r   r   Úcollect_incoming_dataQ   s    z async_chat.collect_incoming_datac                 C   s   | j  |¡ d S ©N)r   Úappendr   r   r   r   Ú_collect_incoming_dataT   s    z!async_chat._collect_incoming_datac                 C   s   d  | j¡}| jd d …= |S r   )Újoinr   )r   Údr   r   r   Ú	_get_dataW   s    zasync_chat._get_datac                 C   s   t dƒ‚d S r   r   ©r   r   r   r   Úfound_terminator\   s    zasync_chat.found_terminatorc                 C   sB   t |tƒr| jrt|| jƒ}nt |tƒr8|dk r8t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   Ztermr   r   r   Úset_terminator_   s
    zasync_chat.set_terminatorc                 C   s   | j S r   )r%   r   r   r   r   Úget_terminatorj   s    zasync_chat.get_terminatorc              
   C   sØ  z|   | j¡}W nD tk
r&   Y d S  tk
rT } z|  ¡  W Y ¢d S d }~X Y nX t|tƒrr| jrrtt| j	ƒ}| j
| | _
| j
�rÔt| j
ƒ}|  ¡ }|s°|  | j
¡ d| _
q~t|tƒ�r|}||k rè|  | j
¡ d| _
| j| | _n2|  | j
d |… ¡ | j
|d … | _
d| _|  ¡  q~t|ƒ}| j
 |¡}|dk�rv|dk�rX|  | j
d |… ¡ | j
|| d … | _
|  ¡  q~t| j
|ƒ}|�rÀ||k�rÔ|  | j
d | … ¡ | j
| d … | _
�qÔq~|  | j
¡ d| _
q~d S )Nr   r   éÿÿÿÿ)ZrecvÚac_in_buffer_sizeÚBlockingIOErrorÚOSErrorÚhandle_errorr   r   r    r!   r"   r   Úlenr'   r   r#   r%   r   ÚfindÚfind_prefix_at_end)r   r   ZwhyZlbr%   ÚnZterminator_lenÚindexr   r   r   Úhandle_readr   sR    

	



zasync_chat.handle_readc                 C   s   |   ¡  d S r   )Úinitiate_sendr   r   r   r   Úhandle_writeº   s    zasync_chat.handle_writec                 C   s   |   ¡  d S r   )Úcloser   r   r   r   Úhandle_close½   s    zasync_chat.handle_closec                 C   sx   t |tttfƒstdt|ƒƒ‚| j}t|ƒ|kr`tdt|ƒ|ƒD ]}| j	 
|||| … ¡ q@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   r3   )r   r   ZsabsÚir   r   r   ÚpushÀ   s    ÿzasync_chat.pushc                 C   s   | j  |¡ |  ¡  d S r   )r   r   r3   )r   Zproducerr   r   r   Úpush_with_producerÌ   s    zasync_chat.push_with_producerc                 C   s   dS )z4predicate for inclusion in the readable for select()é   r   r   r   r   r   ÚreadableÐ   s    zasync_chat.readablec                 C   s   | j p| j S )z4predicate for inclusion in the writable for select())r   Ú	connectedr   r   r   r   ÚwritableØ   s    zasync_chat.writablec                 C   s   | j  d¡ dS )zAautomatically close this channel once the outgoing queue is emptyN)r   r   r   r   r   r   Úclose_when_doneÜ   s    zasync_chat.close_when_donec                 C   s  | j �r| j�r| j d }|s:| j d= |d kr:|  ¡  d S | j}z|d |… }W n: tk
rŠ   | ¡ }|rz| j  |¡ n| j d= Y q Y nX t|tƒr¨| j	r¨t
|| jƒ}z|  |¡}W n tk
rÔ   |  ¡  Y d S X |�r|t|ƒk sö|t|ƒk �r
||d … | j d< n| j d= d S d S )Nr   )r   rB   r6   r;   r9   ÚmoreÚ
appendleftr   r   r    r!   r"   Úsendr+   r,   r-   )r   ÚfirstZobsr   Znum_sentr   r   r   r3   à   s8    

zasync_chat.initiate_sendc                 C   s    d| _ | jd d …= | j ¡  d S r   )r   r   r   Úclearr   r   r   r   Údiscard_buffers  s    zasync_chat.discard_buffers)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r;   r    r"   r   r   r   r   r   r&   r'   r2   r4   r6   r>   r?   rA   rC   rD   r3   rJ   r   r   r   r   r   4   s,   
H(r   c                   @   s   e Zd Zddd„Zdd„ ZdS )Úsimple_produceré   c                 C   s   || _ || _d S r   )r   Úbuffer_size)r   r   rQ   r   r   r   r     s    zsimple_producer.__init__c                 C   sJ   t | jƒ| jkr6| jd | j… }| j| jd … | _|S | j}d| _|S d S r   )r-   r   rQ   )r   Úresultr   r   r   rE     s    zsimple_producer.moreN)rP   )rK   rL   rM   r   rE   r   r   r   r   rO     s   
rO   c                 C   s0   t |ƒd }|r,|  |d |… ¡s,|d8 }q|S )Nr@   )r-   Úendswith)ZhaystackZneedleÚlr   r   r   r/   /  s    
r/   )rN   r	   Úcollectionsr   r
   r   rO   r/   r   r   r   r   Ú<module>   s    \ 