o
    ¯bÙ$  ã                   @   sd  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yr   dZdZ eeej! df e"d< e #d¡ Y nw 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/ge ¢R Ž G dd„ de
j0e
j1eƒƒZ2dd„ Z3ddgZ4d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dd„ Zd-dd„Zd.dd„ZedurDd-dd„Z	d.dd„Znd-dd„Z	d.d d„Zd/d"d#„Z	$d0d%d&„Zd'i dddd(dfd)d*„Zd+d,„ ZdS )1ÚIOCPReactorNc                 C   s"   t j | ¡ t ¡ | _tƒ | _d S ©N)r   ÚReactorBaseÚ__init__Ú_iocpÚCompletionPortÚportÚsetÚhandles©Úselfr   r   úF/usr/lib/python3/dist-packages/twisted/internet/iocpreactor/reactor.pyr   ?   s   
zIOCPReactor.__init__c                 C   ó   | j  |¡ d S r   )r   Úadd©r    Úhandler   r   r!   ÚaddActiveHandleD   ó   zIOCPReactor.addActiveHandlec                 C   r"   r   )r   Údiscardr$   r   r   r!   ÚremoveActiveHandleG   r'   zIOCPReactor.removeActiveHandlec                 C   sš   d}|du r	t }n	tt td| ƒƒ}| j |¡\}}}}	 |tkr#dS |tkr<|tks-J ‚t 	|j
| j|||¡ |d7 }|tkrBdS | j d¡\}}}}q)z=
        Poll the IO completion port for new events.
        r   Nr   é   )ÚMAX_TIMEOUTÚminÚintr   ÚgetEventr   Ú
KEY_WAKEUPÚ
KEY_NORMALr   ÚcallWithLoggerÚownerÚ_callEventCallbackÚEVENTS_PER_LOOP)r    ÚtimeoutÚprocessed_eventsÚrcÚnumBytesÚkeyÚevtr   r   r!   ÚdoIterationJ   s$   ÿõzIOCPReactor.doIterationc                 C   sŽ   |j }d }z | |||¡ t|dd ƒ}|st}n|ƒ dkrt}|r$W d S W n ty8   t ¡ d }t 	¡  Y nw |rE| 
t |¡¡ d S d S )NÚgetFileHandleéÿÿÿÿr*   )r2   ÚcallbackÚgetattrÚ_NO_GETHANDLEÚ_NO_FILEDESCÚBaseExceptionÚsysÚexc_infor   ÚerrÚloseConnectionr   ÚFailure)r    r7   r8   r:   r2   ÚwhyÚhandfnr   r   r!   r3   v   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   Ú	postEventr/   r   r   r   r!   ÚwakeUp‹   s   zIOCPReactor.wakeUpc                 C   s   | j  |t¡ d S r   )r   Ú	addHandler0   r$   r   r   r!   ÚregisterHandleŽ   s   zIOCPReactor.registerHandlec                 C   s   t   ||¡}|  | ¡ ¡ |S r   )ÚsocketrN   Úfileno)r    ÚafÚstypeÚsktr   r   r!   ÚcreateSocket‘   s   zIOCPReactor.createSocketé2   Ú c                 C   ó   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   Ú	ConnectorÚconnect)r    Úhostr   rZ   r5   ÚbindAddressÚcr   r   r!   Ú
connectTCPž   s   zIOCPReactor.connectTCPc                 C   s"   |   |t|d|ƒ||¡}d|_|S )zQ
            @see: twisted.internet.interfaces.IReactorSSL.listenSSL
            FÚTLS)r^   r   Ú_type©r    r   rZ   ÚcontextFactoryr[   r\   r   r   r!   Ú	listenSSL¨   s   
üzIOCPReactor.listenSSLc                 C   s   |   ||t|d|ƒ||¡S )zR
            @see: twisted.internet.interfaces.IReactorSSL.connectSSL
            T)re   r   ©r    rb   r   rZ   ri   r5   rc   r   r   r!   Ú
connectSSLµ   s   
ûzIOCPReactor.connectSSLc                 C   ó   t dƒ‚)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.©ÚNotImplementedErrorrh   r   r   r!   rj   Å   s   ÿc                 C   rm   )zÀ
            Non-implementation of L{IReactorSSL.connectSSL}.  Some dependency
            is not satisfied.  This implementation always raises
            L{NotImplementedError}.
            rn   ro   rk   r   r   r!   rl   Ñ   s   ÿé    c                 C   rW   )z�
        Connects a given L{DatagramProtocol} to the given numeric UDP port.

        @returns: object conforming to L{IListeningPort}.
        )r   rX   rY   )r    r   Úprotocolr\   ÚmaxPacketSizer]   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   ÚMulticastPortrY   )r    r   rr   r\   rs   ÚlistenMultipler]   r   r   r!   ÚlistenMulticasté   s
   
ÿzIOCPReactor.listenMulticastr   r   c
           
      C   sN   |durt dƒ‚|durt dƒ‚|rt dƒ‚|	du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    ÚprocessProtocolÚ
executableÚargsÚenvÚpathÚuidÚgidÚusePTYÚ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)rU   rV   )r_   N)rV   rq   )rV   rq   F)Ú__name__Ú
__module__Ú__qualname__r   r   r&   r)   r;   r3   rJ   rL   rN   rT   r^   re   r   rj   rl   rt   rw   r‚   r†   r   r   r   r!   r   2   s@    ,


ÿ

ÿ

ÿ
ör   c                  C   s   t ƒ } t | ¡ d S r   )r   r   ÚinstallReactor)Úrr   r   r!   Úinstall  s   rŒ   )5Ú__doc__rO   rC   ÚwarningsÚtypingr   r   Úzope.interfacer   Útwisted.internetr   r   r   r   Útwisted.internet._dumbwin32procr	   Útwisted.internet.iocpreactorr
   r   r   r   Ú"twisted.internet.iocpreactor.constr   Ú"twisted.internet.win32eventreactorr   Útwisted.pythonr   r   Útwisted.protocols.tlsr   Ú_TLSMemoryBIOFactoryÚImportErrorr   ÚIReactorSSLÚ__annotations__Úwarnr+   r4   Úranger0   r/   ÚConnectionFdescWentAwayr@   rA   ÚIReactorTCPÚIReactorUDPÚIReactorMulticastÚIReactorProcessÚ_SignalReactorMixinr   r   rŒ   Ú__all__r   r   r   r!   Ú<module>   sT   ÿû


üû

ÿ c