Ϫf!dZddlmZddlmZmZdZdZGddZGdd Z dd l Z dd l Z dd l Z dd l Z eeGd d eZd ZeeGddeZy )z Implements a simple polling interface for file descriptors that don't work with select() - this is pretty much only useful on Windows. ) implementer) IConsumer IPushProducerg& .>g?ceZdZdZdZdZy)_PollableResourceTcd|_yNTactiveselfs ?/usr/lib/python3/dist-packages/twisted/internet/_pollingfile.pyactivatez_PollableResource.activates  cd|_yNFr r s r deactivatez_PollableResource.deactivates  rN)__name__ __module__ __qualname__r rrrrrrs FrrcBeZdZdZdZdZdZdZdZdZ dZ d Z y ) _PollingTimercR||_g|_d|_t|_d|_yr)reactor _resources _pollTimer MAX_TIMEOUT_currentTimeout_paused)r rs r__init__z_PollingTimer.__init__ s& * rcZ|jj||jyN)rappend_checkPollingState)r ress r_addPollableResourcez"_PollingTimer._addPollableResource's  s# !rc|jD] }|js|jy|jyr#)rr _startPolling _stopPolling)r resources rr%z _PollingTimer._checkPollingState+s9 H""$    rcH|j|j|_yyr#)r _rescheduler s rr)z_PollingTimer._startPolling3s! ?? ""..0DO #rc`|j"|jjd|_yyr#)rcancelr s rr*z_PollingTimer._stopPolling7s( ?? & OO " " $"DO 'rcd|_yr )r r s r_pausez_PollingTimer._pause<s  rc2d|_|jyr)r r%r s r_unpausez_PollingTimer._unpause?s  !rc||js0|jj|j|jSyr#)r r callLaterr _pollEventr s rr-z_PollingTimer._rescheduleCs/||<<))$*>*>P Prcd}g}|jD]@}|js||jz }|js0|j|B|j}|r"|j|dzz }|t kr%t }n|jdz}|t kDrt }||_|r|j|_yy)Ngg?g@) rr checkWorkr$r MIN_TIMEOUTrr-r)r workUnits anyActiver+ newTimeouts rr6z_PollingTimer._pollEventGs   /HX//11 ??$$X.  /)) --SAJK'( --3JK'( ) "..0DO rN) rrrr!r'r%r)r*r1r3r-r6rrrrrs0" 1# "Q1rrNc6eZdZdZdZdZdZdZdZdZ y) _PollableReadPipec.||_||_||_yr#)pipereceivedCallback lostCallback)r r@rArBs rr!z_PollableReadPipe.__init__js 0(rcd}g} tj|jd\}}}|sn6tj|j|d\}}|j |^dj|}|r|j||r|jt|S#t j$rd}YXwxYw)Nrr) win32pipe PeekNamedPiper@ win32fileReadFiler$win32apierrorjoinrAcleanuplen) r finished fullDataReadbuffer bytesToReadresulthrdatadataBufs rr8z_PollableReadPipe.checkWorkps  .7.E.EdiiQR.S+ V"$--diidKD##D)((<(   ! !' *  LLN7|>>  s&B%5B%%B=<B=cD|j|jyr#)rrBr s rrLz_PollableReadPipe.cleanups  rcv tj|jy#tj$rYywxYwr#)rI CloseHandler@ pywintypesrJr s rclosez_PollableReadPipe.closes1    +   s "88c$|jyr#)rZr s r stopProducingz_PollableReadPipe.stopProducings  rc$|jyr#)rr s rpauseProducingz _PollableReadPipe.pauseProducings  rc$|jyr#)rr s rresumeProducingz!_PollableReadPipe.resumeProducings  rN) rrrr!r8rLrZr\r^r`rrrr>r>hs%) .rr>icHeZdZdZdZdZdZdZdZdZ dZ d Z d Z y ) _PollableWritePipecd|_d|_d|_d|_g|_||_||_ tj|tjddy#tj$rYywxYw)NFr) disconnectingproducerproducerPausedstreamingProduceroutQueue writePiperBrESetNamedPipeHandleState PIPE_NOWAITrYrJ)r rirBs rr!z_PollableWritePipe.__init__ss" #!" "(   - -900$    s&AA0/A0cd|_yr )rdr s rrZz_PollableWritePipe.closes !rc`|j"d|_|jjyyr )rerfr^r s r bufferFullz_PollableWritePipe.bufferFulls) == $"&D  MM ( ( * %rc|jD|jr |jr,d|j_|jjyy)NFT)rergrfr`r s r bufferEmptyz_PollableWritePipe.bufferEmptys? == $''D,?,?+0DMM ( MM ) ) +rc|jtd|d|jd|js|jy||_||_|s|j yy)awRegister to receive data from a producer. This sets this selectable to be a consumer for a producer. When this selectable runs out of data on a write() call, it will ask the producer to resumeProducing(). A producer should implement the IProducer interface. FileDescriptor provides some infrastructure for producer methods. NzCannot register producer z, because producer z was never unregistered.)re RuntimeErrorr r\rgr`)r re streamings rregisterProducerz#_PollableWritePipe.registerProducersa == $#+T]]< {{  " " $$DM%.D "((*rcd|_y)z;Stop consuming data from a producer, without disconnecting.N)rer s runregisterProducerz%_PollableWritePipe.unregisterProducers  rc|j tj|j|j y#tj $rY&wxYwr#)rrIrXrirYrJrBr s rwriteConnectionLostz&_PollableWritePipe.writeConnectionLostsK     0    sAAAc|ttt|vr td|jj |y)z Append a C{list} or C{tuple} of bytes to the output buffer. @param seq: C{list} or C{tuple} of C{str} instances to be appended to the output buffer. @raise TypeError: If C{seq} contains C{unicode}. %Unicode not allowed in output buffer.N)strmaptype TypeErrorrhextend)r seqs r writeSequencez _PollableWritePipe.writeSequences0 #dC. CD D S!rct|tr td|jry|jj |t tt|jtkDr|jyy)z Append some bytes to the output buffer. @param data: C{str} to be appended to the output buffer. @type data: C{str}. @raise TypeError: If C{data} is C{unicode} instead of C{str}. rzN) isinstancer{r~rdrhr$sumr|rMFULL_BUFFER_SIZErn)r rTs rwritez_PollableWritePipe.writes` dC CD D     T" s3 & '*: : OO  ;rcd}|js?|jr|jy tj|j dd|jr|jjd}d} tj|j |d\}}||z }t||kDr"|jjd||d |S|jr|j}|s|jr|j|S#t j$r|j|cYSwxYw#tj$r|jY|SwxYw)Nrr) rhrdrxrG WriteFilerirYrJpoprMinsertrIrp)r numBytesWrittenrTerrCode nBytesWrittenresumeds rr8z_PollableWritePipe.checkWorksN}}!!((* '##DNNC>mm==$$Q'DG )2)<)> ((* s#!D8$D9%D65D69#E E N) rrrr!rZrnrprtrvrxrrr8rrrrbrbs4 "+ +. ""rrb)__doc__zope.interfacertwisted.internet.interfacesrrr9rrrrYrIrGrEr>rrbrrrrs  '@  ?1?1J ]0)00f YC*CCr