U
    n5{i %  ã                   @   s`  U d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZmZ zddlmZ W n< ek
ræ   dZdZ eeej! df e"d< e #d¡ Y nX eZej!fZ dZ$dZ%e&dƒ\Z'Z(e )d¡Z*e )d¡Z+eej,ej-ej.ej/fe žŽ G dd„ de
j0eƒƒZ1dd„ Z2ddgZ3dS )z'
Reactor that uses IO completion ports
é    N)ÚTupleÚType)Úimplementer)ÚbaseÚerrorÚ
interfacesÚmain)ÚProcess)ÚiocpsupportÚtcpÚudp)ÚWAIT_TIMEOUT)Ú_ThreadedWin32EventsMixin)ÚfailureÚlog)ÚTLSMemoryBIOFactory© .Ú_extraInterfacesz|pyOpenSSL 0.10 or newer is required for SSL support in iocpreactor. It is missing, so the reactor will not support SSL APIs.iÐ  éè  é   z#Handler has no getFileHandle methodzFiledescriptor went awayc                   @   sâ   e Zd 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ejejejdœdd„Zd.dd„Zd/dd„Zedk	r–d0dd„Zd1dd„Znd2d d„Zd3d!d„Zd4d#d$„Zd5d&d'„Zd(i dddd)dfd*d+„Zd,d-„ ZdS )6ÚIOCPReactorNc                 C   s"   t j | ¡ t ¡ | _tƒ | _d S ©N)r   ÚReactorBaseÚ__init__Ú_iocpZCompletionPortÚportÚsetÚhandles©Úselfr   r   úH/tmp/pip-unpacked-wheel-mnhg7r0q/twisted/internet/iocpreactor/reactor.pyr   <   s    
zIOCPReactor.__init__c                 C   s   | j  |¡ d S r   )r   Úadd©r   Úhandler   r   r    ÚaddActiveHandleA   s    zIOCPReactor.addActiveHandlec                 C   s   | j  |¡ d S r   )r   Údiscardr"   r   r   r    ÚremoveActiveHandleD   s    zIOCPReactor.removeActiveHandlec                 C   s˜   d}|dkrt }ntt td| ƒƒ}| j |¡\}}}}|tkrBq”|tkrt|tksVt‚t	 
|j| j|||¡ |d7 }|tkr~q”| j d¡\}}}}q8dS )z=
        Poll the IO completion port for new events.
        r   Nr   é   )ÚMAX_TIMEOUTÚminÚintr   ZgetEventr   Ú
KEY_WAKEUPÚ
KEY_NORMALÚAssertionErrorr   ZcallWithLoggerÚownerÚ_callEventCallbackÚEVENTS_PER_LOOP)r   ÚtimeoutZprocessed_eventsÚrcÚnumBytesÚkeyÚevtr   r   r    ÚdoIterationG   s(        ÿzIOCPReactor.doIterationc                 C   sŒ   |j }d }z@| |||¡ t|dd ƒ}|s0t}n|ƒ dkr>t}|rHW d S W n( tk
rr   t ¡ d }t 	¡  Y nX |rˆ| 
t |¡¡ d S )NZgetFileHandleéÿÿÿÿr'   )r.   ÚcallbackÚgetattrÚ_NO_GETHANDLEÚ_NO_FILEDESCÚBaseExceptionÚsysÚexc_infor   ÚerrZloseConnectionr   ZFailure)r   r2   r3   r5   r.   ÚwhyZhandfnr   r   r    r/   s   s     

zIOCPReactor._callEventCallbackc                 C   s   d S r   r   r   r   r   r    ÚinstallWaker…   s    zIOCPReactor.installWakerc                 C   s   | j  dtd ¡ d S )Nr   )r   Z	postEventr+   r   r   r   r    ÚwakeUpˆ   s    zIOCPReactor.wakeUpc                 C   s   | j  |t¡ d S r   )r   Z	addHandler,   r"   r   r   r    ÚregisterHandle‹   s    zIOCPReactor.registerHandle)ÚafÚstypeÚreturnc                 C   s   t   ||¡}|  | ¡ ¡ |S r   )ÚsocketrC   Úfileno)r   rD   rE   Zsktr   r   r    ÚcreateSocketŽ   s    zIOCPReactor.createSocketé2   Ú c                 C   s   t  ||||| ¡}| ¡  |S )zI
        @see: twisted.internet.interfaces.IReactorTCP.listenTCP
        )r   ÚPortÚstartListening)r   r   ÚfactoryÚbacklogÚ	interfaceÚpr   r   r    Ú	listenTCP•   s    zIOCPReactor.listenTCPé   c                 C   s    t  |||||| ¡}| ¡  |S )zJ
        @see: twisted.internet.interfaces.IReactorTCP.connectTCP
        )r   Z	ConnectorÚconnect)r   Úhostr   rN   r1   ÚbindAddressÚcr   r   r    Ú
connectTCP�   s    zIOCPReactor.connectTCPc                 C   s"   |   |t|d|ƒ||¡}d|_|S )zQ
            @see: twisted.internet.interfaces.IReactorSSL.listenSSL
            FZTLS)rR   r   Ú_type©r   r   rN   ÚcontextFactoryrO   rP   r   r   r    Ú	listenSSL§   s    
üzIOCPReactor.listenSSLc                 C   s   |   ||t|d|ƒ||¡S )zR
            @see: twisted.internet.interfaces.IReactorSSL.connectSSL
            T)rX   r   ©r   rU   r   rN   r[   r1   rV   r   r   r    Ú
connectSSL´   s    
ûzIOCPReactor.connectSSLc                 C   s   t dƒ‚dS )z¿
            Non-implementation of L{IReactorSSL.listenSSL}.  Some dependency
            is not satisfied.  This implementation always raises
            L{NotImplementedError}.
            ú|pyOpenSSL 0.10 or newer is required for SSL support in iocpreactor. It is missing, so the reactor does not support SSL APIs.N©ÚNotImplementedErrorrZ   r   r   r    r\   Ä   s    ÿc                 C   s   t dƒ‚dS )zÀ
            Non-implementation of L{IReactorSSL.connectSSL}.  Some dependency
            is not satisfied.  This implementation always raises
            L{NotImplementedError}.
            r_   Nr`   r]   r   r   r    r^   Ð   s    ÿé    c                 C   s   t  ||||| ¡}| ¡  |S )z�
        Connects a given L{DatagramProtocol} to the given numeric UDP port.

        @returns: object conforming to L{IListeningPort}.
        )r   rL   rM   )r   r   ÚprotocolrP   ÚmaxPacketSizerQ   r   r   r    Ú	listenUDPÞ   s    zIOCPReactor.listenUDPFc                 C   s    t  ||||| |¡}| ¡  |S )z¡
        Connects a given DatagramProtocol to the given numeric UDP port.

        EXPERIMENTAL.

        @returns: object conforming to IListeningPort.
        )r   ZMulticastPortrM   )r   r   rc   rP   rd   ZlistenMultiplerQ   r   r   r    ÚlistenMulticastè   s    
     ÿzIOCPReactor.listenMulticastr   r   c
           
      C   sN   |dk	rt dƒ‚|dk	r t dƒ‚|r,t dƒ‚|	dk	r<t dƒ‚t| |||||ƒS )z"
        Spawn a process.
        Nz,Setting UID is unsupported on this platform.z,Setting GID is unsupported on this platform.z&PTYs are unsupported on this platform.zGCustom child file descriptor mappings are unsupported on this platform.)Ú
ValueErrorr	   )
r   ZprocessProtocolÚ
executableÚargsÚenvÚpathÚuidÚgidZusePTYZchildFDsr   r   r    ÚspawnProcessø   s    ÿzIOCPReactor.spawnProcessc                 C   s   t | jƒ}| j ¡  |S r   )Úlistr   Úclear)r   Úresr   r   r    Ú	removeAll  s    

zIOCPReactor.removeAll)rJ   rK   )rS   N)rJ   rK   )rS   N)rJ   rK   )rS   N)rK   rb   )rK   rb   F)Ú__name__Ú
__module__Ú__qualname__r   r   r$   r&   r6   r/   rA   rB   rC   rG   ÚAddressFamilyÚ
SocketKindrI   rR   rX   r   r\   r^   re   rf   rn   rr   r   r   r   r    r   2   sL   , þ


   ÿ
   ÿ

     ÿ
ö
r   c                  C   s   t ƒ } t | ¡ d S r   )r   r   ZinstallReactor)Úrr   r   r    Úinstall  s    ry   )4Ú__doc__rG   r=   ÚwarningsÚtypingr   r   Zzope.interfacer   Ztwisted.internetr   r   r   r   Ztwisted.internet._dumbwin32procr	   Ztwisted.internet.iocpreactorr
   r   r   r   Z"twisted.internet.iocpreactor.constr   Z"twisted.internet.win32eventreactorr   Ztwisted.pythonr   r   Ztwisted.protocols.tlsr   Z_TLSMemoryBIOFactoryÚImportErrorr   ZIReactorSSLÚ__annotations__Úwarnr(   r0   Úranger,   r+   ZConnectionFdescWentAwayr:   r;   ZIReactorTCPZIReactorUDPZIReactorMulticastZIReactorProcessr   r   ry   Ú__all__r   r   r   r    Ú<module>   sL   ÿ


üû b