???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................
ðÕYfÃ.  ã               @   sq   d  Z  d d l Z d d l m Z Gd d „  d e j ƒ Z Gd d „  d ƒ Z Gd 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 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   s8   d |  _  g  |  _ t ƒ  |  _ t j j |  | | ƒ d  S)Nó    )Úac_in_bufferÚincomingr   Úproducer_fifoÚasyncoreÚ
dispatcherÚ__init__)ÚselfZsockÚmap© r   ú-/opt/alt/python35/lib64/python3.5/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  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  |  j ƒ } |  j d  d  … =| S)Nr   )Újoinr   )r   Údr   r   r   Ú	_get_dataW   s    zasync_chat._get_datac             C   s   t  d ƒ ‚ d  S)Nzmust be implemented in subclass)r   )r   r   r   r   Úfound_terminator\   s    zasync_chat.found_terminatorc             C   sa   t  | t ƒ r- |  j r- t | |  j ƒ } n' t  | t ƒ rT | d k  rT 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   Ztermr   r   r   Úset_terminator_   s
    zasync_chat.set_terminatorc             C   s   |  j  S)N)r   )r   r   r   r   Úget_terminatorj   s    zasync_chat.get_terminatorc             C   si  y |  j  |  j ƒ } WnH t k
 r. d  SYn3 t k
 r` } z |  j ƒ  d  SWYd  d  } ~ Xn Xt | t ƒ r‹ |  j r‹ t t |  j	 ƒ } |  j
 | |  _
 xÇ|  j
 rdt |  j
 ƒ } |  j ƒ  } | sä |  j |  j
 ƒ d |  _
 qž t | t ƒ rw| } | | k  r1|  j |  j
 ƒ d |  _
 |  j | |  _ qa|  j |  j
 d  | … ƒ |  j
 | d  … |  _
 d |  _ |  j ƒ  qž t | ƒ } |  j
 j | ƒ } | d k rî| d k rÇ|  j |  j
 d  | … ƒ |  j
 | | d  … |  _
 |  j ƒ  qž t |  j
 | ƒ } | rH| | k rD|  j |  j
 d  | … ƒ |  j
 | d  … |  _
 Pqž |  j |  j
 ƒ d |  _
 qž Wd  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   |  j  ƒ  d  S)N)Úinitiate_send)r   r   r   r   Úhandle_writeº   s    zasync_chat.handle_writec             C   s   |  j  ƒ  d  S)N)Úclose)r   r   r   r   Úhandle_close½   s    zasync_chat.handle_closec             C   sª   t  | t t t f ƒ s- t d t | ƒ ƒ ‚ |  j } t | ƒ | k rŒ xQ t d t | ƒ | ƒ D]$ } |  j	 j
 | | | | … ƒ qa Wn |  j	 j
 | ƒ |  j ƒ  d  S)Nz#data argument must be byte-ish (%r)r   )r   r   Ú	bytearrayÚ
memoryviewÚ	TypeErrorÚtypeÚac_out_buffer_sizer(   Úranger   r   r.   )r   r   ZsabsÚir   r   r   ÚpushÀ   s    	%zasync_chat.pushc             C   s   |  j  j | ƒ |  j ƒ  d  S)N)r   r   r.   )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   r   ÚreadableÐ   s    zasync_chat.readablec             C   s   |  j  p |  j S)z4predicate for inclusion in the writable for select())r   Ú	connected)r   r   r   r   ÚwritableØ   s    zasync_chat.writablec             C   s   |  j  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   sg  x`|  j  rb|  j rb|  j  d } | sL |  j  d =| d  k rL |  j ƒ  d  S|  j } y | d  | … } WnD t k
 r¯ | j ƒ  } | rž |  j  j | ƒ n
 |  j  d =w Yn Xt | t ƒ rÚ |  j	 rÚ t
 | |  j ƒ } y |  j | ƒ } Wn  t k
 r|  j ƒ  d  SYn X| r^| t | ƒ k  s:| t | ƒ k  rT| | d  … |  j  d <n
 |  j  d =d  SWd  S)Nr   )r   r<   r1   r6   r4   ÚmoreÚ
appendleftr   r   r   r   r   Úsendr&   r'   r(   )r   ÚfirstZobsr   Znum_sentr   r   r   r.   à   s8    

	

	$
zasync_chat.initiate_sendc             C   s*   d |  _  |  j d  d  … =|  j j ƒ  d  S)Nr   )r   r   r   Úclear)r   r   r   r   Údiscard_buffers  s    	zasync_chat.discard_buffers)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r6   r   r   r
   r   r   r   r   r    r!   r-   r/   r1   r9   r:   r;   r=   r>   r.   rD   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_produceri   c             C   s   | |  _  | |  _ d  S)N)r   Úbuffer_size)r   r   rJ   r   r   r   r
     s    	zsimple_producer.__init__c             C   se   t  |  j ƒ |  j k rK |  j d  |  j … } |  j |  j d  … |  _ | S|  j } d |  _ | Sd  S)Nr   )r(   r   rJ   )r   Úresultr   r   r   r?     s    		zsimple_producer.moreN)rE   rF   rG   r
   r?   r   r   r   r   rI     s   rI   c               @   s[   e  Z d  Z d d d „ Z d d „  Z d d „  Z d d	 „  Z d
 d „  Z d d „  Z d S)ÚfifoNc             C   sJ   d d  l  } | j d t d d ƒ| s7 t ƒ  |  _ n t | ƒ |  _ d  S)Nr   z(fifo class will be removed in Python 3.6Ú
stacklevelé   )ÚwarningsÚwarnÚDeprecationWarningr   Úlist)r   rR   rO   r   r   r   r
   !  s    	zfifo.__init__c             C   s   t  |  j ƒ S)N)r(   rR   )r   r   r   r   Ú__len__*  s    zfifo.__len__c             C   s   |  j  S)N)rR   )r   r   r   r   Úis_empty-  s    zfifo.is_emptyc             C   s   |  j  d S)Nr   )rR   )r   r   r   r   rB   0  s    z
fifo.firstc             C   s   |  j  j | ƒ d  S)N)rR   r   )r   r   r   r   r   r9   3  s    z	fifo.pushc             C   s$   |  j  r d |  j  j ƒ  f Sd Sd  S)Nr"   r   )r   N)rR   Úpopleft)r   r   r   r   Úpop6  s    	zfifo.pop)	rE   rF   rG   r
   rS   rT   rB   r9   rV   r   r   r   r   rL      s   	rL   c             C   sE   t  | ƒ d } x. | r@ |  j | d  | … ƒ r@ | d 8} q W| S)Nr"   )r(   Úendswith)ZhaystackZneedleÚlr   r   r   r*   L  s    #r*   )	rH   r   Úcollectionsr   r	   r   rI   rL   r*   r   r   r   r   Ú<module>/   s   Û,