Ñò
mÈKc           @   s    d  Z  d d k Z d d k Z d d k l Z d d k l Z d d k l Z l	 Z	 d e i
 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 i i |  | | ƒ d  S(   Nt    (   t   ac_in_buffert   incomingR    t   producer_fifot   asyncoret
   dispatchert   __init__(   t   selft   sockt   map(    (    s   /usr/lib/python2.6/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.6/asynchat.pyt   collect_incoming_dataQ   s    c         C   s   |  i  i | ƒ d  S(   N(   R   t   append(   R   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   _collect_incoming_dataT   s    c         C   s   d i  |  i ƒ } |  i 2| S(   NR   (   t   joinR   (   R   t   d(    (    s   /usr/lib/python2.6/asynchat.pyt	   _get_dataW   s    c         C   s   t  d ƒ ‚ d  S(   Ns   must be implemented in subclass(   R   (   R   (    (    s   /usr/lib/python2.6/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.6/asynchat.pyt   set_terminator_   s    c         C   s   |  i  S(   N(   R   (   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   get_terminatorc   s    c         C   s  y |  i  |  i ƒ } Wn# t i j
 o } |  i ƒ  d  SX|  i | |  _ xÉ|  i o¾t |  i ƒ } |  i ƒ  } | p |  i |  i ƒ d |  _ qO t	 | t
 ƒ p t	 | t ƒ o{ | } | | j  o- |  i |  i ƒ d |  _ |  i | |  _ q|  i |  i |  ƒ |  i | |  _ d |  _ |  i ƒ  qO t | ƒ } |  i i | ƒ } | d j oG | d j o |  i |  i |  ƒ n |  i | | |  _ |  i ƒ  qO t |  i | ƒ } | o< | | j o* |  i |  i |  ƒ |  i | |  _ n PqO |  i |  i ƒ d |  _ qO 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.6/asynchat.pyt   handle_readk   sL    
 
 			c         C   s   |  i  ƒ  d  S(   N(   t   initiate_send(   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   handle_write­   s    c         C   s   |  i  ƒ  d  S(   N(   t   close(   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   handle_close°   s    c         C   s|   |  i  } t | ƒ | j oB xO t d t | ƒ | ƒ D]! } |  i i | | | | !ƒ q5 Wn |  i i | ƒ |  i ƒ  d  S(   Ni    (   t   ac_out_buffer_sizeR!   t   xrangeR   R   R-   (   R   R   t   sabst   i(    (    s   /usr/lib/python2.6/asynchat.pyt   push³   s    	 #c         C   s   |  i  i | ƒ |  i ƒ  d  S(   N(   R   R   R-   (   R   t   producer(    (    s   /usr/lib/python2.6/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.6/asynchat.pyt   readableÀ   s    c         C   s   |  i  p |  i S(   s4   predicate for inclusion in the writable for select()(   R   t	   connected(   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   writableÈ   s    c         C   s   |  i  i d ƒ d S(   sA   automatically close this channel once the outgoing queue is emptyN(   R   R   t   None(   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   close_when_doneÌ   s    c         C   s…  x~|  i  os|  i oi|  i  d } | p* |  i  d =| d  j o |  i ƒ  d  Sn |  i } yL t ƒ  i i ƒ  z1 t o t	 d d t
 ƒ n t | d | ƒ } Wd  QXWnG t j
 o; | i ƒ  } | o |  i  i | ƒ q |  i  d =q n Xy |  i | ƒ } Wn! t i j
 o |  i ƒ  d  SX| oI | t | ƒ j  p | t | ƒ j  o | | |  i  d <q{|  i  d =n d  SWd  S(   Ni    t   ignores   .*buffer(   R   R9   R;   R0   R1   R   t   __exit__t	   __enter__R   R   t   DeprecationWarningt   buffert	   TypeErrort   moret
   appendleftt   sendR   R   R    R!   (   R   t   firstt   obsR   t   num_sent(    (    s   /usr/lib/python2.6/asynchat.pyR-   Ð   s<     

		

&c         C   s!   d |  _  |  i 2|  i i ƒ  d  S(   NR   (   R   R   R   t   clear(   R   (    (    s   /usr/lib/python2.6/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-   RJ   (    (    (    s   /usr/lib/python2.6/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   RO   (    (    s   /usr/lib/python2.6/asynchat.pyR      s    	c         C   s[   t  |  i ƒ |  i j o( |  i |  i  } |  i |  i |  _ | S|  i } d |  _ | Sd  S(   NR   (   R!   R   RO   (   R   t   result(    (    s   /usr/lib/python2.6/asynchat.pyRC     s    		(   RK   RL   R   RC   (    (    (    s   /usr/lib/python2.6/asynchat.pyRN   þ   s   t   fifoc           B   sA   e  Z d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s*   | p t  ƒ  |  _ n t  | ƒ |  _ d  S(   N(   R    t   list(   R   RR   (    (    s   /usr/lib/python2.6/asynchat.pyR     s    c         C   s   t  |  i ƒ S(   N(   R!   RR   (   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   __len__  s    c         C   s   |  i  S(   N(   RR   (   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   is_empty  s    c         C   s   |  i  d S(   Ni    (   RR   (   R   (    (    s   /usr/lib/python2.6/asynchat.pyRF     s    c         C   s   |  i  i | ƒ d  S(   N(   RR   R   (   R   R   (    (    s   /usr/lib/python2.6/asynchat.pyR5     s    c         C   s&   |  i  o d |  i  i ƒ  f Sd Sd  S(   Ni   i    (   i    N(   RR   t   popleftR;   (   R   (    (    s   /usr/lib/python2.6/asynchat.pyt   pop!  s    
N(	   RK   RL   R;   R   RS   RT   RF   R5   RV   (    (    (    s   /usr/lib/python2.6/asynchat.pyRQ     s   				c         C   sB   t  | ƒ d } x+ | o# |  i | |  ƒ o | d 8} q W| S(   Ni   (   R!   t   endswith(   t   haystackt   needlet   l(    (    s   /usr/lib/python2.6/asynchat.pyR&   6  s
     (    (    (   RM   R   R	   t   collectionsR    t   sysR   t   warningsR   R   R
   R   RN   RQ   R&   (    (    (    s   /usr/lib/python2.6/asynchat.pyt   <module>/   s   Ç(