o
    Nrf                     @   s|   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZdZdZ	d Z
dZdd ZG dd dZG d	d
 d
ejZdS )    N   i   
   c                    s   t   fdd}|S )Nc                    s$   | j rtd | g|R i |S )Nz1Can not reuse socket after connection was closed.)_closedRuntimeError)selfargskwargsf e/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/docker/transport/npipesocket.pywrapped   s
   zcheck_closed.<locals>.wrapped)	functoolswraps)r
   r   r   r	   r   check_closed   s   r   c                   @   s$  e Zd ZdZd8ddZdd Zdd Zd	d
 Zed9ddZ	edd Z
edd Zedd Zdd Zdd Zd8ddZdd Zdd Zd:ddZed9d d!Zed9d"d#Zed;d$d%Zed9d&d'Zed9d(d)Zed9d*d+Zed,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zed6d7 ZdS )<NpipeSocketz Partial implementation of the socket API over windows named pipes.
        This implementation is only designed to be used as a client socket,
        and server-specific methods (bind, listen, accept...) are not
        implemented.
    Nc                 C   s   t j| _|| _d| _d S NF)	win32pipeZNMPWAIT_USE_DEFAULT_WAIT_timeout_handler   )r   handler   r   r   __init__$   s   
zNpipeSocket.__init__c                 C      t  NNotImplementedErrorr   r   r   r   accept)      zNpipeSocket.acceptc                 C   r   r   r   r   addressr   r   r   bind,   r   zNpipeSocket.bindc                 C   s   | j   d| _d S NT)r   Closer   r   r   r   r   close/      

zNpipeSocket.closer   c              
   C   s   zt |t jt jB dd t jttB t jB d}W n- tj	yD } z |j
tkr>|d }|tk r>td | ||W  Y d }~S |d }~ww t|d | _|| _|| _d S )Nr      )	win32fileZ
CreateFileZGENERIC_READZGENERIC_WRITEZOPEN_EXISTINGcSECURITY_ANONYMOUScSECURITY_SQOS_PRESENTZFILE_FLAG_OVERLAPPEDr   errorwinerrorcERROR_PIPE_BUSYMAXIMUM_RETRY_COUNTtimesleepconnectZGetNamedPipeInfoflagsr   _address)r   r    Zretry_countr   er   r   r   r0   3   s4   



zNpipeSocket.connectc                 C   s
   |  |S r   )r0   r   r   r   r   
connect_exS      
zNpipeSocket.connect_exc                 C   s   d| _ | jS r"   )r   r   r   r   r   r   detachW   s   zNpipeSocket.detachc                 C   s
   t | jS r   )r   r   r   r   r   r   dup\   r5   zNpipeSocket.dupc                 C      | j S r   r2   r   r   r   r   getpeername`   r   zNpipeSocket.getpeernamec                 C   r8   r   r9   r   r   r   r   getsocknamec   r   zNpipeSocket.getsocknamec                 C   r   r   r   )r   leveloptnamebuflenr   r   r   
getsockoptf   r   zNpipeSocket.getsockoptc                 C   r   r   r   )r   controloptionr   r   r   ioctli   r   zNpipeSocket.ioctlc                 C   r   r   r   )r   backlogr   r   r   listenl   r   zNpipeSocket.listenc                 C   s@   | ddkr
t t| }|d u s|dkrtj}tj||dS )Nbrr   )buffer_size)stripr   NpipeFileIOBaseioDEFAULT_BUFFER_SIZEBufferedReader)r   modebufsizeZrawior   r   r   makefileo   s   zNpipeSocket.makefilec                 C   s   t | j|\}}|S r   )r'   ReadFiler   )r   rN   r1   errdatar   r   r   recvw   s   zNpipeSocket.recvc                 C   s   |  ||}|| jfS r   )rS   r2   )r   rN   r1   rR   r   r   r   recvfrom|   s   
zNpipeSocket.recvfromc                 C   s   |  |||| jfS r   )	recv_intor2   )r   bufnbytesr1   r   r   r   recvfrom_into   s   zNpipeSocket.recvfrom_intoc           	   	   C   s   |}t |tst|}td ddd }z;t }||_t| j	|r'|d | n||\}}t
|| j}|tjkrAt| j	 tt| j	|dW t| S t| w NTr   )
isinstance
memoryview
win32eventCreateEvent
pywintypes
OVERLAPPEDhEventr'   rP   r   WaitForSingleObjectr   WAIT_TIMEOUTCancelIoTimeoutErrorGetOverlappedResultwin32apiCloseHandle)	r   rV   rW   Zreadbufevent
overlappedrQ   rR   wait_resultr   r   r   rU      s$   

zNpipeSocket.recv_intoc              	   C   s   t d ddd }z1t }||_t| j|| t || j	}|t j
kr,t| j tt| j|dW t| S t| w rY   )r\   r]   r^   r_   r`   r'   Z	WriteFiler   ra   r   rb   rc   rd   re   rf   rg   )r   stringr1   rh   ri   rj   r   r   r   send   s   
zNpipeSocket.sendc                 C   s   |  ||S r   )rl   )r   rk   r1   r   r   r   sendall   s   zNpipeSocket.sendallc                 C   s   |  | | |S r   )r0   rl   )r   rk   r    r   r   r   sendto   s   

zNpipeSocket.sendtoc                 C   s   |r|  d S |  dS )Nr   )
settimeout)r   flagr   r   r   setblocking   s   

zNpipeSocket.setblockingc                 C   sD   |d u r
t j| _d S t|ttfr|dk rtdt|d | _d S )Nr   zTimeout value out of rangei  )r\   ZINFINITEr   rZ   floatint
ValueError)r   valuer   r   r   ro      s
   zNpipeSocket.settimeoutc                 C   r8   r   )r   r   r   r   r   
gettimeout   r   zNpipeSocket.gettimeoutc                 C   r   r   r   )r   r<   r=   ru   r   r   r   
setsockopt   r   zNpipeSocket.setsockoptc                 C   s   |   S r   )r$   )r   howr   r   r   shutdown   s   zNpipeSocket.shutdownr   )r   )NN)r   r   )__name__
__module____qualname____doc__r   r   r!   r$   r   r0   r4   r6   r7   r:   r;   r?   rB   rD   rO   rS   rT   rX   rU   rl   rm   rn   rq   ro   rv   rw   ry   r   r   r   r   r      sP    







r   c                       sT   e Zd Zdd Z fddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
  ZS )rI   c                 C   s
   || _ d S r   )sock)r   Znpipe_socketr   r   r   r         
zNpipeFileIOBase.__init__c                    s   t    d | _d S r   )superr$   r~   r   	__class__r   r   r$      r%   zNpipeFileIOBase.closec                 C   s
   | j  S r   )r~   filenor   r   r   r   r      r   zNpipeFileIOBase.filenoc                 C      dS r   r   r   r   r   r   isatty      zNpipeFileIOBase.isattyc                 C   r   r"   r   r   r   r   r   readable   r   zNpipeFileIOBase.readablec                 C   s   | j |S r   )r~   rU   )r   rV   r   r   r   readinto   s   zNpipeFileIOBase.readintoc                 C   r   r   r   r   r   r   r   seekable   r   zNpipeFileIOBase.seekablec                 C   r   r   r   r   r   r   r   writable   r   zNpipeFileIOBase.writable)rz   r{   r|   r   r$   r   r   r   r   r   r   __classcell__r   r   r   r   rI      s    rI   )r   rJ   r.   r^   rf   r\   r'   r   r,   r)   r(   r-   r   r   	RawIOBaserI   r   r   r   r   <module>   s      2