
    Vh!                         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    M/home/dcms/DCMS/lib/python3.12/site-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!    ??""..0DO #r   c                 `    | j                   "| j                   j                          d | _         y y r#   )r   cancelr   s    r   r*   z_PollingTimer._stopPolling7   s(    ??&OO""$"DO '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AJK'(
--3JK'(
)"..0DO 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.EdiiQR.S+V"$--diidKD##D)  ((<(!!'*LLN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MM((* %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,?,?+0DMM(MM))+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]]<  {{""$$DM%.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     #dC. 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`     dC CDDT"s3&'*::OO ;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   }}!!((*'##DNNC> mm==$$Q'DG
)2)<)<T^^TSW)X&  =0t9},MM((D,@A
 % mm &&(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 ?1J     ]0) 0 0f   YC* C Cr   