
    \dW"                        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d
S )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dS )_PollableResourceTc                     d| _         d S NTactiveselfs    =lib/python3.11/site-packages/twisted/internet/_pollingfile.pyactivatez_PollableResource.activate   s        c                     d| _         d S NFr
   r   s    r   
deactivatez_PollableResource.deactivate   s    r   N)__name__
__module____qualname__r   r   r    r   r   r   r      s7        F      r   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )_PollingTimerc                 V    || _         g | _        d | _        t          | _        d| _        d S r   )reactor
_resources
_pollTimerMAX_TIMEOUT_currentTimeout_paused)r   r   s     r   __init__z_PollingTimer.__init__    s*    *r   c                 b    | j                             |           |                                  d S N)r   append_checkPollingState)r   ress     r   _addPollableResourcez"_PollingTimer._addPollableResource'   s0    s###!!!!!r   c                 ~    | j         D ] }|j        r|                                   d S !|                                  d S r#   )r   r   _startPolling_stopPolling)r   resources     r   r%   z _PollingTimer._checkPollingState+   sU     	  	 H ""$$$ r   c                 J    | j         |                                 | _         d S d S r#   )r   _rescheduler   s    r   r)   z_PollingTimer._startPolling3   s)    ?""..00DOOO #"r   c                 X    | j         "| j                                          d | _         d S d S r#   )r   cancelr   s    r   r*   z_PollingTimer._stopPolling7   s1    ?&O""$$$"DOOO '&r   c                     d| _         d S r	   )r    r   s    r   _pausez_PollingTimer._pause<   s    r   c                 <    d| _         |                                  d S r   )r    r%   r   s    r   _unpausez_PollingTimer._unpause?   s!    !!!!!r   c                 ^    | j         s%| j                            | j        | j                  S d S r#   )r    r   	callLaterr   
_pollEventr   s    r   r-   z_PollingTimer._rescheduleC   s6    | 	Q<))$*>PPP	Q 	Qr   c                 h   d}g }| j         D ]<}|j        r3||                                z  }|j        r|                    |           =| j        }|r | j        |dz   z  }|t
          k     rt
          }n| j        dz  }|t          k    rt          }|| _        |r|                                 | _        d S d S )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1	? /$$X...)
 	)-SAJK''(
-3JK''(
) 	1"..00DOOO	1 	1r   N)r   r   r   r!   r'   r%   r)   r*   r1   r3   r-   r6   r   r   r   r   r      s          " " "     1 1 1# # #
  " " "Q Q Q1 1 1 1 1r   r   Nc                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	_PollableReadPipec                 0    || _         || _        || _        d S 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nLt          j        | j        |d           \  }}|                    |           n# t          j        $ r d}Y nw xY wnd                    |          }|r| 	                    |           |r| 
                                 t          |          S )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.EdiQR.S.S+V" $-didKKD##D))))>   
	 ((<(( 	+!!'*** 	LLNNN7||s    A 3A A0/A0c                 V    |                                   |                                  d S r#   )r   rB   r   s    r   rL   z_PollableReadPipe.cleanup   s*    r   c                 f    	 t          j        | j                   d S # t          j        $ r Y d S w xY wr#   )rI   CloseHandler@   
pywintypesrJ   r   s    r   closez_PollableReadPipe.close   sE    	 +++++ 	 	 	DD	s    00c                 .    |                                   d S r#   )rZ   r   s    r   stopProducingz_PollableReadPipe.stopProducing   s    

r   c                 .    |                                   d S r#   )r   r   s    r   pauseProducingz _PollableReadPipe.pauseProducing   s    r   c                 .    |                                   d S 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                   J    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 ZdS )_PollableWritePipec                     d| _         d | _        d| _        d| _        g | _        || _        || _        	 t          j        |t          j	        d d            d S # t          j        $ r Y d S 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__   s    "#!""(	-90$      	 	 	DD	s   !A A)(A)c                     d| _         d S r	   )rd   r   s    r   rZ   z_PollableWritePipe.close   s    !r   c                 X    | j         "d| _        | j                                          d S d S r	   )re   rf   r^   r   s    r   
bufferFullz_PollableWritePipe.bufferFull   s4    =$"&DM((***** %$r   c                 ~    | j         5| j        r| j        r'd| j         _        | j                                          dS dS )NFT)re   rg   rf   r`   r   s    r   bufferEmptyz_PollableWritePipe.bufferEmpty   sJ    =$' %,0,? % ,1DM(M))+++4ur   c                     | j         t          d|d| j         d          | j        s|                                 dS || _         || _        |s|                                 dS dS )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   s     =$,#+88T]]]<   { 	+""$$$$$$DM%.D" +((*****+ +r   c                     d| _         dS )z;Stop consuming data from a producer, without disconnecting.N)re   r   s    r   unregisterProducerz%_PollableWritePipe.unregisterProducer   s    r   c                     |                                   	 t          j        | j                   n# t          j        $ r Y nw xY w|                                  d S r#   )r   rI   rX   ri   rY   rJ   rB   r   s    r   writeConnectionLostz&_PollableWritePipe.writeConnectionLost   sj    	 0000 	 	 	D	 	s   0 AAc                     t           t          t          |          v rt          d          | j                            |           dS )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   sB     #dC..  CDDDS!!!!!r   c                     t          |t                    rt          d          | j        rdS | j                            |           t          t          t          | j                            t          k    r| 
                                 dS dS )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     dC   	ECDDD 	FT"""s3&&''*:::OO ;:r   c                    d}| j         se| j        r|                                  dS 	 t          j        | j        dd            n+# t          j        $ r |                                  |cY S w xY w| j         r| j                             d          }d}	 t          j        | j        |d           \  }}||z  }t          |          |k    r$| j         
                    d||d                     nbn)# t          j        $ r |                                  Y n<w xY w| j         |                                 }|s| j        r|                                  |S )Nr   r   )rh   rd   rx   rG   	WriteFileri   rY   rJ   poprM   insertrI   rp   )r   numBytesWrittenrT   errCodenBytesWrittenresumeds         r   r8   z_PollableWritePipe.checkWork  s   } 	'! ((***q'#DNC>>>># ' ' '((***&&&&' m 	+=$$Q''DG
)2)<T^TSW)X)X&  =0t99},,M((D,@AAA - >   ((*** m 	+ &&((G +t1 +((***s#   A %A,+A,C. .#DDN)r   r   r   r!   rZ   rn   rp   rt   rv   rx   r   r   r8   r   r   r   rb   rb      s           " " "+ + +
  + + +.    " " "  "    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      sf  
  ' & & & & & @ @ @ @ @ @ @ @       ?1 ?1 ?1 ?1 ?1 ?1 ?1 ?1J              ]0 0 0 0 0) 0 0 0f   YC C C C C* C C C C Cr   