
    i>                       % S SK Jr  S SKrS SKJrJr  S SKJrJr  S SK	r	SSK
Jr  SSKJrJr  SSKJrJr  \(       a  S S	KJr  SS
KJr  S SKr\R0                  S:  a  S SKJr  O\(       a  S SKJr  Sr\R8                  \R:                  1r\SS j5       r\ " S S\5      5       r / SQr!\"" 5       r#S\$S'   \! H,  r%\" \&5         \#RO                  \(" \\%5      5        SSS5        M.     \ " S S\\    5      5       r)g! , (       d  f       MS  = f)    )annotationsN)contextmanagersuppress)TYPE_CHECKINGoverload   socket)ConflictDetectorfinal)HalfCloseableStreamListener)	Generator)
SocketType)      )Bufferi   c               #     #     S v   g ! [          aJ  n U R                  [        ;   a  [        R                  " S5      S e[        R
                  " SU  35      U eS n A ff = f7f)Nzthis socket was already closedzsocket connection broken: )OSErrorerrno_closed_stream_errnostrioClosedResourceErrorBrokenResourceError)excs    CC:\des-py\RoboSAPF\venv\Lib\site-packages\trio/_highlevel_socket.py)_translate_socket_errors_to_stream_errorsr   +   s]     X X99--**+KLRVV**-Gu+MNTWW	Xs%   A 	 A 
AAAAA c                      \ rS rSrSrSS jrSS jrSS jrSS jrSSS jjr	SS	 jr
\SS
 j5       r\SS j5       r S         SS jjr\SS j5       r\SS j5       rSSS jjrSrg)SocketStream6   u*  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.

c                b   [        U[        R                  5      (       d  [        S5      eUR                  [        R
                  :w  a  [        S5      eXl        [        S5      U l	        [        [        5         U R                  [        R                  [        R                  S5        S S S 5        [        [        S5      (       aH  [        [        5         U R                  [        R                  [        R                   S5        S S S 5        g g ! , (       d  f       Nl= f! , (       d  f       g = f)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
   s     r   __init__SocketStream.__init__O   s    &'"4"455HII;;'---IJJ'7I(
$ gOOG//1D1DdK  7/00 '" 3 3W5N5NPUV #" 1  #"s   90D0D 
D 
D.c           	       #    U R                   R                  (       a  [        R                  " S5      eU R                     [        5          [        U5       nU(       dt  U R                   R                  5       S:X  a  [        R                  " S5      e[        R                  R                  5       I S h  vN    S S S 5        S S S 5        S S S 5        g SnU[        U5      :  aF  XS   nU R                   R                  U5      I S h  vN nS S S 5        UW-  nU[        U5      :  a  MF  S S S 5        S S S 5        S S S 5        g  N N=! , (       d  f       NA= f! , (       d  f       N4= f! , (       d  f       N== f! , (       d  f       g = f7f)Nz!can't send data after sending EOFzsocket was already closedr   )r
   did_shutdown_SHUT_WRr   r   r)   r   
memoryviewfilenolowlevel
checkpointlensend)r.   data
total_sent	remainingsents        r   send_allSocketStream.send_allm   s#    ;;++**+NOO)):<%;;--/25"&":":;V"WW"mm66888 & = *) "#J$s4y0!+.))-)9)9))D#DD /"d*
 %s4y0 & = *) 9
 $E /. &% =< *)s   >F E:E)AE4E
5E:E)E:
	FE(E	EE	E*E)2E::	FEE	
EE
E&"E))
E7	3E::
FFc                D  #    U R                      U R                  R                  5       S:X  a  [        R                  e[        5          U R                  R                  5       I S h  vN   S S S 5        S S S 5        g  N! , (       d  f       N= f! , (       d  f       g = f7f)Nr2   )r)   r
   r5   r   r   r   wait_writabler.   s    r   wait_send_all_might_not_block*SocketStream.wait_send_all_might_not_block~   sn     )){{!!#r)...:<kk//111 = *) 2 =< *)sF   B 9BA>&A<'A>+B3	B <A>>
B	B
BB c                  #    U R                      [        R                  R                  5       I S h  vN   U R                  R
                  (       a
   S S S 5        g [        5          U R                  R                  [        R                  5        S S S 5        S S S 5        g  Nn! , (       d  f       N= f! , (       d  f       g = f7fN)
r)   r   r6   r7   r
   r3   r   shutdownr$   SHUT_WRrB   s    r   send_eofSocketStream.send_eof   s}     ))--**,,, {{// *) ;<$$W__5 = *),
 =< *)sP   C"B3B  B3	C
B3%*B"B3	C B3"
B0	,B33
C=CNc                   #    Uc  [         nUS:  a  [        S5      e[        5          U R                  R	                  U5      I S h  vN sS S S 5        $  N! , (       d  f       g = f7f)Nr   zmax_bytes must be >= 1)DEFAULT_RECEIVE_SIZEr(   r   r
   recv)r.   	max_bytess     r   receive_someSocketStream.receive_some   sQ     ,Iq=56668)))44 984 98s.   %A'AAA

A'A
A$ A'c                   #    U R                   R                  5         [        R                  R	                  5       I S h  vN   g  N7frF   r
   closer   r6   r7   rB   s    r   acloseSocketStream.aclose   s+     mm&&(((   <AAAc                    g rF    )r.   leveloptionvalues       r   r*   SocketStream.setsockopt   s    PS    c                    g rF   rX   r.   rY   rZ   r[   lengths        r   r*   r\      s    UXr]   c                    Uc*  Uc  [        S5      eU R                  R                  XU5      $ Ub  [        SU< S35      eU R                  R                  XX45      $ )z\Set an option on the underlying socket.

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

zKinvalid 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*   r_   s        r   r*   r\      sp     >}a  ;;))%??6ui?de  {{%%eUCCr]   c                    g rF   rX   )r.   rY   rZ   s      r   
getsockoptSocketStream.getsockopt   s    :=r]   c                    g rF   rX   r.   rY   rZ   
buffersizes       r   rc   rd      s    MPr]   c                |    US:X  a  U R                   R                  X5      $ U R                   R                  XU5      $ )zsCheck the current value of an option on the underlying socket.

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

r   )r
   rc   rf   s       r   rc   rd      s7     ?;;))%88;;))%DDr]   )r)   r
   r
   r   returnNone)r:   zbytes | bytearray | memoryviewrj   rk   rj   rk   rF   )rN   
int | Nonerj   bytes)rY   intrZ   ro   r[   zint | Bufferrj   rk   )
rY   ro   rZ   ro   r[   rk   r`   ro   rj   rk   )
rY   ro   rZ   ro   r[   zint | Buffer | Noner`   rm   rj   rk   )rY   ro   rZ   ro   rj   ro   )rY   ro   rZ   ro   rg   ro   rj   rn   )r   )rY   ro   rZ   ro   rg   ro   rj   zint | bytes)__name__
__module____qualname____firstlineno____doc__r/   r>   rC   rI   rO   rT   r   r*   rc   __static_attributes__rX   r]   r   r   r   6   s    .W<+"265) S SX X "DD D #	D
 D 
D0 = =P PE Er]   r   )EPERMECONNABORTEDEPROTOENETDOWNENOPROTOOPT	EHOSTDOWNENONETEHOSTUNREACH
EOPNOTSUPPENETUNREACHENOSRESOCKTNOSUPPORTEPROTONOSUPPORT	ETIMEDOUT
ECONNRESETzset[int]_ignorable_accept_errnosc                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)SocketListenerif  a  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.

c                Z   [        U[        R                  5      (       d  [        S5      eUR                  [        R
                  :w  a  [        S5      e UR                  [        R                  [        R                  5      nU(       d  [        S5      e Xl        g ! [         a     Nf = f)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(   rc   
SOL_SOCKETSO_ACCEPTCONNr   r
   )r.   r
   	listenings      r   r/   SocketListener.__init__x  s    &'"4"455JKK;;'---KLL	O))'*<*<g>S>STI
  !MNN    		s   .B 
B*)B*c                  #      U R                   R                  5       I Sh  vN u  p[        U5      $  N! [         aD  nUR                  [
        ;   a  [        R                  SeUR                  [        ;  a  e  SnAOSnAff = fM  7f)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   r   r   )r.   sock_r   s       r   r   SocketListener.accept  s}     " * $ 2 2 44 $D)) 5 99 5522<99$<< = s7   B	6 46 B	6 
B :A?:B	?BB	c                   #    U R                   R                  5         [        R                  R	                  5       I Sh  vN   g N7f)z.Close this listener and its underlying socket.NrR   rB   s    r   rT   SocketListener.aclose  s+     mm&&(((rV   r	   Nri   )rj   r   rl   )	rp   rq   rr   rs   rt   r/   r   rT   ru   rX   r]   r   r   r   f  s      *8)r]   r   )rj   zGenerator[None, None, None])*
__future__r   r   
contextlibr   r   typingr   r   r    r
   r$   _utilr   r   abcr   r   collections.abcr   _socketr   sysversion_infor   typing_extensionsrL   EBADFENOTSOCKr   r   r   _ignorable_accept_errno_namessetr   __annotations__nameAttributeErroraddgetattrr   rX   r]   r   <module>r      s   "  / *   * .)# 
w '(   
KK	NN	  X X WE& WE WEd! . &)U ( *)D	.	! $$WUD%9: 
"	! *
 @)Xl+ @) @) 
"	!s   C;;
D
	