a
    (ñ»jÈ>  ã                	   @  sd  U d dl mZ d dlZd dlmZmZ d dlmZmZ d dl	Z	ddl
mZ ddlmZmZ ddlmZmZ er†d d	lmZ dd
lmZ d dlZejdkr¦d dlmZ ner¶d dlmZ dZejejhZeddœdd„ƒZeG dd„ deƒƒZ g d¢Z!e"ƒ Z#de$d< e!D ]@Z%ee&ƒ�  e# 'e(ee%ƒ¡ W d  ƒ n1 �s:0    Y  �qeG dd„ dee  ƒƒZ)dS )é    )ÚannotationsN)ÚcontextmanagerÚsuppress)ÚTYPE_CHECKINGÚoverloadé   )Úsocket)ÚConflictDetectorÚfinal)ÚHalfCloseableStreamÚListener)Ú	Generator)Ú
SocketType)é   é   )ÚBufferi   zGenerator[None, None, None]©Úreturnc               
   c  s^   z
d V  W nN t yX }  z6| jtv r2t d¡d ‚nt d| › �¡| ‚W Y d } ~ n
d } ~ 0 0 d S )Nzthis socket was already closedzsocket connection broken: )ÚOSErrorÚerrnoÚ_closed_stream_errnosÚtrioÚClosedResourceErrorZBrokenResourceError)Úexc© r   ú<E:\soccer\ml_env\Lib\site-packages\trio/_highlevel_socket.pyÚ)_translate_socket_errors_to_stream_errors+   s    

r   c                   @  sú   e Zd ZdZdddœdd„Zdddœd	d
„Zddœdd„Zddœdd„Zd)dddœdd„Zddœdd„Z	e
dddddœdd„ƒZe
ddddddœdd„ƒZd*ddddddœd d„Ze
dddd!œd"d#„ƒZe
ddddd$œd%d#„ƒZd+dddd'd$œd(d#„ZdS ),ÚSocketStreamuf  An implementation of the :class:`trio.abc.HalfCloseableStream`
    interface based on a raw network socket.

    Args:
      socket: The Trio socket object to wrap. Must have type ``SOCK_STREAM``,
          and be connected.

    By default for TCP sockets, :class:`SocketStream` enables ``TCP_NODELAY``,
    and (on platforms where it's supported) enables ``TCP_NOTSENT_LOWAT`` with
    a reasonable buffer size (currently 16 KiB) â€“ see `issue #72
    <https://github.com/python-trio/trio/issues/72>`__ for discussion. You can
    of course override these defaults by calling :meth:`setsockopt`.

    Once a :class:`SocketStream` object is constructed, it implements the full
    :class:`trio.abc.HalfCloseableStream` interface. In addition, it provides
    a few extra features:

    .. attribute:: socket

       The Trio socket object that this stream wraps.

    r   ÚNone©r   r   c                 C  sº   t |tjƒstdƒ‚|jtjkr(tdƒ‚|| _tdƒ| _	t
tƒ�" |  tjtjd¡ W d   ƒ n1 sh0    Y  ttdƒr¶t
tƒ�" |  tjtjd¡ W d   ƒ n1 s¬0    Y  d S )Nz*SocketStream requires a Trio socket objectz*SocketStream requires a SOCK_STREAM socketz;another task is currently sending data on this SocketStreamTÚTCP_NOTSENT_LOWATi @  )Ú
isinstanceÚtsocketr   Ú	TypeErrorÚtypeÚSOCK_STREAMÚ
ValueErrorr   r	   Ú_send_conflict_detectorr   r   Ú
setsockoptÚIPPROTO_TCPÚTCP_NODELAYÚhasattrr    )Úselfr   r   r   r   Ú__init__O   s    ÿ
0


zSocketStream.__init__zbytes | bytearray | memoryview)Údatar   c                 Ã  s<  | j jrt d¡‚| j�� tƒ �ä t|ƒ�¼}|s‚| j  ¡ dkrJt d¡‚tj 	¡ I d H  W d   ƒ W d   ƒ W d   ƒ d S d}|t
|ƒk rÚ||d … �"}| j  |¡I d H }W d   ƒ n1 sÆ0    Y  ||7 }q†W d   ƒ n1 sî0    Y  W d   ƒ n1 �s0    Y  W d   ƒ n1 �s.0    Y  d S )Nz!can't send data after sending EOFéÿÿÿÿzsocket was already closedr   )r   Údid_shutdown_SHUT_WRr   r   r'   r   Ú
memoryviewÚfilenoÚlowlevelÚ
checkpointÚlenÚsend)r,   r.   Ú
total_sentÚ	remainingÚsentr   r   r   Úsend_allm   s    



(0zSocketStream.send_allr   c              	   Ã  st   | j �Z | j ¡ dkrtj‚tƒ �  | j ¡ I d H  W d   ƒ n1 sH0    Y  W d   ƒ n1 sf0    Y  d S )Nr/   )r'   r   r2   r   r   r   Zwait_writable©r,   r   r   r   Úwait_send_all_might_not_block~   s
    z*SocketStream.wait_send_all_might_not_blockc              	   Ã  s†   | j �l tj ¡ I d H  | jjr0W d   ƒ d S tƒ � | j tj	¡ W d   ƒ n1 sZ0    Y  W d   ƒ n1 sx0    Y  d S ©N)
r'   r   r3   r4   r   r0   r   Úshutdownr"   ÚSHUT_WRr;   r   r   r   Úsend_eof…   s    zSocketStream.send_eofNz
int | NoneÚbytes)Ú	max_bytesr   c                 Ã  sX   |d u rt }|dk rtdƒ‚tƒ �" | j |¡I d H W  d   ƒ S 1 sJ0    Y  d S )Nr   zmax_bytes must be >= 1)ÚDEFAULT_RECEIVE_SIZEr&   r   r   Úrecv)r,   rB   r   r   r   Úreceive_some�   s    zSocketStream.receive_somec                 Ã  s   | j  ¡  tj ¡ I d H  d S r=   ©r   Úcloser   r3   r4   r;   r   r   r   Úaclose—   s    
zSocketStream.acloseÚintzint | Buffer)ÚlevelÚoptionÚvaluer   c                 C  s   d S r=   r   )r,   rJ   rK   rL   r   r   r   r(   �   s    zSocketStream.setsockopt)rJ   rK   rL   Úlengthr   c                 C  s   d S r=   r   ©r,   rJ   rK   rL   rM   r   r   r   r(       s    zint | Buffer | Nonec                 C  sR   |du r(|du rt dƒ‚| j |||¡S |dur@t d|›d�ƒ‚| j ||||¡S )zlSet an option on the underlying socket.

        See :meth:`socket.socket.setsockopt` for details.

        NzKinvalid value for argument 'value', must not be None when specifying lengthz$invalid value for argument 'value': z%, must be None when specifying optlen)r#   r   r(   rN   r   r   r   r(   ¤   s    ÿ
ÿ)rJ   rK   r   c                 C  s   d S r=   r   )r,   rJ   rK   r   r   r   Ú
getsockopt¼   s    zSocketStream.getsockopt)rJ   rK   Ú
buffersizer   c                 C  s   d S r=   r   ©r,   rJ   rK   rP   r   r   r   rO   ¿   s    r   zint | bytesc                 C  s*   |dkr| j  ||¡S | j  |||¡S dS )zƒCheck the current value of an option on the underlying socket.

        See :meth:`socket.socket.getsockopt` for details.

        r   N)r   rO   rQ   r   r   r   rO   Â   s    	)N)N)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   r:   r<   r@   rE   rH   r   r(   rO   r   r   r   r   r   6   s$   
 ûr   )ZEPERMÚECONNABORTEDZEPROTOZENETDOWNÚENOPROTOOPTZ	EHOSTDOWNZENONETZEHOSTUNREACHÚ
EOPNOTSUPPZENETUNREACHZENOSRZESOCKTNOSUPPORTZEPROTONOSUPPORTZ	ETIMEDOUTÚ
ECONNRESETzset[int]Ú_ignorable_accept_errnosc                   @  s<   e Zd ZdZdddœdd„Zddœd	d
„Zddœdd„ZdS )ÚSocketListeneraâ  A :class:`~trio.abc.Listener` that uses a listening socket to accept
    incoming connections as :class:`SocketStream` objects.

    Args:
      socket: The Trio socket object to wrap. Must have type ``SOCK_STREAM``,
          and be listening.

    Note that the :class:`SocketListener` "takes ownership" of the given
    socket; closing the :class:`SocketListener` will also close the socket.

    .. attribute:: socket

       The Trio socket object that this stream wraps.

    r   r   r   c                 C  sf   t |tjƒstdƒ‚|jtjkr(tdƒ‚z| tjtj	¡}W n t
yN   Y n0 |s\tdƒ‚|| _d S )Nz,SocketListener requires a Trio socket objectz,SocketListener requires a SOCK_STREAM socketz*SocketListener requires a listening socket)r!   r"   r   r#   r$   r%   r&   rO   Ú
SOL_SOCKETÚSO_ACCEPTCONNr   r   )r,   r   Z	listeningr   r   r   r-   x  s    zSocketListener.__init__r   r   c              
   Ã  sj   z| j  ¡ I dH \}}W nB tyZ } z*|jtv r:tjd‚|jtvrF‚ W Y d}~q d}~0 0 t|ƒS q dS )a#  Accept an incoming connection.

        Returns:
          :class:`SocketStream`

        Raises:
          OSError: if the underlying call to ``accept`` raises an unexpected
              error.
          ClosedResourceError: if you already closed the socket.

        This method handles routine errors like ``ECONNABORTED``, but passes
        other errors on to its caller. In particular, it does *not* make any
        special effort to handle resource exhaustion errors like ``EMFILE``,
        ``ENFILE``, ``ENOBUFS``, ``ENOMEM``.

        N)	r   Úacceptr   r   r   r   r   rZ   r   )r,   ÚsockÚ_r   r   r   r   r^   ˆ  s    

zSocketListener.acceptc                 Ã  s   | j  ¡  tj ¡ I dH  dS )z.Close this listener and its underlying socket.NrF   r;   r   r   r   rH   ¤  s    
zSocketListener.acloseN)rR   rS   rT   rU   r-   r^   rH   r   r   r   r   r[   f  s   r[   )*Ú
__future__r   r   Ú
contextlibr   r   Útypingr   r   r   Ú r   r"   Z_utilr	   r
   Úabcr   r   Úcollections.abcr   Ú_socketr   ÚsysÚversion_infor   Ztyping_extensionsrC   ÚEBADFÚENOTSOCKr   r   r   Z_ignorable_accept_errno_namesÚsetrZ   Ú__annotations__ÚnameÚAttributeErrorÚaddÚgetattrr[   r   r   r   r   Ú<module>   s@   
ü
  
4