o
    >h(T                     @  sX  d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZmZmZmZmZmZ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"m#Z# ddl$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z, e-dZ.zddl/m0Z1 W n e2y   dZ0Y nw e1Z0zddl
m3Z4 W n e2y   dZ3Y nw e4Z3e&dkZ5dZ6e5rddl
m7Z7m8Z8 dZ6e%9 rzddl:Z:dZ6W n e2y   dZ:Y nw G dd dZ;e	eeeG dd de;eZ<G dd dZ=e	eG dd de=e;Z>e0duse3duree<e e5ree<ee e6ree<e e?edddur'ee<e dgZ@dS )z
Posix reactor base class
    )annotationsN)Sequence)classImplementsimplementer)errortcpudp)ReactorBase)
IConnectorIHalfCloseableDescriptorIReactorFDSetIReactorMulticastIReactorProcessIReactorSocketIReactorSSLIReactorTCPIReactorUDPIReactorUNIXIReactorUNIXDatagram)CONNECTION_DONECONNECTION_LOST)ClientFactory)failurelog)platformplatformType   )SignalHandling_ChildSignalHandling_IWaker_MultiSignalHandling_WakerzFile descriptor lost)tls)sslposixF)processunixTc                   @  s<   e Zd ZdZejee ejee ifddZ	dS )_DisconnectSelectableMixinz>
    Mixin providing the C{_disconnectSelectable} method.
    c                 C  sx   |  | ||j}|r-|r!|jtjkr!t|r!|| dS | | |	| dS | | |	t
| dS )z
        Utility function for disconnecting a selectable.

        Supports half-close notification, isRead should be boolean indicating
        whether error resulted from doRead().
        N)removeReaderget	__class__r   ConnectionDoner   
providedByreadConnectionLostremoveWriterconnectionLostr   Failure)self
selectablewhyisReadfaildictf r7   z/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/internet/posixbase.py_disconnectSelectableU   s   


z0_DisconnectSelectableMixin._disconnectSelectableN)
__name__
__module____qualname____doc__r   r+   r   r0   ConnectionLostr9   r7   r7   r7   r8   r'   P   s    
r'   c                      s  e Zd ZU dZdZd@ddZdd ZdA fd
dZdi dddddfddZdBddZ		dCddZ
dDddZdEddZdFddZ	dGd d!ZerTejejejfZd"ed#< nejejfZd$d% Zd&d' Z	dHd(d)ZdId*d+Z	,	dJdKd8d9Z	dLd:d;ZdId<d=Zd>d? Z  ZS )MPosixReactorBasez
    A basis for reactors that use file descriptors.

    @ivar _childWaker: L{None} or a reference to the L{_SIGCHLDWaker}
        which is used to properly notice child process termination.
    Nreturnr   c                 C  s   t  S N)r!   r1   r7   r7   r8   _wakerFactory   s   zPosixReactorBase._wakerFactoryc                 C  s2   | j s|  | _ | j| j  | | j  dS dS )z
        Install a `waker' to allow threads and signals to wake up the IO thread.

        We use the self-pipe trick (http://cr.yp.to/docs/selfpipe.html) to wake
        the reactor. On Windows we use a pair of sockets.
        N)wakerrC   _internalReadersadd	addReaderrB   r7   r7   r8   installWaker   s
   
zPosixReactorBase.installWakerr   c                   s,   t   }tdkrt|t| j| jfS |S )zj
        Customize reactor signal handling to support child processes on POSIX
        platforms.
        r$   )super_signalsFactoryr   r    r   _addInternalReader_removeInternalReader)r1   baseHandlingr*   r7   r8   rJ      s   
z PosixReactorBase._signalsFactoryr7   r   c
                 C  s   t dkr(|r|	d urtdt| ||||||||	S t| ||||||||		S t dkr]|d ur4td|d ur<td|rBtd|	rHtdtrYdd	lm}
 |
| |||||S td
td)Nr$   z1Using childFDs is not supported with usePTY=True.win32z,Setting UID is unsupported on this platform.z,Setting GID is unsupported on this platform.z1The usePTY parameter is not supported on Windows.z1Customizing childFDs is not supported on Windows.r   )Processz:spawnProcess not available since pywin32 is not installed.z0spawnProcess only available on Windows or POSIX.)r   
ValueErrorr%   
PTYProcessrP   win32processtwisted.internet._dumbwin32procNotImplementedError)r1   processProtocol
executableargsenvpathuidgidusePTYchildFDsrP   r7   r7   r8   spawnProcess   sL   zPosixReactorBase.spawnProcess     c                 C     t ||||| }|  |S )zConnects a given L{DatagramProtocol} to the given numeric UDP port.

        @returns: object conforming to L{IListeningPort}.
        )r   PortstartListening)r1   portprotocol	interfacemaxPacketSizepr7   r7   r8   	listenUDP   s   zPosixReactorBase.listenUDPFc                 C  s    t ||||| |}|  |S )zConnects a given DatagramProtocol to the given numeric UDP port.

        EXPERIMENTAL.

        @returns: object conforming to IListeningPort.
        )r   MulticastPortrd   )r1   re   rf   rg   rh   listenMultipleri   r7   r7   r8   listenMulticast   s
   	z PosixReactorBase.listenMulticast   c                 C  s*   t sJ dt|||| |}|  |S NUNIX support is not present)unixEnabledr&   	Connectorconnect)r1   addressfactorytimeoutcheckPIDcr7   r7   r8   connectUNIX  s   zPosixReactorBase.connectUNIX2     c                 C  s,   t sJ dt||||| |}|  |S ro   )rq   r&   rc   rd   )r1   rt   ru   backlogmodewantPIDri   r7   r7   r8   
listenUNIX  s   zPosixReactorBase.listenUNIXc                 C  s*   t sJ dt||||| }|  |S )z
        Connects a given L{DatagramProtocol} to the given path.

        EXPERIMENTAL.

        @returns: object conforming to L{IListeningPort}.
        rp   )rq   r&   DatagramPortrd   )r1   rt   rf   rh   r}   ri   r7   r7   r8   listenUNIXDatagram  s   z#PosixReactorBase.listenUNIXDatagramc                 C  s,   t sJ dt|||||| }|  |S )zd
        Connects a L{ConnectedDatagramProtocol} instance to a path.

        EXPERIMENTAL.
        rp   )rq   r&   ConnectedDatagramPortrd   )r1   rt   rf   rh   r}   bindAddressri   r7   r7   r8   connectUNIXDatagram  s   z$PosixReactorBase.connectUNIXDatagramzSequence[socket.AddressFamily]_supportedAddressFamiliesc                 C  sR   || j vr
t|tr|tjkrtj| ||}n	t	j| |||}|
  |S )a0  
        Create a new L{IListeningPort} from an already-initialized socket.

        This just dispatches to a suitable port implementation (eg from
        L{IReactorTCP}, etc) based on the specified C{addressFamily}.

        @see: L{twisted.internet.interfaces.IReactorSocket.adoptStreamPort}
        )r   r   UnsupportedAddressFamilyrq   socketAF_UNIXr&   rc   _fromListeningDescriptorr   rd   )r1   fileDescriptoraddressFamilyru   ri   r7   r7   r8   adoptStreamPort:  s   
	
z PosixReactorBase.adoptStreamPortc                 C  sD   || j vr
t|tr|tjkrtj||| S t	j|||| S )zg
        @see:
            L{twisted.internet.interfaces.IReactorSocket.adoptStreamConnection}
        )
r   r   r   rq   r   r   r&   Server_fromConnectedSocketr   )r1   r   r   ru   r7   r7   r8   adoptStreamConnectionO  s   

z&PosixReactorBase.adoptStreamConnectionc                 C  s<   |t jt jfvrt|tjj| ||||d}|  |S )N)rh   )	r   AF_INETAF_INET6r   r   r   rc   r   rd   )r1   r   r   rf   rh   ri   r7   r7   r8   adoptDatagramPort^  s   

z"PosixReactorBase.adoptDatagramPortc                 C  rb   rA   )r   rc   rd   )r1   re   ru   r|   rg   ri   r7   r7   r8   	listenTCPl  s   zPosixReactorBase.listenTCP      >@hoststrre   intru   'ClientFactory'rv   floatr   tuple[str, int] | Noner
   c                 C  s    t |||||| }|  |S rA   )r   rr   rs   )r1   r   re   ru   rv   r   rx   r7   r7   r8   
connectTCPq  s   zPosixReactorBase.connectTCPc           	   	   C  sZ   t d urt |d|}| |||||S td ur)t||||||| }|  |S J d)NTFSSL support is not present)r"   TLSMemoryBIOFactoryr   r#   rr   rs   )	r1   r   re   ru   contextFactoryrv   r   
tlsFactoryrx   r7   r7   r8   
connectSSL  s   zPosixReactorBase.connectSSLc                 C  s`   t d urt |d|}| ||||}d|_|S td ur,t|||||| }|  |S J d)NFTLSr   )r"   r   r   _typer#   rc   rd   )r1   re   ru   r   r|   rg   r   ri   r7   r7   r8   	listenSSL  s   zPosixReactorBase.listenSSLc                 C  sJ   t || j }|D ]}| | q	t |}|D ]}| | qt||B S )ag  
        Remove all readers and writers, and list of removed L{IReadDescriptor}s
        and L{IWriteDescriptor}s.

        Meant for calling from subclasses, to implement removeAll, like::

          def removeAll(self):
              return self._removeAll(self._reads, self._writes)

        where C{self._reads} and C{self._writes} are iterables.
        )setrE   r(   r.   list)r1   readerswritersremovedReadersreaderremovedWriterswriterr7   r7   r8   
_removeAll  s   zPosixReactorBase._removeAll)r@   r   )r@   r   )r`   ra   )r`   ra   F)rn   r   )rz   r{   r   )ra   r{   )ra   r{   N)ra   )rz   r`   )r   N)r   r   re   r   ru   r   rv   r   r   r   r@   r
   )rn   N)r:   r;   r<   r=   _childWakerrC   rH   rJ   r_   rj   rm   ry   r   r   r   rq   r   r   r   r   r   __annotations__r   r   r   r   r   r   r   r   __classcell__r7   r7   rN   r8   r?   v   sT   
 


:









r?   c                   @  s   e Zd ZdZdd ZdS )_PollLikeMixina  
    Mixin for poll-like reactors.

    Subclasses must define the following attributes::

      - _POLL_DISCONNECTED - Bitmask for events indicating a connection was
        lost.
      - _POLL_IN - Bitmask for events indicating there is input to read.
      - _POLL_OUT - Bitmask for events indicating output can be written.

    Must be mixed in to a subclass of PosixReactorBase (for
    _disconnectSelectable).
    c                 C  s   d}d}|| j @ r|| j@ s|| jv rd}t}n:t}n7z#| dkr%t}n|| j@ r0| }d}|s=|| j@ r=|	 }d}W n t
yQ   t d }t  Y nw |r]| ||| dS dS )zg
        fd is available for read or write, do the work and raise errors if
        necessary.
        NFTr   )_POLL_DISCONNECTED_POLL_IN_readsr   r   fileno_NO_FILEDESCdoRead	_POLL_OUTdoWriteBaseExceptionsysexc_infor   errr9   )r1   r2   fdeventr3   inReadr7   r7   r8   _doReadOrWrite  s0   

z_PollLikeMixin._doReadOrWriteN)r:   r;   r<   r=   r   r7   r7   r7   r8   r     s    r   c                   @  s|   e Zd ZdZd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 Zdd Zdd ZdS )_ContinuousPollinga  
    Schedule reads and writes based on the passage of time, rather than
    notification.

    This is useful for supporting polling filesystem files, which C{epoll(7)}
    does not support.

    The implementation uses L{_PollLikeMixin}, which is a bit hacky, but
    re-implementing and testing the relevant code yet again is unappealing.

    @ivar _reactor: The L{EPollReactor} that is using this instance.

    @ivar _loop: A C{LoopingCall} that drives the polling, or L{None}.

    @ivar _readers: A C{set} of C{FileDescriptor} objects that should be read
        from.

    @ivar _writers: A C{set} of C{FileDescriptor} objects that should be
        written to.
    r         c                 C  s    || _ d | _t | _t | _d S rA   )_reactor_loopr   _readers_writers)r1   reactorr7   r7   r8   __init__  s   z_ContinuousPolling.__init__c                 C  sr   | j s| jr*| jdu r(ddlm}m} || j| _| j| j_| jj	|dd dS dS | jr7| j
  d| _dS dS )zh
        Start or stop a C{LoopingCall} based on whether there are readers and
        writers.
        Nr   )_EPSILONLoopingCallF)now)r   r   r   twisted.internet.taskr   r   iterater   clockstartstop)r1   r   r   r7   r7   r8   
_checkLoop  s   



z_ContinuousPolling._checkLoopc                 C  sD   t | jD ]
}| ||| j qt | jD ]
}| ||| j qdS )zX
        Call C{doRead} and C{doWrite} on all readers and writers respectively.
        N)r   r   r   r   r   r   )r1   r   r   r7   r7   r8   r   /  s
   z_ContinuousPolling.iteratec                 C     | j | |   dS )zU
        Add a C{FileDescriptor} for notification of data available to read.
        N)r   rF   r   r1   r   r7   r7   r8   rG   8     z_ContinuousPolling.addReaderc                 C  r   )zV
        Add a C{FileDescriptor} for notification of data available to write.
        N)r   rF   r   r1   r   r7   r7   r8   	addWriter?  r   z_ContinuousPolling.addWriterc                 C  2   z| j | W n
 ty   Y dS w |   dS )zY
        Remove a C{FileDescriptor} from notification of data available to read.
        N)r   removeKeyErrorr   r   r7   r7   r8   r(   F  s   z_ContinuousPolling.removeReaderc                 C  r   )zb
        Remove a C{FileDescriptor} from notification of data available to
        write.
        N)r   r   r   r   r   r7   r7   r8   r.   P  s   z_ContinuousPolling.removeWriterc                 C  s(   t | j| jB }| j  | j  |S )z1
        Remove all readers and writers.
        )r   r   r   clear)r1   resultr7   r7   r8   	removeAll[  s   

z_ContinuousPolling.removeAllc                 C  
   t | jS )z/
        Return a list of the readers.
        )r   r   rB   r7   r7   r8   
getReadersf     
z_ContinuousPolling.getReadersc                 C  r   )z/
        Return a list of the writers.
        )r   r   rB   r7   r7   r8   
getWritersl  r   z_ContinuousPolling.getWritersc                 C  
   || j v S )aj  
        Checks if the file descriptor is currently being observed for read
        readiness.

        @param fd: The file descriptor being checked.
        @type fd: L{twisted.internet.abstract.FileDescriptor}
        @return: C{True} if the file descriptor is being observed for read
            readiness, C{False} otherwise.
        @rtype: C{bool}
        )r   r1   r   r7   r7   r8   	isReadingr     
z_ContinuousPolling.isReadingc                 C  r   )al  
        Checks if the file descriptor is currently being observed for write
        readiness.

        @param fd: The file descriptor being checked.
        @type fd: L{twisted.internet.abstract.FileDescriptor}
        @return: C{True} if the file descriptor is being observed for write
            readiness, C{False} otherwise.
        @rtype: C{bool}
        )r   r   r7   r7   r8   	isWriting  r   z_ContinuousPolling.isWritingN)r:   r;   r<   r=   r   r   r   r   r   r   rG   r   r(   r.   r   r   r   r   r   r7   r7   r7   r8   r     s"    	
r   fromfd)Ar=   
__future__r   r   r   typingr   zope.interfacer   r   twisted.internetr   r   r   twisted.internet.baser	   twisted.internet.interfacesr
   r   r   r   r   r   r   r   r   r   r   twisted.internet.mainr   r   twisted.internet.protocolr   twisted.pythonr   r   twisted.python.runtimer   r   _signalsr   r   r   r    r!   ConnectionFdescWentAwayr   twisted.protocolsr"   _tlsImportErrorr#   _sslrq   processEnabledr%   r&   	isWindowsrS   r'   r?   r   r   getattr__all__r7   r7   r7   r8   <module>   sr   4
	
&  =I 



