U
     T‚g÷!  ã                   @   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   s
   d| _ d S ©NT©Úactive©Úself© r   úA/tmp/pip-unpacked-wheel-1_7di8ic/twisted/internet/_pollingfile.pyÚactivate   s    z_PollableResource.activatec                 C   s
   d| _ d S ©NFr   r	   r   r   r   Ú
deactivate   s    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|  ¡   q&q|  ¡  d S r   )r   r   Ú_startPollingÚ_stopPolling)r
   Úresourcer   r   r   r   +   s
    
z _PollingTimer._checkPollingStatec                 C   s   | j d kr|  ¡ | _ d S r   )r   Ú_rescheduler	   r   r   r   r    3   s    
z_PollingTimer._startPollingc                 C   s   | j d k	r| j  ¡  d | _ d S r   )r   Úcancelr	   r   r   r   r!   7   s    

z_PollingTimer._stopPollingc                 C   s
   d| _ d S r   )r   r	   r   r   r   Ú_pause<   s    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   Z	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 rrt}n| jd }|tkrrt}|| _|r†|  ¡ | _d S )Ng        g      ð?g       @)	r   r   Ú	checkWorkr   r   ÚMIN_TIMEOUTr   r#   r   )r
   Z	workUnitsZ	anyActiver"   Z
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
   r+   r,   r-   r   r   r   r   j   s    z_PollableReadPipe.__init__c           	      C   s”   d}g }z>t  | jd¡\}}}|s&W qht | j|d ¡\}}| |¡ W q tjk
rd   d}Y qhY qX qd |¡}|r€|  	|¡ |rŒ|  
¡  t|ƒS )Nr   é   ó    )Ú	win32pipeZPeekNamedPiper+   Ú	win32fileZReadFiler   Úwin32apiÚerrorÚjoinr,   ÚcleanupÚlen)	r
   ÚfinishedZfullDataReadÚbufferÚbytesToReadÚresultÚhrÚdataZdataBufr   r   r   r(   p   s"    

z_PollableReadPipe.checkWorkc                 C   s   |   ¡  |  ¡  d S r   )r   r-   r	   r   r   r   r5   ‡   s    z_PollableReadPipe.cleanupc                 C   s,   zt  | j¡ W n tjk
r&   Y nX d S r   )r2   ÚCloseHandler+   Ú
pywintypesr3   r	   r   r   r   Úclose‹   s    z_PollableReadPipe.closec                 C   s   |   ¡  d S r   )r?   r	   r   r   r   ÚstopProducing’   s    z_PollableReadPipe.stopProducingc                 C   s   |   ¡  d S r   )r   r	   r   r   r   ÚpauseProducing•   s    z _PollableReadPipe.pauseProducingc                 C   s   |   ¡  d S r   )r   r	   r   r   r   ÚresumeProducing˜   s    z!_PollableReadPipe.resumeProducingN)
r   r   r   r   r(   r5   r?   r@   rA   rB   r   r   r   r   r*   h   s   r*   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   s\   d| _ d | _d| _d| _g | _|| _|| _zt |tj	d d ¡ W n t
jk
rV   Y nX d S )NFr   )ÚdisconnectingÚproducerÚproducerPausedÚstreamingProducerÚoutQueueÚ	writePiper-   r0   ZSetNamedPipeHandleStateZPIPE_NOWAITr>   r3   )r
   rI   r-   r   r   r   r   ¡   s        ÿz_PollableWritePipe.__init__c                 C   s
   d| _ d S r   )rD   r	   r   r   r   r?   ±   s    z_PollableWritePipe.closec                 C   s   | j d k	rd| _| j  ¡  d S r   )rE   rF   rA   r	   r   r   r   Ú
bufferFull´   s    
z_PollableWritePipe.bufferFullc                 C   s0   | j d k	r,| jr| jr,d| j _| j  ¡  dS dS )NFT)rE   rG   rF   rB   r	   r   r   r   ÚbufferEmpty¹   s    
ÿÿ
z_PollableWritePipe.bufferEmptyc                 C   sH   | j dk	rtd|| j f ƒ‚| js,| ¡  n|| _ || _|sD| ¡  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.)rE   ÚRuntimeErrorr   r@   rG   rB   )r
   rE   Z	streamingr   r   r   ÚregisterProducerÄ   s    

ÿÿ
z#_PollableWritePipe.registerProducerc                 C   s
   d| _ dS )z;Stop consuming data from a producer, without disconnecting.N)rE   r	   r   r   r   ÚunregisterProducerÛ   s    z%_PollableWritePipe.unregisterProducerc                 C   s<   |   ¡  zt | j¡ W n tjk
r.   Y nX |  ¡  d S r   )r   r2   r=   rI   r>   r3   r-   r	   r   r   r   ÚwriteConnectionLostß   s    z&_PollableWritePipe.writeConnectionLostc                 C   s&   t tt|ƒk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
   Úseqr   r   r   ÚwriteSequenceè   s    	z _PollableWritePipe.writeSequencec                 C   sH   t |tƒrtdƒ‚| jrdS | j |¡ ttt| jƒƒt	krD|  
¡  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}.
        rP   N)Ú
isinstancerQ   rT   rD   rH   r   ÚsumrR   r6   ÚFULL_BUFFER_SIZErJ   )r
   r<   r   r   r   Úwriteõ   s    	
z_PollableWritePipe.writec                 C   sò   d}| j sT| jr|  ¡  dS zt | jdd ¡ W n" tjk
rR   |  ¡  | Y S X | j rÔ| j  d¡}d}zt | j|d ¡\}}W n" t	jk
r¤   |  ¡  Y qîY qTX ||7 }t
|ƒ|krT| j  d||d … ¡ qîqT|  ¡ }|sî| jrî|  ¡  |S )Nr   r/   )rH   rD   rO   r1   Z	WriteFilerI   r>   r3   Úpopr2   r6   ÚinsertrK   )r
   ZnumBytesWrittenr<   ZerrCodeZnBytesWrittenZresumedr   r   r   r(     s4    


z_PollableWritePipe.checkWorkN)r   r   r   r   r?   rJ   rK   rM   rN   rO   rW   r[   r(   r   r   r   r   rC   Ÿ   s   	rC   )Ú__doc__Zzope.interfacer   Ztwisted.internet.interfacesr   r   r)   r   r   r   r>   r2   r1   r0   r*   rZ   rC   r   r   r   r   Ú<module>   s   
E3