o
    Òó·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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ƒƒ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dejdejdejfdd„Zd0dd„Zd1dd„ZedurNd0dd„Z	d1d d!„Znd0d"d„Z	d1d#d!„Zd2d%d&„Z	'd3d(d)„Zd*i dddd+dfd,d-„Zd.d/„ ZdS )4ÚIOCPReactorNc                 C   s"   t j | ¡ t ¡ | _tƒ | _d S ©N)r   ÚReactorBaseÚ__init__Ú_iocpZCompletionPortÚportÚsetÚhandles©Úselfr   r   újC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/iocpreactor/reactor.pyr   <   s   
zIOCPReactor.__init__c                 C   ó   | j  |¡ d S r   )r   Úadd©r   Úhandler   r   r    ÚaddActiveHandleA   ó   zIOCPReactor.addActiveHandlec                 C   r!   r   )r   Údiscardr#   r   r   r    ÚremoveActiveHandleD   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   ZgetEventr   Ú
KEY_WAKEUPÚ
KEY_NORMALr   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 ƒ}|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 )NZgetFileHandleéÿÿÿÿr)   )r/   ÚcallbackÚgetattrÚ_NO_GETHANDLEÚ_NO_FILEDESCÚBaseExceptionÚsysÚexc_infor   ÚerrZloseConnectionr   ZFailure)r   r3   r4   r6   r/   ÚwhyZhandfnr   r   r    r0   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   )ÚsocketrD   Úfileno)r   rE   rF   Zsktr   r   r    ÚcreateSocketŽ   s   zIOCPReactor.createSocketé2   Ú c                 C   ó   t  ||||| ¡}| ¡  |S )zI
        @see: twisted.internet.interfaces.IReactorTCP.listenTCP
        N)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
        N)r   Z	ConnectorÚconnect)r   Úhostr   rP   r2   ÚbindAddressÚcr   r   r    Ú
connectTCP�   s   zIOCPReactor.connectTCPc                 C   s"   |   |t|d|ƒ||¡}d|_|S )zQ
            @see: twisted.internet.interfaces.IReactorSSL.listenSSL
            FZTLSN)rT   r   Ú_type©r   r   rP   ÚcontextFactoryrQ   rR   r   r   r    Ú	listenSSL§   s   
üzIOCPReactor.listenSSLc                 C   s   |   ||t|d|ƒ||¡S )zR
            @see: twisted.internet.interfaces.IReactorSSL.connectSSL
            TN)rZ   r   ©r   rW   r   rP   r]   r2   rX   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.N©ÚNotImplementedErrorr\   r   r   r    r^   Ä   s   ÿc                 C   ra   )zÀ
            Non-implementation of L{IReactorSSL.connectSSL}.  Some dependency
            is not satisfied.  This implementation always raises
            L{NotImplementedError}.
            rb   Nrc   r_   r   r   r    r`   Ð   s   ÿé    c                 C   rM   )z�
        Connects a given L{DatagramProtocol} to the given numeric UDP port.

        @returns: object conforming to L{IListeningPort}.
        N)r   rN   rO   )r   r   ÚprotocolrR   ÚmaxPacketSizerS   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.
        N)r   ZMulticastPortrO   )r   r   rf   rR   rg   ZlistenMultiplerS   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   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)rK   rL   )rU   N)rL   re   )rL   re   F)Ú__name__Ú
__module__Ú__qualname__r   r   r%   r(   r7   r0   rB   rC   rD   rH   ÚAddressFamilyÚ
SocketKindrJ   rT   rZ   r   r^   r`   rh   ri   rq   ru   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   r|   )4Ú__doc__rH   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*   r1   Úranger.   r-   ZConnectionFdescWentAwayr;   r<   ZIReactorTCPZIReactorUDPZIReactorMulticastZIReactorProcessr   r   r|   Ú__all__r   r   r   r    Ú<module>   sP   ÿû


üû b