ó
¹‰Tc           @   s¢   d  d l  Z  d  d l m Z m Z d  d l m Z d  d l m Z m Z d  d l	 m
 Z
 m Z m Z d e f d „  ƒ  YZ d e d d d „ Z d d d „ Z d S(   iÿÿÿÿN(   t   defert   reactor(   t   Int32StringReceiver(   t   TCP4ClientEndpointt   connectProtocol(   t   IMessaget   IRequestt	   IResponset   KademliaClientProtocolc           B   s&   e  Z d  „  Z d d „ Z d „  Z RS(   c         C   s   t  j d ƒ |  _ i  |  _ d  S(   Ni    (   t   randomt   getrandbitst	   _sequencet
   _deferreds(   t   self(    (    s   kademlia/interface.pyt   connectionMade   s    c            sÑ   t  ƒ  ‰ y ˆ  j ˆ _ ˆ  j d 7_ Wn# t k
 rM d ˆ _ d ˆ  _ n Xˆ j j | ƒ ˆ  j ˆ j ƒ  ƒ t j	 ‡ ‡  f d †  ƒ } | ˆ  j
 ˆ j <| d  k	 rÍ ‡ ‡  f d †  } t j | | ƒ n  | S(   Ni   i    c            s   ˆ j  j ˆ  j d  ƒ S(   N(   R   t   popt   sequencet   None(   t   _(   t   imsgR   (    s   kademlia/interface.pyt   <lambda>   s    c             s>   ˆ j  j ˆ  j d  ƒ }  |  d  k	 r: |  j t j ƒ  ƒ n  d  S(   N(   R   R   R   R   t   errbackR    t   TimeoutError(   t   d(   R   R   (    s   kademlia/interface.pyt   cleanup"   s    (   R   R   R   t
   ValueErrort   requestt   CopyFromt
   sendStringt   SerializeToStringR    t   DeferredR   R   R   t	   callLater(   R   t   ireqt   timeoutR   R   (    (   R   R   s   kademlia/interface.pyt   sendIRequest   s    		c         C   s{   t  j | ƒ } | j d ƒ } | d k rw y6 |  j j | j ƒ } | j | j ƒ |  j j	 ƒ  Wqw t
 k
 rs qw Xn  d  S(   Nt   req_rest   response(   R   t
   FromStringt
   WhichOneofR   R   R   t   callbackR$   t	   transportt   loseConnectiont   KeyError(   R   t   msgR   R#   R   (    (    s   kademlia/interface.pyt   stringReceived)   s    N(   t   __name__t
   __module__R   R   R"   R,   (    (    (    s   kademlia/interface.pyR   
   s   	i   i<   t	   localhosti1Ô  i
   c            sƒ   d „  } ‡  f d †  } t  t | d | d ƒ }	 t |	 t ƒ  ƒ }
 |
 j | |  | | | | ƒ |
 j | |  | | | ˆ  | ƒ |
 S(   Nc         S   sR   t  ƒ  } t  j | _ | | _ | | j _ | | j _ | | _ |  j | d | ƒS(   NR!   (	   R   t   REGISTERt	   operationt
   identifiert   peert   hostt   portt
   expirationR"   (   t   pt   identR4   R5   t   expt   toR    (    (    s   kademlia/interface.pyt   send_req8   s    			c      	      sv   |  j  t j k rE ˆ  rA t j | d t | | | | | | ƒ n  d  S|  j  t j k ri t |  j	 ƒ ‚ n	 t
 ƒ  ‚ d  S(   Ni   (   t   statusR   t   SUCCESSR   R   t   registerR   t   FAILUREt	   Exceptiont   errort   NotImplementedError(   t   iresR8   R4   R5   R9   t   rept   con(   t   repeat(    s   kademlia/interface.pyt   process_into_resultA   s    i    i   (   R   R   R   R   t   addCallback(   R2   R4   R5   R6   RF   t   contactR!   R;   RG   t   pointR   (    (   RF   s   kademlia/interface.pyR>   6   s    		
c            se   ‡  ‡ f d †  } d „  } t  t | d | d ƒ } t | t ƒ  ƒ } | j | ƒ | j | ƒ | S(   Nc            s1   t  ƒ  } t  j | _ ˆ  | _ |  j | d ˆ ƒS(   NR!   (   R   t   LOOKUPR1   R2   R"   (   R7   R    (   R2   R!   (    s   kademlia/interface.pyR;   T   s    		c         S   sY   |  j  t j k r( |  j j |  j j f S|  j  t j k rL t |  j ƒ ‚ n	 t	 ƒ  ‚ d  S(   N(
   R<   R   R=   R3   R4   R5   R?   R@   RA   RB   (   RC   (    (    s   kademlia/interface.pyRG   Z   s
    i    i   (   R   R   R   R   RH   (   R2   RI   R!   R;   RG   RJ   R   (    (   R2   R!   s   kademlia/interface.pyt   lookupS   s    	i„  (   R/   i1Ô  (   R/   i1Ô  (   R	   t   twisted.internetR    R   t   twisted.protocols.basicR   t   twisted.internet.endpointsR   R   t   protobuf.kademlia_pb2R   R   R   R   t   TrueR>   RL   (    (    (    s   kademlia/interface.pyt   <module>   s   ,