U
    
W[#  ã                   @   s¸   d Z ddlmZmZ ddlmZ ddlmZmZ ddl	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.
é    )Úabsolute_importÚdivision)Úimplementer)Ú	IConsumerÚIPushProducer)Úunicodeg•Ö&è.>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   ú?/usr/lib/python3/dist-packages/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    0   s
    
z _PollingTimer._checkPollingStatec                 C   s   | j d kr|  ¡ | _ d S r   )r   Ú_rescheduler   r   r   r   r#   8   s    
z_PollingTimer._startPollingc                 C   s   | j d k	r| j  ¡  d | _ d S r   )r   Zcancelr   r   r   r   r$   <   s    

z_PollingTimer._stopPollingc                 C   s
   d| _ d S r	   )r   r   r   r   r   Ú_pauseA   s    z_PollingTimer._pausec                 C   s   d| _ |  ¡  d S r   )r   r    r   r   r   r   Ú_unpauseD   s    z_PollingTimer._unpausec                 C   s   | j s| j | j| j¡S d S r   )r   r   Z	callLaterr   Ú
_pollEventr   r   r   r   r&   H   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)   L   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   o   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   ZfinishedZfullDataReadÚbufferZbytesToReadÚresultZhrÚdataZdataBufr   r   r   r*   u   s"    

z_PollableReadPipe.checkWorkc                 C   s   |   ¡  |  ¡  d S r   )r   r/   r   r   r   r   r7   Œ   s    z_PollableReadPipe.cleanupc                 C   s,   zt  | j¡ W n tjk
r&   Y nX d S r   )r4   ÚCloseHandler-   Ú
pywintypesr5   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*   r7   r>   r?   r@   rA   r   r   r   r   r,   l   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/   r2   ZSetNamedPipeHandleStateZPIPE_NOWAITr=   r5   )r   rH   r/   r   r   r   r   ¦   s    ýz_PollableWritePipe.__init__c                 C   s
   d| _ d S r	   )rC   r   r   r   r   r>   ·   s    z_PollableWritePipe.closec                 C   s   | j d k	rd| _| j  ¡  d S r	   )rD   rE   r@   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)rD   rF   rE   rA   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.)rD   ÚRuntimeErrorr   r?   rF   rA   )r   rD   Z	streamingr   r   r   ÚregisterProducerÉ   s    

ÿÿ
z#_PollableWritePipe.registerProducerc                 C   s
   d| _ dS )zDStop consuming data from a producer, without disconnecting.
        N)rD   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   r4   r<   rH   r=   r5   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)r   ÚmapÚtypeÚ	TypeErrorrG   Ú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}.
        rO   N)Ú
isinstancer   rR   rC   rG   r   ÚsumrP   r8   ÚFULL_BUFFER_SIZErI   )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   r1   )rG   rC   rN   r3   Z	WriteFilerH   r=   r5   Úpopr4   r8   ÚinsertrJ   )r   ZnumBytesWrittenr;   ZerrCodeZnBytesWrittenZresumedr   r   r   r*     s:    
 ÿ

z_PollableWritePipe.checkWorkN)r   r   r   r   r>   rI   rJ   rL   rM   rN   rU   rY   r*   r   r   r   r   rB   £   s   

rB   )Ú__doc__Z
__future__r   r   Zzope.interfacer   Ztwisted.internet.interfacesr   r   Ztwisted.python.compatr   r+   r   r   r   r2   r3   r4   r=   r,   rX   rB   r   r   r   r   Ú<module>   s"   E4