
    \d                     B   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dS )z
Utility classes for spread.
    )implementer)defer
interfaces)basic)Failure)pbc                       e Zd Zd Zd ZdS )LocalMethodc                 "    || _         || _        d S N)localname)selfr   r   s      3lib/python3.11/site-packages/twisted/spread/util.py__init__zLocalMethod.__init__   s    
			    c                 8     | j         j        | j        g|R i |S r   )r   
callRemoter   )r   argskws      r   __call__zLocalMethod.__call__   s)    $tz$TY<<<<<<<r   N)__name__
__module____qualname__r   r    r   r   r
   r
      s2          = = = = =r   r
   c                   "    e Zd ZdZdZd Zd ZdS )LocalAsRemotezN
    A class useful for emulating the effects of remote behavior locally.
       c                 P   t          | d|z             r t          | d|z             |i |S 	 t          | d|z             }t          j         ||i |          S # t          $ r@ t                      }| j        r|                                 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(( 	>074400$="===	!T8d?33F=!4!4!45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      sD          ! ! !*' ' ' ' 'r   r   c                   &    e Zd ZdZddZd Zd ZdS )LocalAsyncForwarderzD
    A class useful for forwarding a locally-defined interface.
    r   c                 ^    |                     |          sJ || _        || _        || _        d S r   )
providedBy	forwardedinterfaceClassfailWhenNotImplemented)r   r2   r3   r4   s       r   r   zLocalAsyncForwarder.__init__A   s9    ((33333",&<###r   c                 8     t          | j        |          |i |S r   )r#   r2   )r   r)   r   r   s       r   _callMethodzLocalAsyncForwarder._callMethodG   s#    .wt~v..;;;;r   c                     | j                             |          rt          j        | j        |g|R 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   s    226:: 	'()96ODOOOBOOFM( 	':+-NQW-WXX   =&&&r   N)r   )r   r   r   r-   r   r6   r   r   r   r   r/   r/   <   sP         = = = =< < <	' 	' 	' 	' 	'r   r/   c                   2    e Zd ZdZddZd Zd Zd Zd ZdS )	Pagerz5
    I am an object which pages out information.
    Nc                     t          |          r|| _        || _        || _        nd| _        d| _        || _        |j                            |            dS )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__[   sa    
 H 	!$DM $D#%D   DM"--d33333r   c                     | j         s:| 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       	JN%%me%DDD}(t0ID4HIII  r   c                 d    | j                             d|                                 d           dS )rH   gotPageFrJ   N)rD   r   nextPagerL   s    r   sendNextPagezPager.sendNextPaget   s/     	!!)T]]__u!MMMM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| _         dS )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   sq         4 4 4 4! ! !N N N$ $ $    r   r=   c                        e Zd ZdZddZd ZdS )StringPagerz:
    A simple pager that splits a string into chunks.
        Nc                 ^    || _         d| _        || _        t          j        | ||g|R i | d S )Nr   )stringpointer	chunkSizer=   r   )r   rD   str[   r@   r   r   s          r   r   zStringPager.__init__   sA    "tY>4>>>2>>>>>r   c                     | j         | j        | j        | j        z            }| xj        | j        z  c_        | j        t          | j                   k    r|                                  |S r   )rY   rZ   r[   lenrT   r   vals     r   rP   zStringPager.nextPage   s\    k$,)FFG&<3t{++++OO
r   )rW   N)r   r   r   r-   r   rP   r   r   r   rV   rV      sA         ? ? ? ?    r   rV   c                   8    e Zd ZdZd	dZd Zd Zd Zd Zd Z	dS )
	FilePagerzC
    Reads a file in chunks and sends the chunks as they come.
    Nc                 l    g | _         t          j        | ||g|R i | |                     |           d S r   )chunksr=   r   startProducing)r   rD   fdr@   r   r   s         r   r   zFilePager.__init__   sG    tY>4>>>2>>>Br   c                      t          j                                        |            _         j                             fd           d S )Nc                 ,                                     S r   )rT   )xr   s    r   <lambda>z*FilePager.startProducing.<locals>.<lambda>   s    (9(9 r   )r   
FileSenderbeginFileTransferdeferredaddBoth)r   rf   s   ` r   re   zFilePager.startProducing   sI    (**<<RFF9999:::::r   c                 N    || _         |s| j                                          d S d S r   )producerresumeProducing)r   rp   	streamings      r   registerProducerzFilePager.registerProducer   s5      	,M))+++++	, 	,r   c                     d | _         d S r   )rp   rL   s    r   unregisterProducerzFilePager.unregisterProducer   s    r   c                 :    | j                             |           d S r   )rd   append)r   chunks     r   writezFilePager.write   s    5!!!!!r   c                     | j         sdS | j                             d          }| j                                         | j                            d|d           dS )zD
        Get the first chunk read and send it to collector.
        Nr   rO   FrJ   )rd   poprp   rq   rD   r   r_   s     r   rQ   zFilePager.sendNextPage   s]     { 	Fkooa  %%'''!!)S5!AAAAAr   r   )
r   r   r   r-   r   re   rs   ru   ry   rQ   r   r   r   rb   rb      s                
; ; ;, , ,
  " " "B B B B Br   rb   c                   $    e Zd ZdZd Zd Zd ZdS )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 | _         || _        d S r   )pagesr@   )r   r@   s     r   r   zCallbackPageCollector.__init__   s    
 r   c                 :    | j                             |           d S r   )r   rw   )r   pages     r   remote_gotPagez$CallbackPageCollector.remote_gotPage   s    
$r   c                 :    |                      | j                   d S r   )r@   r   rL   s    r   remote_endedPagingz(CallbackPageCollector.remote_endedPaging   s    dj!!!!!r   N)r   r   r   r-   r   r   r   r   r   r   r}   r}      sK         ! ! !     " " " " "r   r}   c                 t    t          j                    } | j        |t          |j                  g|R 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      sG    
 	AMZ)>qz)J)JXTXXXUWXXXHr   N)r-   zope.interfacer   twisted.internetr   r   twisted.protocolsr   twisted.python.failurer   twisted.spreadr   r
   r   r/   r=   rV   	IConsumerrb   Referenceabler}   r   r   r   r   <module>r      s    ' & & & & & . . . . . . . . # # # # # # * * * * * *      = = = = = = = =' ' ' ' ' ' ' '@' ' ' ' ' ' ' '4. . . . . . . .b    %   & Z!""!B !B !B !B !B !B !B #"!BJ" " " " "B, " " "$    r   