U
    W[#                     @   s@  d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlmZmZ ddlmZ ddl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d Y n
X 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j+ej,eZ-dd Z.ddgZ/dS )z'
Reactor that uses IO completion ports
    N)implementer)base
interfacesmainerror)logfailure)Process)_ThreadedWin32EventsMixin)iocpsupport)WAIT_TIMEOUT)tcpudp)TLSMemoryBIOFactory z|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k	rd/ddZd0ddZnd1ddZd2d dZd3d"d#Zd4d%d&Zd'i dddd(dfd)d*Zd+d, ZdS )5IOCPReactorNc                 C   s"   t j|  t | _t | _d S N)r   ReactorBase__init___iocpZCompletionPortportsethandlesselfr   r   F/usr/lib/python3/dist-packages/twisted/internet/iocpreactor/reactor.pyr   9   s    
zIOCPReactor.__init__c                 C   s   | j | d S r   )r   addr   Zhandler   r   r   addActiveHandle?   s    zIOCPReactor.addActiveHandlec                 C   s   | j | d S r   )r   discardr   r   r   r   removeActiveHandleC   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 d }t  Y nX |r|	t
| d S )NZgetFileHandler#   )r*   callbackgetattr_NO_GETHANDLE_NO_FILEDESCsysexc_infor   errZloseConnectionr   ZFailure)r   r.   r/   r1   r*   Z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.registerHandlec                 C   s   t  ||}| |  |S r   )socketr=   fileno)r   ZafstypeZsktr   r   r   createSocket   s    zIOCPReactor.createSocket2    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	ConnectorZconnect)r   hostr   rF   r-   bindAddresscr   r   r   
connectTCP   s    zIOCPReactor.connectTCPc                 C   s"   |  |t|d|||}d|_|S )zQ
            @see: twisted.internet.interfaces.IReactorSSL.listenSSL
            FZTLS)rJ   r   Z_typer   r   rF   contextFactoryrG   rH   r   r   r   	listenSSL   s    
 zIOCPReactor.listenSSLc                 C   s   |  ||t|d|||S )zR
            @see: twisted.internet.interfaces.IReactorSSL.connectSSL
            T)rO   r   r   rL   r   rF   rQ   r-   rM   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NotImplementedErrorrP   r   r   r   rR      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}.
            rU   NrV   rS   r   r   r   rT      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   rD   rE   )r   r   protocolrH   maxPacketSizerI   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MulticastPortrE   )r   r   rY   rH   rZ   ZlistenMultiplerI   r   r   r   listenMulticast   s
    	zIOCPReactor.listenMulticastr   r   c
           
      C   s^   |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.)
ValueErrorZ_checkProcessArgsr	   )
r   ZprocessProtocol
executableargsenvpathZ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)rB   rC   )rK   N)rB   rC   )rK   N)rB   rC   )rK   N)rC   rX   )rC   rX   F)__name__
__module____qualname__r   r   r    r"   r2   r+   r;   r<   r=   rA   rJ   rO   r   rR   rT   r[   r\   rc   rg   r   r   r   r   r   0   s:   ,
	
	
	


  
    
r   c                  C   s   t  } t|  d S r   )r   r   ZinstallReactor)rr   r   r   install  s    rl   )0__doc__warningsr>   r8   Zzope.interfacer   Ztwisted.internetr   r   r   r   Ztwisted.pythonr   r   Ztwisted.internet._dumbwin32procr	   Z"twisted.internet.win32eventreactorr
   Ztwisted.internet.iocpreactorr   r   Z"twisted.internet.iocpreactor.constr   r   r   Ztwisted.protocols.tlsr   ImportErrorZ_extraInterfaceswarnZIReactorSSLr$   r,   ranger(   r'   ZConnectionFdescWentAwayr6   r7   ZIReactorTCPZIReactorUDPZIReactorMulticastZIReactorProcessZ_SignalReactorMixinr   r   rl   __all__r   r   r   r   <module>   sJ   


  Z