MINI MINI MANI MO
3
  \@,                 @   sD   d Z ddlZddlmZ G dd dejZG dd dZdd	 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(ddZdd	 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_chatzThis 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 | _tjj| || d S )N    )ac_in_bufferincomingr   
producer_fifoasyncore
dispatcher__init__)selfZsockmap r
    /usr/lib64/python3.6/asynchat.pyr
   C   s    zasync_chat.__init__c             C   s   t dd S )Nzmust be implemented in subclass)NotImplementedError)r   datar
   r
   r   collect_incoming_dataQ   s    z async_chat.collect_incoming_datac             C   s   | j j| d S )N)r   append)r   r   r
   r
   r   _collect_incoming_dataT   s    z!async_chat._collect_incoming_datac             C   s   dj | j}| jd d = |S )Nr   )joinr   )r   dr
   r
   r   	_get_dataW   s    zasync_chat._get_datac             C   s   t dd S )Nzmust be implemented in subclass)r   )r   r
   r
   r   found_terminator\   s    zasync_chat.found_terminatorc             C   sB   t |tr| jrt|| j}nt |tr8|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)
isinstancestruse_encodingbytesencodingint
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 | j}W n: tk
r$   d S  tk
rJ } z| j  d S d }~X nX t|trh| jrhtt| j	}| j
| | _
xV| j
rt| j
}| j }|s| j
| j
 d| _
qxt|tr|}||k r| j
| j
 d| _
| j| | _n2| j
| j
d |  | j
|d  | _
d| _| j  qxt|}| j
j|}|dkrp|dkrR| j
| j
d |  | j
|| d  | _
| j  qxt| j
|}|r||kr| j
| j
d |   | j
| d  | _
P qx| j
| j
 d| _
qxW d S )Nr   r      )Zrecvac_in_buffer_sizeBlockingIOErrorOSErrorhandle_errorr   r   r   r   r   r   lenr!   r   r   r   r   findfind_prefix_at_end)r   r   ZwhyZlbr   nZterminator_lenindexr
   r
   r   handle_readr   sR    
	
zasync_chat.handle_readc             C   s   | j   d S )N)
initiate_send)r   r
   r
   r   handle_write   s    zasync_chat.handle_writec             C   s   | j   d S )N)close)r   r
   r
   r   handle_close   s    zasync_chat.handle_closec             C   s|   t |tttfstdt|| j}t||krdx>tdt||D ]}| j	j
||||   qBW n| j	j
| | j  d S )Nz#data argument must be byte-ish (%r)r   )r   r   	bytearray
memoryview	TypeErrortypeac_out_buffer_sizer(   ranger   r   r.   )r   r   Zsabsir
   r
   r   push   s    
zasync_chat.pushc             C   s   | j j| | j  d S )N)r   r   r.   )r   Zproducerr
   r
   r   push_with_producer   s    zasync_chat.push_with_producerc             C   s   dS )z4predicate for inclusion in the readable for select()r"