
    k7i                     \    S SK r S SKrS SKrS SKJr   " S S\5      r " S S5      rSqS r	g)    N)warnc                       \ rS rSrSrSrg)	NoFDError   zQRaised by :class:`FileDescriptor` methods if it was already closed/converted
     N)__name__
__module____qualname____firstlineno____doc____static_attributes__r       E/home/james-whalen/.local/lib/python3.13/site-packages/jeepney/fds.pyr   r      s
    r   r   c                       \ rS rSrSrSrSrSrS rS r	S r
S	 rS
 rS rS rS rS rSS jrS r\SS /4S j5       rSrg)FileDescriptor   a  A file descriptor received in a D-Bus message

This wrapper helps ensure that the file descriptor is closed exactly once.
If you don't explicitly convert or close the FileDescriptor object, it will
close its file descriptor when it goes out of scope, and emit a
ResourceWarning.
_fdc                     Xl         g Nr   selffds     r   __init__FileDescriptor.__init__   s    r   c                     U R                   nU R                   U R                  :X  a  SnOU R                   U R                  :X  a  SnSU S3$ )Nclosed	convertedz<FileDescriptor (z)>)r   _CLOSED
_CONVERTEDr   details     r   __repr__FileDescriptor.__repr__   sD    88t||#FXX( F"6("--r   c                     U R                   U R                  :X  a  gU R                   U R                  :X  a  [        S5      eU R                  U R                   sU l         n[        R
                  " U5        g)zClose the file descriptor

This can safely be called multiple times, but will raise RuntimeError
if called after converting it with one of the ``to_*`` methods.

This object can also be used in a ``with`` block, to close it on
leaving the block.
z.Can't close FileDescriptor after converting itN)r   r!   r"   r   oscloser   s     r   r)   FileDescriptor.close$   sS     88t||#XX(LMM<<LDHbHHRLr   c                     U $ r   r   r   s    r   	__enter__FileDescriptor.__enter__5   s    r   c                 $    U R                  5         g r   )r)   )r   exc_typeexc_valexc_tbs       r   __exit__FileDescriptor.__exit__8   s    

r   c                     U R                   S:  a/  [        SU R                    S3[        SU S9  U R                  5         g g )Nr   zFileDescriptor (z") was neither closed nor converted   )
stacklevelsource)r   r   ResourceWarningr)   r,   s    r   __del__FileDescriptor.__del__;   s=    88q="488*,NOAd JJL r   c                 |    U R                   S:  a,  U R                   U R                  :X  a  SOSn[        SU 35      eg )Nr   r   r    z"FileDescriptor object was already )r   r!   r   r#   s     r   _checkFileDescriptor._checkC   s;    88a<!%T\\!9X{F@IJJ r   c                 :    U R                  5         U R                  $ )zGet the integer file descriptor

This does not change the state of the :class:`FileDescriptor` object,
unlike the ``to_*`` methods.
)r=   r   r,   s    r   filenoFileDescriptor.filenoH   s     	xxr   c                 b    U R                  5         U R                  U R                  sU l        nU$ )zConvert to the low-level integer file descriptor::

    raw_fd = fd.to_raw_fd()
    os.write(raw_fd, b'xyz')
    os.close(raw_fd)

The :class:`FileDescriptor` can't be used after calling this. The caller
is responsible for closing the file descriptor.
)r=   r"   r   r   s     r   	to_raw_fdFileDescriptor.to_raw_fdQ   s'     	"	r   Nc           	      t    U R                  5         [        U R                  XX4US9nU R                  U l        U$ )a  Convert to a Python file object::

    with fd.to_file('w') as f:
        f.write('xyz')

The arguments are the same as for the builtin :func:`open` function.

The :class:`FileDescriptor` can't be used after calling this. Closing
the file object will also close the file descriptor.
)	bufferingencodingerrorsnewline)r=   openr   r"   )r   moderF   rG   rH   rI   fs          r   to_fileFileDescriptor.to_file_   s7     	HHdg
 ??r   c                 t    SSK J n  U R                  5         U" U R                  S9nU R                  U l        U$ )a  Convert to a socket object

This returns a standard library :func:`socket.socket` object::

    with fd.to_socket() as sock:
        b = sock.sendall(b'xyz')

The wrapper object can't be used after calling this. Closing the socket
object will also close the file descriptor.
r   )socket)r@   )rP   r=   r   r"   )r   rP   ss      r   	to_socketFileDescriptor.to_socketr   s.     	"$((#??r   returnc           	      D   [         R                   " S5      nU Hh  u  p4nU[        R                  :X  d  M  U[        R                  :X  d  M2  UR	                  US[        U5      [        U5      UR                  -  -
   5        Mj     U Vs/ s H
  o`" U5      PM     sn$ s  snf )zMake a list of FileDescriptor from received file descriptors

ancdata is a list of ancillary data tuples as returned by socket.recvmsg()
iN)arrayrP   
SOL_SOCKET
SCM_RIGHTS	frombyteslenitemsize)clsancdatafds
cmsg_level	cmsg_typedatarV   s          r   from_ancdataFileDescriptor.from_ancdata   s     kk#+2'J4V...9@Q@Q3Qd#JCITS\\1I$JKL ,3 !$$1A$$$s   	B)r   NNN)r   r	   r
   r   r   	__slots__r!   r"   r   r%   r)   r-   r3   r:   r=   r@   rC   rM   rR   classmethodrc   r   r   r   r   r   r      so     IGJ."K
&$ 
%'7&8 
% 
%r   r   c                      [         c:  Sn [        R                  " S5      R                  n[        R                  " X-  5      q [         $ )N   rV   )_fds_buf_size_cacherW   r\   rP   
CMSG_SPACE)maxfdsfd_sizes     r   fds_buf_sizerm      s=     "++c"++$//0@Ar   )
rW   r(   rP   warningsr   RuntimeErrorr   r   ri   rm   r   r   r   <module>rp      s7     	  	 	B% B%J  
r   