ó
5Þ	Pc           @   s    d  Z  d d l Z d d l Z d d l m Z d d l m Z d d l m Z m	 Z	 d e j
 f d „  ƒ  YZ d d d	 „  ƒ  YZ d
 d d „  ƒ  YZ d „  Z d S(   s¥  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.
iÿÿÿÿN(   t   deque(   t   py3kwarning(   t   filterwarningst   catch_warningst
   async_chatc           B   s¹   e  Z d  Z d Z d Z d 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 RS(   s‡   This is an abstract class.  You must derive from this class, and add
    the two methods collect_incoming_data() and found_terminator()i   c         C   s8   d |  _  g  |  _ t ƒ  |  _ t j j |  | | ƒ d  S(   Nt    (   t   ac_in_buffert   incomingR    t   producer_fifot   asyncoret
   dispatchert   __init__(   t   selft   sockt   map(    (    s   /usr/lib/python2.7/asynchat.pyR   @   s    		c         C   s   t  d ƒ ‚ d  S(   Ns   must be implemented in subclass(   t   NotImplementedError(   R   t   data(    (    s   /usr/lib/python2.7/asynchat.pyt   collect_incoming_dataQ   s    c         C   s   |  j  j | ƒ d  S(   N(   R   t   append(   R   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   _collect_incoming_dataT   s    c         C   s   d j  |  j ƒ } |  j 2| S(   NR   (   t   joinR   (   R   t   d(    (    s   /usr/lib/python2.7/asynchat.pyt	   _get_dataW   s    c         C   s   t  d ƒ ‚ d  S(   Ns   must be implemented in subclass(   R   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   found_terminator\   s    c         C   s   | |  _  d S(   sR   Set the input delimiter.  Can be a fixed string of any length, an integer, or NoneN(   t
   terminator(   R   t   term(    (    s   /usr/lib/python2.7/asynchat.pyt   set_terminator_   s    c         C   s   |  j  S(   N(   R   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   get_terminatorc   s    c         C   s	  y |  j  |  j ƒ } Wn! t j k
 r9 } |  j ƒ  d  SX|  j | |  _ x¸|  j rt |  j ƒ } |  j ƒ  } | s“ |  j |  j ƒ d |  _ qM t	 | t
 ƒ s± t	 | t ƒ r)| } | | k  rï |  j |  j ƒ d |  _ |  j | |  _ q|  j |  j |  ƒ |  j | |  _ d |  _ |  j ƒ  qM t | ƒ } |  j j | ƒ } | d k r—| d k rv|  j |  j |  ƒ n  |  j | | |  _ |  j ƒ  qM t |  j | ƒ } | rè| | k rä|  j |  j |  ƒ |  j | |  _ n  PqM |  j |  j ƒ d |  _ qM Wd  S(   NR   i    iÿÿÿÿ(   t   recvt   ac_in_buffer_sizet   sockett   errort   handle_errorR   t   lenR   R   t
   isinstancet   intt   longR   R   t   findt   find_prefix_at_end(   R   R   t   whyt   lbR   t   nt   terminator_lent   index(    (    s   /usr/lib/python2.7/asynchat.pyt   handle_readk   sJ    
			c         C   s   |  j  ƒ  d  S(   N(   t   initiate_send(   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   handle_write­   s    c         C   s   |  j  ƒ  d  S(   N(   t   close(   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   handle_close°   s    c         C   sz   |  j  } t | ƒ | k r\ xN t d t | ƒ | ƒ D]! } |  j j | | | | !ƒ q4 Wn |  j j | ƒ |  j ƒ  d  S(   Ni    (   t   ac_out_buffer_sizeR!   t   xrangeR   R   R-   (   R   R   t   sabst   i(    (    s   /usr/lib/python2.7/asynchat.pyt   push³   s    	"c         C   s   |  j  j | ƒ |  j ƒ  d  S(   N(   R   R   R-   (   R   t   producer(    (    s   /usr/lib/python2.7/asynchat.pyt   push_with_producer¼   s    c         C   s   d S(   s4   predicate for inclusion in the readable for select()i   (    (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   readableÀ   s    c         C   s   |  j  p |  j S(   s4   predicate for inclusion in the writable for select()(   R   t	   connected(   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   writableÈ   s    c         C   s   |  j  j d ƒ d S(   sA   automatically close this channel once the outgoing queue is emptyN(   R   R   t   None(   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   close_when_doneÌ   s    c      	   C   sf  x_|  j  ra|  j ra|  j  d } | sO |  j  d =| d  k rO |  j ƒ  d  Sn  |  j } y? t ƒ  0 t r~ t d d t ƒ n  t	 | d | ƒ } Wd  QXWnC t
 k
 rÜ | j ƒ  } | rÌ |  j  j | ƒ q |  j  d =q n Xy |  j | ƒ } Wn t j k
 r|  j ƒ  d  SX| r]| t | ƒ k  s<| t | ƒ k  rP| | |  j  d <q]|  j  d =n  d  SWd  S(   Ni    t   ignores   .*buffer(   R   R9   R;   R0   R1   R   R   R   t   DeprecationWarningt   buffert	   TypeErrort   moret
   appendleftt   sendR   R   R    R!   (   R   t   firstt   obsR   t   num_sent(    (    s   /usr/lib/python2.7/asynchat.pyR-   Ð   s:    

	


$c         C   s!   d |  _  |  j 2|  j j ƒ  d  S(   NR   (   R   R   R   t   clear(   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   discard_buffersø   s    	N(   t   __name__t
   __module__t   __doc__R   R1   R;   R   R   R   R   R   R   R   R,   R.   R0   R5   R7   R8   R:   R<   R-   RH   (    (    (    s   /usr/lib/python2.7/asynchat.pyR   7   s(   							B									(t   simple_producerc           B   s   e  Z d  d „ Z d „  Z RS(   i   c         C   s   | |  _  | |  _ d  S(   N(   R   t   buffer_size(   R   R   RM   (    (    s   /usr/lib/python2.7/asynchat.pyR      s    	c         C   sY   t  |  j ƒ |  j k r? |  j |  j  } |  j |  j |  _ | S|  j } d |  _ | Sd  S(   NR   (   R!   R   RM   (   R   t   result(    (    s   /usr/lib/python2.7/asynchat.pyRA     s    		(   RI   RJ   R   RA   (    (    (    s   /usr/lib/python2.7/asynchat.pyRL   þ   s   t   fifoc           B   sA   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s(   | s t  ƒ  |  _ n t  | ƒ |  _ d  S(   N(   R    t   list(   R   RP   (    (    s   /usr/lib/python2.7/asynchat.pyR     s    c         C   s   t  |  j ƒ S(   N(   R!   RP   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   __len__  s    c         C   s   |  j  S(   N(   RP   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   is_empty  s    c         C   s   |  j  d S(   Ni    (   RP   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyRD     s    c         C   s   |  j  j | ƒ d  S(   N(   RP   R   (   R   R   (    (    s   /usr/lib/python2.7/asynchat.pyR5     s    c         C   s$   |  j  r d |  j  j ƒ  f Sd Sd  S(   Ni   i    (   i    N(   RP   t   popleftR;   (   R   (    (    s   /usr/lib/python2.7/asynchat.pyt   pop!  s    	N(	   RI   RJ   R;   R   RQ   RR   RD   R5   RT   (    (    (    s   /usr/lib/python2.7/asynchat.pyRO     s   				c         C   s?   t  | ƒ d } x( | r: |  j | |  ƒ r: | d 8} q W| S(   Ni   (   R!   t   endswith(   t   haystackt   needlet   l(    (    s   /usr/lib/python2.7/asynchat.pyR&   6  s    (    (    (   RK   R   R	   t   collectionsR    t   sysR   t   warningsR   R   R
   R   RL   RO   R&   (    (    (    s   /usr/lib/python2.7/asynchat.pyt   <module>/   s   Ç(