ó
[³XMc           @   s÷   d  Z  d d l m Z d d l m Z m Z d d l m Z d d l m Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 d d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e j f d „  ƒ  YZ d „  Z d „  Z d S(   sE   
Dict client protocol implementation.

@author: Pavel Pergamenshchik
iÿÿÿÿ(   t   basic(   t   defert   protocol(   t   log(   t   StringIOc         C   sL  |  d k r d	 S|  d d k r) d } n d } d } t |  ƒ } | d k r] | j d ƒ n  xè | j d ƒ } | d k r§ | d k r;| j d ƒ | | j ƒ  f Sn” | d k rÛ | j d ƒ } | d k r;d |  f Sn` | d k r| d k r| | j ƒ  f Sd |  f Sn+ | d k r;| d k r;| | j ƒ  f Sn  | | 7} q` d S(
   sQ   Chew one dqstring or atom from beginning of line and return (param, remaningline)t    i    t   "i   i   s   \t    N(   NR   (   t   NoneR   t   read(   t   linet   modet   rest   iot   a(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt
   parseParam   s6    	c         C   s   t  d „  |  ƒ S(   s   Munch a string into an 'atom'c         S   s&   |  t  t t d ƒ d d d g ƒ k S(   Ni!   i"   i'   i\   (   t   mapt   chrt   range(   t   x(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   <lambda>3   s    (   t   filter(   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   makeAtom0   s    c         C   sr   t  d ƒ d d d g } g  } x= |  D]5 } t | ƒ | k rN | j d ƒ n  | j | ƒ q& Wd j | ƒ }  |  S(   Ni!   i"   i'   i\   s   \R   (   R   t   ordt   appendt   join(   t   st	   mustquotet   resultt   c(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   makeWord5   s    c         C   s\   t  |  ƒ d k r" |  d k r" d  St  |  ƒ d k rT |  d d !d k rT |  d }  n  |  Sd  S(   Ni   t   .i    i   s   ..(   t   lenR   (   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt	   parseText?   s
    %t
   Definitionc           B   s   e  Z d  Z d „  Z RS(   s   A word definitionc         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   namet   dbt   dbdesct   text(   t   selfR#   R$   R%   R&   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   __init__I   s    			(   t   __name__t
   __module__t   __doc__R(   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR"   G   s   t
   DictClientc           B   s@  e  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 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# d „  Z$ d „  Z% d „  Z& d „  Z' RS(!   s   dict (RFC2229) clienti   c         C   s   d  |  _ d  |  _ d  S(   N(   R   t   dataR   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR(   Y   s    	c         C   s   d |  _  d |  _ d  S(   Nt   connt   command(   t   stateR   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   connectionMade]   s    	c         C   s?   t  | ƒ |  j d k r( t d ƒ ‚ n  t j j |  | ƒ d S(   s3   Throw up if the line is longer than 1022 charactersi   s(   DictClient tried to send a too long lineN(   R    t
   MAX_LENGTHt
   ValueErrorR    t   LineReceivert   sendLine(   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR5   a   s    c         C   sË   y | j  d ƒ } Wn t k
 r' d  SX|  j d k r@ d } n[ t | ƒ d k  r t j d | ƒ |  j d ƒ |  j j ƒ  d  St	 | d  ƒ } | d } t
 |  d | |  j f |  j ƒ } | | ƒ d  S(   Ns   UTF-8R&   i   s-   DictClient got invalid line from server -- %ss   Invalid line from serveri   s   dictCode_%s_%s(   t   decodet   UnicodeErrorR   R    R   t   msgt   protocolErrort	   transportt   LoseConnectiont   intt   getattrR0   t   dictCode_default(   R'   R
   t   codet   method(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   lineReceivedg   s    	
"c         C   s/   t  j d | ƒ |  j d ƒ |  j j ƒ  d S(   s   Unkown messages3   DictClient got unexpected message from server -- %ss   Unexpected server messageN(   R   R8   R9   R:   t   loseConnection(   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR>   y   s    c         C   s   d S(   s*   We are about to get kicked off, do nothingN(    (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_221_ready   s    c         C   s   d |  _  |  j ƒ  d S(   s   Greeting messaget   readyN(   R0   t   dictConnected(   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_220_connƒ   s    	c         C   s   |  j  d ƒ |  j j ƒ  d  S(   Ns   Access denied(   R9   R:   RB   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_530_connˆ   s    c         C   s   |  j  d ƒ |  j j ƒ  d  S(   Ns   Server temporarily unavailable(   R9   R:   RB   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_420_connŒ   s    c         C   s   |  j  d ƒ |  j j ƒ  d  S(   Ns(   Server shutting down at operator request(   R9   R:   RB   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_421_conn   s    c         C   sr   |  j  d k s t d ‚ d |  _ d |  _ d |  _  d t | j d ƒ ƒ t | j d ƒ ƒ f } |  j | ƒ d S(   s   Send a dict DEFINE commandRD   s4   DictClient.sendDefine called when not in ready statet   defines   DEFINE %s %ss   UTF-8N(	   R0   t   AssertionErrorR   R   R-   R   t   encodeR   R5   (   R'   t   databaset   wordR/   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt
   sendDefine”   s    			.c         C   sr   |  j  d k s t d ‚ d |  _ d |  _ d |  _  d t | ƒ t | ƒ t | ƒ f } |  j | j d ƒ ƒ d S(   s   Send a dict MATCH commandRD   s3   DictClient.sendMatch called when not in ready statet   matchs   MATCH %s %s %ss   UTF-8N(   R0   RK   R   R   R-   R   R5   RL   (   R'   RM   t   strategyRN   R/   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt	   sendMatch   s    			%c         C   s   d |  _  |  j d  ƒ d S(   s   Invalid databaseRD   N(   R   t   defineFailed(   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_550_define¦   s    	c         C   s   d |  _  |  j d  ƒ d S(   s   Invalid databaseRD   N(   R   t   matchFailed(   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_550_match«   s    	c         C   s   d |  _  |  j d  ƒ d S(   s   Invalid strategyRD   N(   R   RU   (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_551_match°   s    	c         C   s   d |  _  |  j d  ƒ d S(   s   No matchRD   N(   R   RS   (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_552_defineµ   s    	c         C   s   d |  _  |  j d  ƒ d S(   s   No matchRD   N(   R   RU   (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_552_matchº   s    	c         C   s   g  |  _  d S(   s   n definitions retrievedN(   R   (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_150_define¿   s    c         C   sš   d |  _  t | ƒ \ } } t | ƒ \ } } t | ƒ \ } } | oN | oN | sn |  j d ƒ |  j j ƒ  n( |  j j t | | | g  ƒ ƒ g  |  _ d S(   s   Definition text followsR&   s   Invalid server responseN(	   R   R   R9   R:   RB   R   R   R"   R-   (   R'   R
   RN   R$   R%   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_151_defineÃ   s    	c         C   s   d |  _  g  |  _ g  |  _ d S(   s   n matches found, text followsR&   N(   R   R   R-   (   R'   R
   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_152_matchÐ   s    		c         C   sT   t  | ƒ } | d k r@ d |  _ |  j |  j d _ d |  _ n |  j j | ƒ d S(   s"   A line of definition text receivedR/   iÿÿÿÿN(   R!   R   R   R-   R   R&   R   (   R'   R
   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_text_defineÖ   s    	c         C   s_   d „  } t  | ƒ } | d k rK d |  _ t | |  j ƒ |  _ d |  _ n |  j j | ƒ d S(   s   One line of match text receivedc         S   s.   t  |  ƒ \ } } t  | ƒ \ } } | | f S(   N(   R   (   R   t   p1t   tt   p2(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   lâ   s    R/   N(   R!   R   R   R   R-   R   R   (   R'   R
   Ra   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_text_matchà   s    		c         C   s,   |  j  } d |  _  d |  _ |  j | ƒ d S(   t   okRD   N(   R   R   R0   t
   defineDone(   R'   R
   R_   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_250_defineî   s    			c         C   s,   |  j  } d |  _  d |  _ |  j | ƒ d S(   Rc   RD   N(   R   R   R0   t	   matchDone(   R'   R
   R_   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   dictCode_250_matchõ   s    			c         C   s   d S(   s5   override to catch unexpected dict protocol conditionsN(    (   R'   t   reason(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR9   ü   s    c         C   s   d S(   sC   override to be notified when the server is ready to accept commandsN(    (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRE      s    c         C   s   d S(   s8   override to catch reasonable failure responses to DEFINEN(    (   R'   Rh   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRS     s    c         C   s   d S(   s"   override to catch succesful DEFINEN(    (   R'   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRd     s    c         C   s   d S(   s6   override to catch resonable failure responses to MATCHN(    (   R'   Rh   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRU     s    c         C   s   d S(   s!   override to catch succesful MATCHN(    (   R'   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRf     s    N((   R)   R*   R+   R   R-   R2   R0   R   R   t   factoryR(   R1   R5   RA   R>   RC   RF   RG   RH   RI   RO   RR   RT   RV   RW   RX   RY   RZ   R[   R\   R]   Rb   Re   Rg   R9   RE   RS   Rd   RU   Rf   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR,   O   sJ   																							
								t   InvalidResponsec           B   s   e  Z RS(    (   R)   R*   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRj     s   t
   DictLookupc           B   sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sN   Utility class for a single dict transaction. To be used with DictLookupFactoryc         C   s9   |  j  j s5 |  j  j j t | ƒ ƒ |  j  j ƒ  n  d  S(   N(   Ri   t   donet   dt   errbackRj   t
   clientDone(   R'   Rh   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR9     s    c         C   sZ   |  j  j d k r+ t |  j |  j  j ƒ n+ |  j  j d k rV t |  j |  j  j ƒ n  d  S(   NRJ   RP   (   Ri   t	   queryTypet   applyRO   t   paramRR   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRE   !  s    c         C   s1   |  j  j j g  ƒ |  j  j ƒ  |  j j ƒ  d  S(   N(   Ri   Rm   t   callbackRo   R:   RB   (   R'   Rh   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRS   '  s    c         C   s1   |  j  j j | ƒ |  j  j ƒ  |  j j ƒ  d  S(   N(   Ri   Rm   Rs   Ro   R:   RB   (   R'   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRd   ,  s    c         C   s1   |  j  j j g  ƒ |  j  j ƒ  |  j j ƒ  d  S(   N(   Ri   Rm   Rs   Ro   R:   RB   (   R'   Rh   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRU   1  s    c         C   s1   |  j  j j | ƒ |  j  j ƒ  |  j j ƒ  d  S(   N(   Ri   Rm   Rs   Ro   R:   RB   (   R'   R   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRf   6  s    (	   R)   R*   R+   R9   RE   RS   Rd   RU   Rf   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRk     s   					t   DictLookupFactoryc           B   sG   e  Z d  Z e Z d Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(   s-   Utility factory for a single dict transactionc         C   s(   | |  _  | |  _ | |  _ d |  _ d  S(   Ni    (   Rp   Rr   Rm   Rl   (   R'   Rp   Rr   Rm   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyR(   A  s    			c         C   s   d |  _  |  ` d S(   s   Called by client when done.i   N(   Rl   Rm   (   R'   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRo   G  s    	c         C   s   |  j  j | ƒ d  S(   N(   Rm   Rn   (   R'   t	   connectort   error(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   clientConnectionFailedL  s    c         C   s    |  j  s |  j j | ƒ n  d  S(   N(   Rl   Rm   Rn   (   R'   Ru   Rv   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   clientConnectionLostO  s    	c         C   s   |  j  ƒ  } |  | _ | S(   N(   R   Ri   (   R'   t   addrt   p(    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   buildProtocolS  s    	N(   R)   R*   R+   Rk   R   R   Rl   R(   Ro   Rw   Rx   R{   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRt   <  s   				c         C   sK   t  j ƒ  } t d | | f | ƒ } d d l m } | j |  | | ƒ | S(   s"   Look up a word using a dict serverRJ   iÿÿÿÿ(   t   reactor(   R   t   DeferredRt   t   twisted.internetR|   t
   connectTCP(   t   hostt   portRM   RN   Rm   Ri   R|   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRJ   Y  s
    c         C   sN   t  j ƒ  } t d | | | f | ƒ } d d l m } | j |  | | ƒ | S(   s    Match a word using a dict serverRP   iÿÿÿÿ(   R|   (   R   R}   Rt   R~   R|   R   (   R€   R   RM   RQ   RN   Rm   Ri   R|   (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyRP   b  s
    N(    (   R+   t   twisted.protocolsR    R~   R   R   t   twisted.pythonR   R   R   R   R   R!   R"   R4   R,   t	   ExceptionRj   Rk   t   ClientFactoryRt   RJ   RP   (    (    (    s:   /usr/lib/python2.7/dist-packages/twisted/protocols/dict.pyt   <module>	   s   	 		
	Æ#		