File: //proc/self/root/opt/alt/python37/lib64/python3.7/__pycache__/asynchat.cpython-37.opt-1.pyc
B
    � f@,  �               @   sD   d Z ddlZddlmZ G dd� dej�ZG dd� d�Zdd	� ZdS )
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 Zd ZdZdZdZdZdZd(dd�Zdd	� Z	d
d� Z
dd
� Zdd� Zdd� Z
dd� Zdd� Zdd� Zdd� Zdd� Zdd� Zdd� Zd d!� Zd"d#� Zd$d%� Zd&d'� ZdS ))�
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   zlatin-1Nc             C   s(   d| _ g | _t� | _tj�| ||� d S )N�    )�ac_in_buffer�incomingr   �
producer_fifo�asyncore�
dispatcher�__init__)�selfZsock�map� r
   �-/opt/alt/python37/lib64/python3.7/asynchat.pyr
   C   s    zasync_chat.__init__c             C   s   t d��d S )Nzmust 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   �append)r   r   r
   r
   r   �_collect_incoming_dataT   s    z!async_chat._collect_incoming_datac             C   s   d� | j�}| jd d �= |S )Nr   )�joinr   )r   �dr
   r
   r   �	_get_dataW   s    zasync_chat._get_datac             C   s   t d��d S )Nzmust be implemented in subclass)r   )r   r
   r
   r   �found_terminator\   s    zasync_chat.found_terminatorc             C   sB   t |t�r| jrt|| j�}nt |t�r8|dk r8td��|| _dS )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   Ztermr
   r
   r   �set_terminator_   s
    zasync_chat.set_terminatorc             C   s   | j S )N)r   )r   r
   r
   r   �get_terminatorj   s    zasync_chat.get_terminatorc          
   C   s�  y| � | j�}W n< tk
r$   d S  tk
rL } z| ��  d S d }~X Y nX t|t�rj| jrjtt| j	�}| j
| | _
�xV| j
�r�t| j
�}| �� }|s�| �
| j
� d| _
qzt|t��r|}||k r�| �
| j
� d| _
| j| | _n2| �
| j
d |� � | j
|d � | _
d| _| ��  qzt|�}| j
�|�}|dk�rr|dk�rT| �
| j
d |� � | j
|| d � | _
| ��  qzt| j
|�}|�r�||k�r�| �
| j
d | � � | j
| d � | _
P qz| �
| j
� d| _
qzW d S )Nr   r   ���)Zrecv�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   ZwhyZlbr   �nZterminator_len�indexr
   r
   r   �handle_readr   sR    
	
zasync_chat.handle_readc             C   s   | � �  d S )N)�
initiate_send)r   r
   r
   r   �handle_write�   s    zasync_chat.handle_writec             C   s   | � �  d S )N)�close)r   r
   r
   r   �handle_close�   s    zasync_chat.handle_closec             C   s|   t |tttf�stdt|���| j}t|�|krdx>tdt|�|�D ]}| j	�
|||| � � qBW n| j	�
|� | ��  d S )Nz#data argument must be byte-ish (%r)r   )r   r   �	bytearray�
memoryview�	TypeError�type�ac_out_buffer_sizer'