o
    bW"                     @   s   d Z ddlmZ ddlmZmZ dZdZG dd dZG dd	 d	Z	dd
l
Z
dd
lZdd
lZdd
lZeeG dd deZdZeeG d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                   @   s    e Zd ZdZdd Zdd ZdS )_PollableResourceTc                 C   
   d| _ d S NTactiveself r   ?/usr/lib/python3/dist-packages/twisted/internet/_pollingfile.pyactivate      
z_PollableResource.activatec                 C   r   NFr   r
   r   r   r   
deactivate   r   z_PollableResource.deactivateN)__name__
__module____qualname__r	   r   r   r   r   r   r   r      s    r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )_PollingTimerc                 C   s"   || _ g | _d | _t| _d| _d S r   )reactor
_resources
_pollTimerMAX_TIMEOUT_currentTimeout_paused)r   r   r   r   r   __init__    s
   
z_PollingTimer.__init__c                 C   s   | j | |   d S N)r   append_checkPollingState)r   resr   r   r   _addPollableResource'   s   z"_PollingTimer._addPollableResourcec                 C   s,   | j D ]}|jr|    d S q|   d S r   )r   r	   _startPolling_stopPolling)r   resourcer   r   r   r   +   s   
z _PollingTimer._checkPollingStatec                 C   s   | j d u r|  | _ d S d S r   )r   _rescheduler
   r   r   r   r"   3   s   
z_PollingTimer._startPollingc                 C   s"   | j d ur| j   d | _ d S d S r   )r   cancelr
   r   r   r   r#   7   s   


z_PollingTimer._stopPollingc                 C   r   r   )r   r
   r   r   r   _pause<   r   z_PollingTimer._pausec                 C   s   d| _ |   d S r   )r   r   r
   r   r   r   _unpause?   s   z_PollingTimer._unpausec                 C   s   | j s| j| j| jS d S r   )r   r   	callLaterr   
_pollEventr
   r   r   r   r%   C   s   z_PollingTimer._reschedulec                 C   s   d}g }| j D ]}|jr|| 7 }|jr|| q| j}|r.| j|d  }|tk r-t}n| jd }|tkr9t}|| _|rE|  | _d S d S )Ng        g      ?g       @)	r   r	   	checkWorkr   r   MIN_TIMEOUTr   r%   r   )r   	workUnits	anyActiver$   
newTimeoutr   r   r   r*   G   s*   


z_PollingTimer._pollEventN)r   r   r   r   r!   r   r"   r#   r'   r(   r%   r*   r   r   r   r   r      s    r   Nc                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )_PollableReadPipec                 C   s   || _ || _|| _d S r   )pipereceivedCallbacklostCallback)r   r1   r2   r3   r   r   r   r   j   s   
z_PollableReadPipe.__init__c           	      C   s   d}g }	 zt | jd\}}}|sW nt| j|d \}}|| W n tjy0   d}Y nw qd|}|r>| 	| |rD| 
  t|S )Nr          )	win32pipePeekNamedPiper1   	win32fileReadFiler   win32apierrorjoinr2   cleanuplen)	r   finishedfullDataReadbufferbytesToReadresulthrdatadataBufr   r   r   r+   p   s(   

z_PollableReadPipe.checkWorkc                 C   s   |    |   d S r   )r   r3   r
   r   r   r   r=      s   z_PollableReadPipe.cleanupc                 C   s*   z	t | j W d S  tjy   Y d S w r   )r:   CloseHandler1   
pywintypesr;   r
   r   r   r   close   s
   z_PollableReadPipe.closec                 C      |    d S r   )rI   r
   r   r   r   stopProducing      z_PollableReadPipe.stopProducingc                 C   rJ   r   )r   r
   r   r   r   pauseProducing   rL   z _PollableReadPipe.pauseProducingc                 C   rJ   r   )r   r
   r   r   r   resumeProducing   rL   z!_PollableReadPipe.resumeProducingN)
r   r   r   r   r+   r=   rI   rK   rM   rN   r   r   r   r   r0   h   s    r0   i   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )_PollableWritePipec                 C   sZ   d| _ d | _d| _d| _g | _|| _|| _zt|tj	d d  W d S  t
jy,   Y d S w )NFr   )disconnectingproducerproducerPausedstreamingProduceroutQueue	writePiper3   r6   SetNamedPipeHandleStatePIPE_NOWAITrH   r;   )r   rU   r3   r   r   r   r      s   

z_PollableWritePipe.__init__c                 C   r   r   )rP   r
   r   r   r   rI      r   z_PollableWritePipe.closec                 C   s"   | j d urd| _| j   d S d S r   )rQ   rR   rM   r
   r   r   r   
bufferFull   s   
z_PollableWritePipe.bufferFullc                 C   s0   | j d ur| jr| jrd| j _| j   dS dS )NFT)rQ   rS   rR   rN   r
   r   r   r   bufferEmpty   s   

z_PollableWritePipe.bufferEmptyc                 C   sN   | j durtd|| j f | 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.
        NzHCannot register producer %s, because producer %s was never unregistered.)rQ   RuntimeErrorr	   rK   rS   rN   )r   rQ   	streamingr   r   r   registerProducer   s   

z#_PollableWritePipe.registerProducerc                 C   s
   d| _ dS )z;Stop consuming data from a producer, without disconnecting.N)rQ   r
   r   r   r   unregisterProducer   s   
z%_PollableWritePipe.unregisterProducerc                 C   s:   |    zt| j W n
 tjy   Y nw |   d S r   )r   r:   rG   rU   rH   r;   r3   r
   r   r   r   writeConnectionLost   s   z&_PollableWritePipe.writeConnectionLostc                 C   s&   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	TypeErrorrT   extend)r   seqr   r   r   writeSequence   s   	z _PollableWritePipe.writeSequencec                 C   sL   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}.
        r_   N)
isinstancer`   rc   rP   rT   r   sumra   r>   FULL_BUFFER_SIZErX   )r   rE   r   r   r   write   s   
	z_PollableWritePipe.writec                 C   s   d}| j s)| jr|   dS z
t| jdd  W n tjy(   |   | Y S w | j rk| j d}d}zt| j|d \}}W n t	jyO   |   Y |S w ||7 }t
||krh| j d||d   	 |S | j s,|  }|sx| jrx|   |S )Nr   r5   )rT   rP   r^   r8   	WriteFilerU   rH   r;   popr:   r>   insertrY   )r   numBytesWrittenrE   errCodenBytesWrittenresumedr   r   r   r+     s>   
z_PollableWritePipe.checkWorkN)r   r   r   r   rI   rX   rY   r\   r]   r^   rf   rj   r+   r   r   r   r   rO      s    	rO   )__doc__zope.interfacer   twisted.internet.interfacesr   r   r,   r   r   r   rH   r:   r8   r6   r0   ri   rO   r   r   r   r   <module>   s    
E3