o b@sdZddlmZddlmZmZddlmZddlm Z ddl m Z GdddZ Gd d d Z Gd d d ZGd ddZGdddeZeejGdddeZGddde jZddZdS)z Utility classes for spread. ) implementer)defer interfaces)basic)Failure)pbc@seZdZddZddZdS) LocalMethodcCs||_||_dSN)localname)selfr r r 5/usr/lib/python3/dist-packages/twisted/spread/util.py__init__ zLocalMethod.__init__cOs|jj|jg|Ri|Sr )r callRemoter )r argskwr r r__call__szLocalMethod.__call__N)__name__ __module__ __qualname__rrr r r rrs rc@s$eZdZdZdZddZddZdS) LocalAsRemotezN A class useful for emulating the effects of remote behavior locally. cOs|t|d|rt|d||i|Szt|d|}t||i|WSty=t}|jr6|t|YSw)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_) hasattrgetattrrsucceed BaseExceptionrreportAllTracebacksprintTracebackfail)r r rrmethodfr r rr#s  zLocalAsRemote.callRemotecCs t||Sr )r)r r r r r remoteMethod8 zLocalAsRemote.remoteMethodN)rrr__doc__r rr%r r r rrs  rc@s*eZdZdZd ddZddZddZd S) LocalAsyncForwarderzD A class useful for forwarding a locally-defined interface. rcCs$||sJ||_||_||_dSr ) providedBy forwardedinterfaceClassfailWhenNotImplemented)r r*r+r,r r rrAs zLocalAsyncForwarder.__init__cOst|j||i|Sr )rr*)r r#rrr r r _callMethodGszLocalAsyncForwarder._callMethodcOsP|j|rtj|j|g|Ri|}|S|jr#tttd|St dS)NzNo Such Method in Interface: %s) r+queryDescriptionForr maybeDeferredr-r,r"rNotImplementedErrorr)r r#rrresultr r rrJs   zLocalAsyncForwarder.callRemoteN)r)rrrr'rr-rr r r rr(<s   r(c@s:eZdZdZd ddZddZddZd d Zd d ZdS)Pagerz5 I am an object which pages out information. NcOs>t|r||_||_||_nd|_d|_||_|j|dS)z Create a pager with a Reference to a remote collector and an optional callable to invoke upon completion. Nr)callablecallback callbackArgscallbackKeyword _stillPaging collectorbrokerregisterPageProducer)r r8r4rrr r rr[szPager.__init__cCs:|js|jjddd|jdur|j|ji|j|jS)5 (internal) Method called by Broker. endedPagingFpbanswerN)r7r8rr4r5r6r r r r stillPagingjs  zPager.stillPagingcCs|jjd|dddS)r;gotPageFr=N)r8rnextPager?r r r sendNextPagetszPager.sendNextPagecCst)zO Override this to return an object to be sent to my collector. )r0r?r r rrBzszPager.nextPagecCs d|_dS)z4 Call this when you're done paging. rN)r7r?r r r stopPagings zPager.stopPagingr ) rrrr'rr@rCrBrDr r r rr2Vs   r2c@s"eZdZdZdddZddZdS) StringPagerz: A simple pager that splits a string into chunks. NcOs2||_d|_||_tj|||g|Ri|dS)Nr)stringpointer chunkSizer2r)r r8strIr4rrr r rrs zStringPager.__init__cCsD|j|j|j|j}|j|j7_|jt|jkr ||Sr )rGrHrIlenrDr valr r rrBs zStringPager.nextPage)rFN)rrrr'rrBr r r rrEs  rEc@sBeZdZdZdddZddZddZd d Zd d Zd dZ dS) FilePagerzC Reads a file in chunks and sends the chunks as they come. NcOs0g|_tj|||g|Ri|||dSr )chunksr2rstartProducing)r r8fdr4rrr r rrszFilePager.__init__cs*t|_jfdddS)NcsSr )rD)xr?r rsz*FilePager.startProducing..)r FileSenderbeginFileTransferdeferredaddBoth)r rQr r?rrPszFilePager.startProducingcCs||_|s |jdSdSr )producerresumeProducing)r rX streamingr r rregisterProducerszFilePager.registerProducercCs d|_dSr )rXr?r r runregisterProducerr&zFilePager.unregisterProducercC|j|dSr )rOappend)r chunkr r rwritezFilePager.writecCs6|jsdS|jd}|j|jjd|dddS)zD Get the first chunk read and send it to collector. NrrAFr=)rOpoprXrYr8rrLr r rrCs   zFilePager.sendNextPager ) rrrr'rrPr[r\r`rCr r r rrNs  rNc@s(eZdZdZddZddZddZdS) 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. cCsg|_||_dSr )pagesr4)r r4r r rrrzCallbackPageCollector.__init__cCr]r )rdr^)r pager r rremote_gotPageraz$CallbackPageCollector.remote_gotPagecCs||jdSr )r4rdr?r r rremote_endedPagingraz(CallbackPageCollector.remote_endedPagingN)rrrr'rrfrgr r r rrcs  rccOs,t}|j|t|jg|Ri||S)zr A utility method that will call a remote method which expects a PageCollector as the first argument. )rDeferredrrcr4) referenceable methodNamerrdr r r getAllPagess rlN)r'zope.interfacertwisted.internetrrtwisted.protocolsrtwisted.python.failurertwisted.spreadrrrr(r2rE IConsumerrN Referenceablercrlr r r rs      1%