Ë
    ojä  ã                   ó  — 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dl
mZ  G d„ d«      Z G d	„ d
«      Z G d„ d«      Z G d„ d«      Z G d„ de«      Z eej"                  «       G d„ de«      «       Z G d„ dej&                  «      Zd„ Zy)z
Utility classes for spread.
é    )Úimplementer)ÚdeferÚ
interfaces)Úbasic)ÚFailure)Úpbc                   ó   — e Zd Zd„ Zd„ Zy)ÚLocalMethodc                 ó    — || _         || _        y ©N)ÚlocalÚname)Úselfr   r   s      ú5/usr/lib/python3/dist-packages/twisted/spread/util.pyÚ__init__zLocalMethod.__init__   s   € ØˆŒ
Øˆ�	ó    c                 óV   —  | j                   j                  | j                  g|¢­i |¤ŽS r   )r   Ú
callRemoter   )r   ÚargsÚkws      r   Ú__call__zLocalMethod.__call__   s'   € Ø$ˆt�z‰z×$Ñ$ T§Y¡YÐ<°Ò<¸Ñ<Ð<r   N)Ú__name__Ú
__module__Ú__qualname__r   r   © r   r   r
   r
      s   „ òó=r   r
   c                   ó    — e Zd ZdZdZd„ Zd„ Zy)ÚLocalAsRemotezN
    A class useful for emulating the effects of remote behavior locally.
    é   c                 ó4  — t        | d|z   «      r t        | d|z   «      |i |¤ŽS 	 t        | d|z   «      }t        j                   ||i |¤Ž«      S # t        $ r> t        «       }| j                  r|j                  «        t        j                  |«      cY S w xY w)ax  
        Call a specially-designated local method.

        self.callRemote('x') will first try to invoke a method named
        sync_x and return its result (which should probably be a
        Deferred).  Second, it will look for a method called async_x,
        which will be called and then have its result (or Failure)
        automatically wrapped in a Deferred.
        Úsync_Úasync_)	ÚhasattrÚgetattrr   ÚsucceedÚBaseExceptionr   ÚreportAllTracebacksÚprintTracebackÚfail)r   r   r   r   ÚmethodÚfs         r   r   zLocalAsRemote.callRemote#   s–   € ô �4˜ 4™Ô(Ø0”7˜4 ¨4¡Ó0°$Ð=¸"Ñ=Ð=ð	!Ü˜T 8¨d¡?Ó3ˆFÜ—=‘=¡¨Ð!4°Ñ!4Ó5Ð5øÜò 	!Ü“	ˆAØ×'Ò'Ø× Ñ Ô"Ü—:‘:˜a“=Ò ð		!ús   ¦)A ÁABÂBc                 ó   — t        | |«      S r   )r
   )r   r   s     r   ÚremoteMethodzLocalAsRemote.remoteMethod8   s   € Ü˜4 Ó&Ð&r   N)r   r   r   Ú__doc__r&   r   r,   r   r   r   r   r      s   „ ñð Ðò!ó*'r   r   c                   ó$   — e Zd ZdZdd„Zd„ Zd„ Zy)ÚLocalAsyncForwarderzD
    A class useful for forwarding a locally-defined interface.
    c                 óT   — |j                  |«      sJ ‚|| _        || _        || _        y r   )Ú
providedByÚ	forwardedÚinterfaceClassÚfailWhenNotImplemented)r   r2   r3   r4   s       r   r   zLocalAsyncForwarder.__init__A   s-   € Ø×(Ñ(¨Ô3Ð3Ð3Ø"ˆŒØ,ˆÔØ&<ˆÕ#r   c                 ó:   —  t        | j                  |«      |i |¤ŽS r   )r#   r2   )r   r)   r   r   s       r   Ú_callMethodzLocalAsyncForwarder._callMethodG   s   € Ø.Œw�t—~‘~ vÓ.°Ð;¸Ñ;Ð;r   c                 ó  — | j                   j                  |«      r&t        j                  | j                  |g|¢­i |¤Ž}|S | j
                  r&t        j                  t        t        d|z  «      «      S t        j                  d «      S )NzNo Such Method in Interface: %s)
r3   ÚqueryDescriptionForr   ÚmaybeDeferredr6   r4   r(   r   ÚNotImplementedErrorr$   )r   r)   r   r   Úresults        r   r   zLocalAsyncForwarder.callRemoteJ   sz   € Ø×Ñ×2Ñ2°6Ô:Ü×(Ñ(¨×)9Ñ)9¸6ÐOÀDÒOÈBÑOˆFØˆMØ×(Ò(Ü—:‘:ÜÔ+Ð-NÐQWÑ-WÓXóð ô —=‘= Ó&Ð&r   N)r   )r   r   r   r-   r   r6   r   r   r   r   r/   r/   <   s   „ ñó=ò<ó	'r   r/   c                   ó0   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zy)	ÚPagerz5
    I am an object which pages out information.
    Nc                 ó¦   — t        |«      r|| _        || _        || _        nd| _        d| _        || _        |j                  j                  | «       y)zƒ
        Create a pager with a Reference to a remote collector and
        an optional callable to invoke upon completion.
        Nr   )ÚcallableÚcallbackÚcallbackArgsÚcallbackKeywordÚ_stillPagingÚ	collectorÚbrokerÚregisterPageProducer)r   rD   r@   r   r   s        r   r   zPager.__init__[   sM   € ô
 �HÔØ$ˆDŒMØ $ˆDÔØ#%ˆDÕ à ˆDŒMØˆÔØ"ˆŒØ×Ñ×-Ñ-¨dÕ3r   c                 óÐ   — | j                   sO| j                  j                  dd¬«       | j                  �& | j                  | j                  i | j
                  ¤Ž | j                   S )ú5
        (internal) Method called by Broker.
        ÚendedPagingF©Úpbanswer)rC   rD   r   r@   rA   rB   ©r   s    r   ÚstillPagingzPager.stillPagingj   sY   € ð × Ò Ø�N‰N×%Ñ% m¸eÐ%ÔDØ�}‰}Ð(Ø�—‘˜t×0Ñ0ÐI°D×4HÑ4HÒIØ× Ñ Ð r   c                 ó\   — | j                   j                  d| j                  «       d¬«       y)rH   ÚgotPageFrJ   N)rD   r   ÚnextPagerL   s    r   ÚsendNextPagezPager.sendNextPaget   s#   € ð 	�‰×!Ñ! )¨T¯]©]«_ÀuÐ!ÕMr   c                 ó   — t        «       ‚)zO
        Override this to return an object to be sent to my collector.
        )r:   rL   s    r   rP   zPager.nextPagez   s   € ô "Ó#Ð#r   c                 ó   — d| _         y)z4
        Call this when you're done paging.
        r   N)rC   rL   s    r   Ú
stopPagingzPager.stopPaging€   s   € ð ˆÕr   r   )	r   r   r   r-   r   rM   rQ   rP   rT   r   r   r   r=   r=   V   s!   „ ñó4ò!òNò$ór   r=   c                   ó   — e Zd ZdZdd„Zd„ Zy)ÚStringPagerz:
    A simple pager that splits a string into chunks.
    Nc                 ód   — || _         d| _        || _        t        j                  | ||g|¢­i |¤Ž y )Nr   )ÚstringÚpointerÚ	chunkSizer=   r   )r   rD   ÚstrZ   r@   r   r   s          r   r   zStringPager.__init__Œ   s1   € ØˆŒØˆŒØ"ˆŒÜ�‰�t˜Y¨Ð>°4Ò>¸2Ó>r   c                 ó  — | j                   | j                  | j                  | j                  z    }| xj                  | j                  z  c_        | j                  t        | j                   «      k\  r| j	                  «        |S r   )rX   rY   rZ   ÚlenrT   ©r   Úvals     r   rP   zStringPager.nextPage’   sY   € Ø�k‰k˜$Ÿ,™,¨¯©¸¿¹Ñ)FÐGˆØ�Š˜Ÿ™Ñ&�Ø�<‰<œ3˜tŸ{™{Ó+Ò+Ø�O‰OÔØˆ
r   )i    N)r   r   r   r-   r   rP   r   r   r   rV   rV   ‡   s   „ ñó?ór   rV   c                   ó6   — e Zd ZdZd	d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)
Ú	FilePagerzC
    Reads a file in chunks and sends the chunks as they come.
    Nc                 ój   — g | _         t        j                  | ||g|¢­i |¤Ž | j                  |«       y r   )Úchunksr=   r   ÚstartProducing)r   rD   Úfdr@   r   r   s         r   r   zFilePager.__init__    s1   € ØˆŒÜ�‰�t˜Y¨Ð>°4Ò>¸2Ò>Ø×Ñ˜BÕr   c                 ó”   ‡ — t        j                  «       j                  |‰ «      ‰ _        ‰ j                  j	                  ˆ fd„«       y )Nc                 ó$   •— ‰j                  «       S r   )rT   )Úxr   s    €r   ú<lambda>z*FilePager.startProducing.<locals>.<lambda>§   s   ø€ ¨¯©Ó(9€ r   )r   Ú
FileSenderÚbeginFileTransferÚdeferredÚaddBoth)r   re   s   ` r   rd   zFilePager.startProducing¥   s3   ø€ Ü×(Ñ(Ó*×<Ñ<¸RÀÓFˆŒØ�‰×ÑÓ9Õ:r   c                 óL   — || _         |s| j                   j                  «        y y r   )ÚproducerÚresumeProducing)r   ro   Ú	streamings      r   ÚregisterProducerzFilePager.registerProducer©   s!   € Ø ˆŒÙØ�M‰M×)Ñ)Õ+ð r   c                 ó   — d | _         y r   )ro   rL   s    r   ÚunregisterProducerzFilePager.unregisterProducer®   s	   € Øˆ�r   c                 ó:   — | j                   j                  |«       y r   )rc   Úappend)r   Úchunks     r   ÚwritezFilePager.write±   s   € Ø�‰×Ñ˜5Õ!r   c                 óÄ   — | j                   sy| j                   j                  d«      }| j                  j                  «        | j                  j                  d|d¬«       y)zD
        Get the first chunk read and send it to collector.
        Nr   rO   FrJ   )rc   Úpopro   rp   rD   r   r^   s     r   rQ   zFilePager.sendNextPage´   sI   € ð �{Š{ØØ�k‰k�o‰o˜aÓ ˆØ�‰×%Ñ%Ô'Ø�‰×!Ñ! )¨S¸5Ð!ÕAr   r   )
r   r   r   r-   r   rd   rr   rt   rx   rQ   r   r   r   ra   ra   š   s&   „ ñó ò
;ò,ò
ò"óBr   ra   c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚCallbackPageCollectorzµ
    I receive pages from the peer. You may instantiate a Pager with a
    remote reference to me. I will call the callback with a list of pages
    once they are all received.
    c                 ó    — g | _         || _        y r   )Úpagesr@   )r   r@   s     r   r   zCallbackPageCollector.__init__Ç   s   € ØˆŒ
Ø ˆ�r   c                 ó:   — | j                   j                  |«       y r   )r~   rv   )r   Úpages     r   Úremote_gotPagez$CallbackPageCollector.remote_gotPageË   s   € Ø�
‰
×Ñ˜$Õr   c                 ó:   — | j                  | j                  «       y r   )r@   r~   rL   s    r   Úremote_endedPagingz(CallbackPageCollector.remote_endedPagingÎ   s   € Ø�‰�d—j‘jÕ!r   N)r   r   r   r-   r   r�   rƒ   r   r   r   r|   r|   À   s   „ ñò!ò ó"r   r|   c                 ó‚   — t        j                  «       } | j                  |t        |j                  «      g|¢­i |¤Ž |S )zr
    A utility method that will call a remote method which expects a
    PageCollector as the first argument.
    )r   ÚDeferredr   r|   r@   )ÚreferenceableÚ
methodNamer   r   Úds        r   ÚgetAllPagesr‰   Ò   s<   € ô
 	�‰Ó€AØ€M×Ñ˜ZÔ)>¸q¿z¹zÓ)JÐXÈTÒXÐUWÒXØ€Hr   N)r-   Úzope.interfacer   Útwisted.internetr   r   Útwisted.protocolsr   Útwisted.python.failurer   Útwisted.spreadr   r
   r   r/   r=   rV   Ú	IConsumerra   ÚReferenceabler|   r‰   r   r   r   ú<module>r‘      s’   ðñõ 'ç .Ý #Ý *Ý ÷=ñ =÷'ñ '÷@'ñ '÷4.ñ .ôb�%ô ñ& ˆZ×!Ñ!Ó"ô!B�ó !Bó #ð!BôJ"˜B×,Ñ,ô "ó$r   