+
    Dfj                         R t ^ RIHt ^ RIHtHt ^ RIHt ^ RIH	t	 ^ RI
Ht  ! R R4      t ! R R	4      t ! R
 R4      t ! R R4      t ! R R]4      t]! ]P"                  4       ! R R]4      4       t ! R R]P&                  4      tR tR# )z
Utility classes for spread.
)implementer)defer
interfaces)basic)Failure)pbc                   ,   a  ] tR t^t o R tR tRtV tR# )LocalMethodc                    Wn         W n        R # Nlocalname)selfr   r   s   &&&5/usr/lib/python3/dist-packages/twisted/spread/util.py__init__LocalMethod.__init__   s    
	    c                V    V P                   P                  ! V P                  .VO5/ VB # r   )r   
callRemoter   )r   argskws   &*,r   __call__LocalMethod.__call__   s%    zz$$TYY<<<<r   r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes____classdictcell____classdict__s   @r   r	   r	      s     = =r   r	   c                   4   a  ] tR t^t o Rt^tR tR tRtV t	R# )LocalAsRemotezF
A class useful for emulating the effects of remote behavior locally.
c                l   \        V RV,           4      '       d   \        V RV,           4      ! V/ VB #  \        V RV,           4      p\        P                  ! V! V/ VB 4      #   \         dF    \        4       pT P                  '       d   TP                  4        \        P                  ! T4      u # i ; i)a@  
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   LocalAsRemote.callRemote#   s     44((440$="==	!T8d?3F==!4!455 	!	A'''  "::a= 		!s   .A# #AB32B3c                    \        W4      # r   )r	   )r   r   s   &&r   remoteMethodLocalAsRemote.remoteMethod8   s    4&&r    N)
r   r   r   r   __doc__r+   r   r2   r   r   r    s   @r   r#   r#      s!      !*' 'r   r#   c                   :   a  ] tR t^<t o RtRR ltR tR tRtV t	R# )LocalAsyncForwarderz<
A class useful for forwarding a locally-defined interface.
c                \    VP                  V4      '       g   Q hWn        W n        W0n        R # r   )
providedBy	forwardedinterfaceClassfailWhenNotImplemented)r   r:   r;   r<   s   &&&&r   r   LocalAsyncForwarder.__init__A   s*    ((3333",&<#r   c                :    \        V P                  V4      ! V/ VB # r   )r(   r:   )r   r.   r   r   s   &&*,r   _callMethodLocalAsyncForwarder._callMethodG   s    t~~v.;;;r   c                8   V P                   P                  V4      '       d(   \        P                  ! V P                  V.VO5/ VB pV# V P
                  '       d,   \        P                  ! \        \        R V,          4      4      # \        P                  ! R4      # )zNo Such Method in Interface: %sN)
r;   queryDescriptionForr   maybeDeferredr?   r<   r-   r   NotImplementedErrorr)   )r   r.   r   r   results   &&*, r   r   LocalAsyncForwarder.callRemoteJ   s    226::(()9)96ODOBOFM(((::+-NQW-WX  ==&&r   )r<   r:   r;   N)    )
r   r   r   r   r5   r   r?   r   r   r   r    s   @r   r7   r7   <   s     =<	' 	'r   r7   c                   F   a  ] tR t^Vt o RtR	R ltR tR tR tR t	Rt
V tR# )
Pagerz-
I am an object which pages out information.
Nc                    \        V4      '       d   W n        W0n        W@n        MRV n        ^V n        Wn        VP                  P                  V 4       R# )zk
Create a pager with a Reference to a remote collector and
an optional callable to invoke upon completion.
N)callablecallbackcallbackArgscallbackKeyword_stillPaging	collectorbrokerregisterPageProducer)r   rP   rL   r   r   s   &&&*,r   r   Pager.__init__[   sH    
 H$M $#%  DM"--d3r   c                    V P                   '       gR   V P                  P                  RRR7       V P                  e'   V P                  ! V P                  / V P
                  B  V P                   # )%
(internal) Method called by Broker.
endedPagingFpbanswer)rO   rP   r   rL   rM   rN   r   s   &r   stillPagingPager.stillPagingj   sZ        NN%%me%D}}(t00ID4H4HI   r   c                ^    V P                   P                  RV P                  4       RR7       R# )rU   gotPageFrW   N)rP   r   nextPagerY   s   &r   sendNextPagePager.sendNextPaget   s#     	!!)T]]_u!Mr   c                    \        4       h)z?
Override this to return an object to be sent to my collector.
)rD   rY   s   &r   r^   Pager.nextPagez   s     "##r   c                    ^ V n         R# )z$
Call this when you're done paging.
N)rO   rY   s   &r   
stopPagingPager.stopPaging   s     r   )rO   rL   rM   rN   rP   r   )r   r   r   r   r5   r   rZ   r_   r^   rd   r   r   r    s   @r   rI   rI   V   s)     4!N$ r   rI   c                   4   a  ] tR t^t o RtRR ltR tRtV tR# )StringPagerz2
A simple pager that splits a string into chunks.
Nc                b    W n         ^ V n        W0n        \        P                  ! WV.VO5/ VB  R# )rG   N)stringpointer	chunkSizerI   r   )r   rP   strk   rL   r   r   s   &&&&&*,r   r   StringPager.__init__   s+    "t>4>2>r   c                   V P                   V P                  V P                  V P                  ,            pV ;P                  V P                  ,          un        V P                  \        V P                   4      8  d   V P	                  4        V# r   )ri   rj   rk   lenrd   r   vals   & r   r^   StringPager.nextPage   sY    kk$,,)FG&<<3t{{++OO
r   )rk   rj   ri   )i    N)	r   r   r   r   r5   r   r^   r   r   r    s   @r   rg   rg      s     ? r   rg   c                   L   a  ] tR t^t o RtR
R ltR tR tR tR t	R t
R	tV tR# )	FilePagerz;
Reads a file in chunks and sends the chunks as they come.
Nc                l    . V n         \        P                  ! WV.VO5/ VB  V P                  V4       R # r   )chunksrI   r   startProducing)r   rP   fdrL   r   r   s   &&&&*,r   r   FilePager.__init__   s/    t>4>2>Br   c                   a  \         P                  ! 4       P                  VS 4      S n        S P                  P	                  V 3R  l4       R# )c                 $   < SP                  4       # r   )rd   )xr   s   &r   <lambda>*FilePager.startProducing.<locals>.<lambda>   s    (9r   N)r   
FileSenderbeginFileTransferdeferredaddBoth)r   rx   s   f&r   rw   FilePager.startProducing   s3    ((*<<RF9:r   c                Z    Wn         V'       g   V P                   P                  4        R # R # r   )producerresumeProducing)r   r   	streamings   &&&r   registerProducerFilePager.registerProducer   s     MM))+ r   c                    R V n         R # r   )r   rY   s   &r   unregisterProducerFilePager.unregisterProducer   s	    r   c                <    V P                   P                  V4       R # r   )rv   append)r   chunks   &&r   writeFilePager.write   s    5!r   c                    V P                   '       g   R# V P                   P                  ^ 4      pV P                  P                  4        V P                  P                  RVRR7       R# )z4
Get the first chunk read and send it to collector.
Nr]   FrW   )rv   popr   r   rP   r   rp   s   & r   r_   FilePager.sendNextPage   sK     {{{kkooa %%'!!)S5!Ar   )rv   r   r   r   )r   r   r   r   r5   r   rw   r   r   r   r_   r   r   r    s   @r   rt   rt      s/      
;,
"B Br   rt   c                   6   a  ] tR t^t o RtR tR tR tRtV t	R# )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                     . V n         Wn        R # r   )pagesrL   )r   rL   s   &&r   r   CallbackPageCollector.__init__   s    
 r   c                <    V P                   P                  V4       R # r   )r   r   )r   pages   &&r   remote_gotPage$CallbackPageCollector.remote_gotPage   s    

$r   c                <    V P                  V P                  4       R # r   rL   r   rY   s   &r   remote_endedPaging(CallbackPageCollector.remote_endedPaging   s    djj!r   r   N)
r   r   r   r   r5   r   r   r   r   r   r    s   @r   r   r      s     ! " "r   r   c                    \         P                  ! 4       pV P                  ! V\        VP                  4      .VO5/ VB  V# )zf
A utility method that will call a remote method which expects a
PageCollector as the first argument.
)r   Deferredr   r   rL   )referenceable
methodNamer   r   ds   &&*, r   getAllPagesr      s:    
 	AZ)>qzz)JXTXUWXHr   N)r5   zope.interfacer   twisted.internetr   r   twisted.protocolsr   twisted.python.failurer   twisted.spreadr   r	   r#   r7   rI   rg   	IConsumerrt   Referenceabler   r   r4   r   r   <module>r      s    ' . # * = =' '@' '4. .b% & Z!!"!B !B #!BJ"B,, "$r   