Ë
    oj÷!  ã                   óÐ   — d Z ddlmZ ddlmZmZ dZdZ G d„ d«      Z G d„ d	«      Z	dd
l
Z
dd
lZdd
lZdd
lZ ee«       G d„ de«      «       ZdZ ee«       G d„ de«      «       Zy
)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š™™™™™¹?c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú_PollableResourceTc                 ó   — d| _         y ©NT©Úactive©Úselfs    ú?/usr/lib/python3/dist-packages/twisted/internet/_pollingfile.pyÚactivatez_PollableResource.activate   s	   € Øˆ�ó    c                 ó   — d| _         y ©NFr
   r   s    r   Ú
deactivatez_PollableResource.deactivate   s	   € Øˆ�r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   © r   r   r   r      s   „ Ø€Fòór   r   c                   óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)Ú_PollingTimerc                 óR   — || _         g | _        d | _        t        | _        d| _        y r   )ÚreactorÚ
_resourcesÚ
_pollTimerÚMAX_TIMEOUTÚ_currentTimeoutÚ_paused)r   r   s     r   Ú__init__z_PollingTimer.__init__    s&   € ØˆŒØˆŒØˆŒÜ*ˆÔØˆ�r   c                 óZ   — | j                   j                  |«       | j                  «        y ©N)r   ÚappendÚ_checkPollingState)r   Úress     r   Ú_addPollableResourcez"_PollingTimer._addPollableResource'   s    € Ø�‰×Ñ˜sÔ#Ø×ÑÕ!r   c                 ó‚   — | j                   D ]   }|j                  sŒ| j                  «         y  | j                  «        y r#   )r   r   Ú_startPollingÚ_stopPolling)r   Úresources     r   r%   z _PollingTimer._checkPollingState+   s9   € ØŸ™ò 	 ˆHØ�‹Ø×"Ñ"Ô$Ùð	 ð
 ×ÑÕr   c                 óH   — | j                   €| j                  «       | _         y y r#   )r   Ú_rescheduler   s    r   r)   z_PollingTimer._startPolling3   s!   € Ø�?‰?Ð"Ø"×.Ñ.Ó0ˆD�Oð #r   c                 ó`   — | j                   �"| j                   j                  «        d | _         y y r#   )r   Úcancelr   s    r   r*   z_PollingTimer._stopPolling7   s(   € Ø�?‰?Ð&Ø�O‰O×"Ñ"Ô$Ø"ˆD�Oð 'r   c                 ó   — d| _         y r	   )r    r   s    r   Ú_pausez_PollingTimer._pause<   s	   € Øˆ�r   c                 ó2   — d| _         | j                  «        y r   )r    r%   r   s    r   Ú_unpausez_PollingTimer._unpause?   s   € ØˆŒØ×ÑÕ!r   c                 ó|   — | j                   s0| j                  j                  | j                  | j                  «      S y r#   )r    r   Ú	callLaterr   Ú
_pollEventr   s    r   r-   z_PollingTimer._rescheduleC   s/   € Ø�|Š|Ø—<‘<×)Ñ)¨$×*>Ñ*>ÀÇÁÓPÐPð r   c                 ó„  — d}g }| j                   D ]@  }|j                  sŒ||j                  «       z  }|j                  sŒ0|j                  |«       ŒB | j                  }|r"| j                  |dz   z  }|t
        k  r%t
        }n| j                  dz  }|t        kD  rt        }|| _        |r| j                  «       | _        y y )Ng        g      ð?g       @)	r   r   Ú	checkWorkr$   r   ÚMIN_TIMEOUTr   r-   r   )r   Ú	workUnitsÚ	anyActiver+   Ú
newTimeouts        r   r6   z_PollingTimer._pollEventG   s¼   € Øˆ	Øˆ	ØŸ™ò 	/ˆHØ�‹Ø˜X×/Ñ/Ó1Ñ1�	à—?“?Ø×$Ñ$ XÕ.ð	/ð ×)Ñ)ˆ
ÙØ×-Ñ-°¸S±ÑAˆJØœKÒ'Ü(‘
à×-Ñ-°Ñ3ˆJØœKÒ'Ü(�
Ø)ˆÔÙØ"×.Ñ.Ó0ˆD�Oð r   N)r   r   r   r!   r'   r%   r)   r*   r1   r3   r-   r6   r   r   r   r   r      s0   „ òò"ò ò1ò#ò
ò"òQó1r   r   Nc                   ó6   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	y)	Ú_PollableReadPipec                 ó.   — || _         || _        || _        y r#   )ÚpipeÚreceivedCallbackÚlostCallback)r   r@   rA   rB   s       r   r!   z_PollableReadPipe.__init__j   s   € àˆŒ	Ø 0ˆÔØ(ˆÕr   c                 ó€  — d}g }	 	 t        j                  | j                  d«      \  }}}|sn6t        j                  | j                  |d «      \  }}|j                  |«       Œ^dj                  |«      }|r| j                  |«       |r| j                  «        t        |«      S # t        j                  $ r d}Y ŒXw xY w)Nr   é   r   )Ú	win32pipeÚPeekNamedPiper@   Ú	win32fileÚReadFiler$   Úwin32apiÚerrorÚjoinrA   ÚcleanupÚlen)	r   ÚfinishedÚfullDataReadÚbufferÚbytesToReadÚresultÚhrÚdataÚdataBufs	            r   r8   z_PollableReadPipe.checkWorkp   s»   € ØˆØˆàð	Ü.7×.EÑ.EÀdÇiÁiÐQRÓ.SÑ+�˜ Vá"ØÜ$×-Ñ-¨d¯i©i¸ÀdÓK‘��DØ×#Ñ# DÔ)ð ð —(‘(˜<Ó(ˆÙØ×!Ñ! 'Ô*ÙØ�L‰LŒNÜ�7‹|Ðøô —>‘>ò Ø�Ùðús   ‡&B% ®5B% Â%B=Â<B=c                 óD   — | j                  «        | j                  «        y r#   )r   rB   r   s    r   rL   z_PollableReadPipe.cleanup‡   s   € Ø�‰ÔØ×ÑÕr   c                 óv   — 	 t        j                  | j                  «       y # t        j                  $ r Y y w xY wr#   )rI   ÚCloseHandler@   Ú
pywintypesrJ   r   s    r   Úclosez_PollableReadPipe.close‹   s1   € ð	Ü× Ñ  §¡Õ+øÜ×Ñò 	áð	ús   ‚" ¢8·8c                 ó$   — | j                  «        y r#   )rZ   r   s    r   ÚstopProducingz_PollableReadPipe.stopProducing’   s   € Ø�
‰
�r   c                 ó$   — | j                  «        y r#   )r   r   s    r   ÚpauseProducingz _PollableReadPipe.pauseProducing•   s   € Ø�‰Õr   c                 ó$   — | j                  «        y r#   )r   r   s    r   ÚresumeProducingz!_PollableReadPipe.resumeProducing˜   s   € Ø�‰�r   N)
r   r   r   r!   r8   rL   rZ   r\   r^   r`   r   r   r   r>   r>   h   s%   „ ò)òò.òòòór   r>   i   c                   óH   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)Ú_PollableWritePipec                 óæ   — d| _         d | _        d| _        d| _        g | _        || _        || _        	 t        j                  |t        j                  d d «       y # t        j                  $ r Y y w xY w)NFr   )ÚdisconnectingÚproducerÚproducerPausedÚstreamingProducerÚoutQueueÚ	writePiperB   rE   ÚSetNamedPipeHandleStateÚPIPE_NOWAITrY   rJ   )r   ri   rB   s      r   r!   z_PollableWritePipe.__init__¡   ss   € Ø"ˆÔØˆŒØ#ˆÔØ!"ˆÔØˆŒØ"ˆŒØ(ˆÔð	Ü×-Ñ-Øœ9×0Ñ0°$¸õøô ×Ñò 	áð	ús   ³&A ÁA0Á/A0c                 ó   — d| _         y r	   )rd   r   s    r   rZ   z_PollableWritePipe.close±   s
   € Ø!ˆÕr   c                 ó`   — | j                   �"d| _        | j                   j                  «        y y r	   )re   rf   r^   r   s    r   Ú
bufferFullz_PollableWritePipe.bufferFull´   s)   € Ø�=‰=Ð$Ø"&ˆDÔØ�M‰M×(Ñ(Õ*ð %r   c                 ó¤   — | j                   �D| j                  r| j                  r,d| j                   _        | j                   j                  «        yy)NFT)re   rg   rf   r`   r   s    r   ÚbufferEmptyz_PollableWritePipe.bufferEmpty¹   s?   € Ø�=‰=Ð$Ø×'Ò'¨D×,?Ò,?à+0ˆD�M‰MÔ(Ø�M‰M×)Ñ)Ô+ØØr   c                 óÐ   — | j                   �t        d|›d| j                   ›d�«      ‚| j                  s|j                  «        y|| _         || _        |s|j                  «        yy)aw  Register 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.
        NzCannot register producer z, because producer z was never unregistered.)re   ÚRuntimeErrorr   r\   rg   r`   )r   re   Ú	streamings      r   ÚregisterProducerz#_PollableWritePipe.registerProducerÄ   sa   € ð �=‰=Ð$Ýâ#+¨T¯]«]ð<óð ð �{Š{Ø×"Ñ"Õ$à$ˆDŒMØ%.ˆDÔ"ÙØ×(Ñ(Õ*ð r   c                 ó   — d| _         y)z;Stop consuming data from a producer, without disconnecting.N)re   r   s    r   ÚunregisterProducerz%_PollableWritePipe.unregisterProducerÛ   s	   € àˆ�r   c                 ó¶   — | j                  «        	 t        j                  | j                  «       | j                  «        y # t        j
                  $ r Y Œ&w xY wr#   )r   rI   rX   ri   rY   rJ   rB   r   s    r   ÚwriteConnectionLostz&_PollableWritePipe.writeConnectionLostß   sK   € Ø�‰Ôð	Ü× Ñ  §¡Ô0ð 	×ÑÕøô ×Ñò 	áð	ús   ’A ÁAÁAc                 ó|   — t         t        t        |«      v rt        d«      ‚| j                  j                  |«       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)ÚstrÚmapÚtypeÚ	TypeErrorrh   Úextend)r   Úseqs     r   ÚwriteSequencez _PollableWritePipe.writeSequenceè   s0   € ô ”#”d˜C“.Ñ ÜÐCÓDÐDØ�‰×Ñ˜SÕ!r   c                 ó   — t        |t        «      rt        d«      ‚| j                  ry| j                  j                  |«       t        t        t        | j                  «      «      t        kD  r| j                  «        yy)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}.
        rz   N)Ú
isinstancer{   r~   rd   rh   r$   Úsumr|   rM   ÚFULL_BUFFER_SIZErn   )r   rT   s     r   Úwritez_PollableWritePipe.writeõ   s`   € ô �dœCÔ ÜÐCÓDÐDØ×ÒØØ�‰×Ñ˜TÔ"ÜŒs”3˜Ÿ™Ó&Ó'Ô*:Ò:Ø�O‰OÕð ;r   c                 óÆ  — d}| j                   s?| j                  r| j                  «        y	 t        j                  | j
                  dd «       | j                   r„| j                   j                  d«      }d}	 t        j                  | j
                  |d «      \  }}||z  }t        |«      |kD  r"| j                   j                  d||d  «       	 |S | j                   rŒ„| j                  «       }|s| j                  r| j                  «        |S # t        j                  $ r | j                  «        |cY S w xY w# t        j                  $ r | j                  «        Y |S w xY w)Nr   r   )rh   rd   rx   rG   Ú	WriteFileri   rY   rJ   ÚpoprM   ÚinsertrI   rp   )r   ÚnumBytesWrittenrT   ÚerrCodeÚnBytesWrittenÚresumeds         r   r8   z_PollableWritePipe.checkWork  sN  € ØˆØ�}Š}Ø×!Ò!Ø×(Ñ(Ô*Øð'Ü×#Ñ# D§N¡N°C¸Ô>ð �mŠmØ—=‘=×$Ñ$ QÓ'ˆDØˆGð
Ü)2×)<Ñ)<¸T¿^¹^ÈTÐSWÓ)XÑ&�˜ð   =Ñ0�Ü�t“9˜}Ò,Ø—M‘M×(Ñ(¨¨D°°Ð,@ÔAØð
 Ðð% �m‹mð ×&Ñ&Ó(ˆGÙ˜t×1Ò1Ø×(Ñ(Ô*ØÐøô+ ×#Ñ#ò 'Ø×(Ñ(Ô*Ø&Ò&ð'ûô —>‘>ò Ø×(Ñ(Ô*Øð Ððús#   ­!D Á8$D9 Ä%D6Ä5D6Ä9#E ÅE N)r   r   r   r!   rZ   rn   rp   rt   rv   rx   r�   r†   r8   r   r   r   rb   rb   Ÿ   s4   „ òò "ò+ò
ò+ò.òò"òó"r   rb   )Ú__doc__Úzope.interfacer   Útwisted.internet.interfacesr   r   r9   r   r   r   rY   rI   rG   rE   r>   r…   rb   r   r   r   ú<module>r’      s�   ðñ
õ 'ç @à€Ø€÷ñ ÷?1ñ ?1óJ Û Û Û ñ ˆ]Óô0Ð)ó 0ó ð0ðf Ð ñ ˆYÓôCÐ*ó Có ñCr   