a
    i3e                     @   s   d Z ddlZejdkred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g dZdZe	jZe	jZe ZeedrejZnejejdfddZd	d
edddZG dd dZG dd de	jZdS )z*
Various Windows specific bits and pieces
    Nwin32z
win32 only)
socketpairpipePopenPIPE
PipeHandlei    r   c           
   	   C   s  | t jkrd}n| t jkr d}ntd|t jkr:td|dkrJtdt  | ||}z||df |d | dd	 \}}t  | ||}zN|d
 z|	||f W n t
tfy   Y n0 |d | \}}	W n   |   Y n0 W |  n
|  0 ||fS )zA socket pair usable as a self-pipe, for Windows.

        Origin: https://gist.github.com/4325783, by Geert Jansen.
        Public domain.
        z	127.0.0.1z::1z?Only AF_INET and AF_INET6 socket address families are supportedz)Only SOCK_STREAM socket type is supportedr   zOnly protocol zero is supported   N   FT)socketAF_INETAF_INET6
ValueErrorSOCK_STREAMbindlistengetsocknamesetblockingconnectBlockingIOErrorInterruptedErroracceptclose)
familytypeprotohostZlsockaddrportZcsockZssock_ r   H/home/pi/bot/my_env/lib/python3.9/site-packages/asyncio/windows_utils.pyr   %   s8    






F)TT)duplex
overlappedbufsizec              
   C   s$  t jdt ttf d}| r>tj}tjtj	B }|| }}ntj
}tj	}d| }}|tjO }|d rp|tjO }|d rtj}nd}d }	}
z\t||tjd||tjtj}	t||dtjtj|tj}
tj|	dd}|d |	|
fW S    |	durt|	 |
durt|
  Y n0 dS )zELike os.pipe() but with overlapped support and using handles not fds.z\\.\pipe\python-pipe-%d-%d-)prefixr   r   NTr"   )tempfilemktemposgetpidnext_mmap_counter_winapiZPIPE_ACCESS_DUPLEXZGENERIC_READZGENERIC_WRITEZPIPE_ACCESS_INBOUNDZFILE_FLAG_FIRST_PIPE_INSTANCEZFILE_FLAG_OVERLAPPEDZCreateNamedPipeZ	PIPE_WAITZNMPWAIT_WAIT_FOREVERZNULLZ
CreateFileZOPEN_EXISTINGZConnectNamedPipeZGetOverlappedResultCloseHandle)r!   r"   r#   addressZopenmodeaccessZobsizeZibsizeZflags_and_attribsh1h2ovr   r   r    r   S   sF    








r   c                   @   s\   e Zd ZdZdd Zdd Zedd Zdd	 Ze	j
d
ddZdd Zdd Zdd ZdS )r   zWrapper for an overlapped pipe handle which is vaguely file-object like.

    The IOCP event loop can use these instead of socket objects.
    c                 C   s
   || _ d S N_handleselfhandler   r   r    __init__   s    zPipeHandle.__init__c                 C   s*   | j d urd| j  }nd}d| jj|f S )Nz	handle=%rclosedz<%s %s>)r5   	__class____name__r6   r   r   r    __repr__   s    
zPipeHandle.__repr__c                 C   s   | j S r3   r4   r7   r   r   r    r8      s    zPipeHandle.handlec                 C   s   | j d u rtd| j S )NzI/O operatioon on closed pipe)r5   r   r>   r   r   r    fileno   s    
zPipeHandle.fileno)r-   c                C   s   | j d ur|| j  d | _ d S r3   r4   )r7   r-   r   r   r    r      s    

zPipeHandle.closec                 C   s&   | j d ur"td|  t |   d S )Nzunclosed %r)r5   warningswarnResourceWarningr   r>   r   r   r    __del__   s    
zPipeHandle.__del__c                 C   s   | S r3   r   r>   r   r   r    	__enter__   s    zPipeHandle.__enter__c                 C   s   |    d S r3   )r   )r7   tvtbr   r   r    __exit__   s    zPipeHandle.__exit__N)r<   
__module____qualname____doc__r9   r=   propertyr8   r?   r,   r-   r   rC   rD   rH   r   r   r   r    r      s   
r   c                       s"   e Zd ZdZd fdd	Z  ZS )r   zReplacement for subprocess.Popen using overlapped pipe handles.

    The stdin, stdout, stderr are None or instances of PipeHandle.
    Nc              	      s  | drJ | dddks"J d  } }}d  }	 }
}|tkrbtddd\}}	t|tj}n|}|tkrtdd\}
}t|d}n|}|tkrtdd\}}t|d}n|tkr|}n|}zz t j	|f|||d	| W n0   |	|
|fD ]}|d urt
| q Y n>0 |	d ur,t|	| _|
d ur@t|
| _|d urTt|| _W |tkrjt| |tkr~t| |tkrt| n>|tkrt| |tkrt| |tkrt| 0 d S )
Nuniversal_newlinesr#   r   )FTT)r"   r!   )TFr%   )stdinstdoutstderr)getr   r   msvcrtopen_osfhandler(   O_RDONLYSTDOUTsuperr9   r,   r-   r   rN   rO   rP   r   )r7   argsrN   rO   rP   kwdsZ	stdin_rfdZ
stdout_wfdZ
stderr_wfdZstdin_whZ	stdout_rhZ	stderr_rhZstdin_rhZ	stdout_whZ	stderr_whhr;   r   r    r9      s^    















zPopen.__init__)NNN)r<   rI   rJ   rK   r9   __classcell__r   r   rZ   r    r      s   r   )rK   sysplatformImportErrorr,   	itertoolsrR   r(   r
   
subprocessr&   r@   __all__BUFSIZEr   rU   countr+   hasattrr   r   r   r   r   r   r   r   r   r    <module>   s,   

.0,