
\[\                 @   s&  d  Z  d d l Z e j d k r0 e d   n  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 d d d	 g Z d
 Z e j Z e j Z e j   Z e j e j d d d  Z d d d d d e d d  Z Gd d	   d	  Z Gd d   d e j  Z d S)z*
Various Windows specific bits and pieces
    NZwin32z
win32 only
socketpairpipePopenPIPE
PipeHandlei    c       
      C   sq  |  t  j k r d } n$ |  t  j k r0 d } n t d   | t  j k rZ t d   n  | d k ru t d   n  t  j  |  | |  } z | j | d f  | j d  | j   d d	  \ } } t  j  |  | |  } yb | j d
  y | j	 | | f  Wn t
 t f k
 rYn X| j   \ } }	 | j d  Wn | j     Yn XWd | j   X| | 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>Ony 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_INETZAF_INET6
ValueErrorSOCK_STREAMZbindZlistenZgetsocknameZsetblockingZconnectBlockingIOErrorInterruptedErrorZacceptclose)
ZfamilytypeprotoZhostZlsockZaddrZportZcsockZssock_ r   +/usr/lib/python3.4/asyncio/windows_utils.pyr   "   s8    		
duplexF
overlappedTbufsizec             C   s  t  j d d t j   t t  f  } |  rW t j } t j t j	 B} | | } } n t j
 } t j	 } d | } } | t j O} | d r | t j O} n  | d r t j } n d } d }	 }
 y t j | | t j d | | t j t j  }	 t j | | d t j t j | t j  }
 t j |	 d d } | j d  |	 |
 f SWnC |	 d k	 rlt j |	  n  |
 d k	 rt j |
  n    Yn Xd S)zELike os.pipe() but with overlapped support and using handles not fds.prefixz\\.\pipe\python-pipe-%d-%d-r   r   Nr   T)tempfileZ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   ZaddressZopenmodeaccessZobsizeZibsizeZflags_and_attribsZh1Zh2Zovr   r   r   r   O   s@    			


c               @   ss   e  Z d  Z d Z d d   Z e d d    Z d d   Z d e j	 d	 d
  Z
 e
 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  S)N)r!   )r"   r   r   r   r#      s    zPipeHandle.handlec             C   s   |  j  S)N)r!   )r"   r   r   r   fileno   s    zPipeHandle.filenor   c            C   s,   |  j  d k r( | |  j   d |  _  n  d  S)Nr   r&   )r!   )r"   r   r   r   r   r      s    zPipeHandle.closec             C   s   |  S)Nr   )r"   r   r   r   	__enter__   s    zPipeHandle.__enter__c             C   s   |  j    d  S)N)r   )r"   tvtbr   r   r   __exit__   s    zPipeHandle.__exit__N)__name__
__module____qualname____doc__r$   propertyr#   r%   r   r   r   __del__r'   r+   r   r   r   r   r      s   c                   s1   e  Z d  Z d Z d d d   f d d  Z   S)r   zReplacement for subprocess.Popen using overlapped pipe handles.

    The stdin, stdout, stderr are None or instances of PipeHandle.
    Nc                sI  | j  d  s t  | j  d d  d k s4 t  d  } } } d  }	 }
 } | t k r t d d d d  \ } }	 t j | t j  } n | } | t k r t d d  \ }
 } t j | d  } n | } | t k rt d d  \ } } t j | d  } n | t k r| } n | } z y) t	   j
 | d | d	 | d
 | | WnA x3 |	 |
 | f D]" } | d  k	 rdt j |  qdqdW  Yn[ X|	 d  k	 rt |	  |  _ n  |
 d  k	 rt |
  |  _ n  | d  k	 rt |  |  _ n  Wd  | t k rt j |  n  | t k r(t j |  n  | t k rDt j |  n  Xd  S)NZuniversal_newlinesr   r   r   FTr   stdinstdoutstderr)FT)TF)TF)getAssertionErrorr   r   msvcrtZopen_osfhandler   O_RDONLYSTDOUTsuperr$   r   r   r   r2   r3   r4   r   )r"   argsr2   r3   r4   kwdsZ	stdin_rfdZ
stdout_wfdZ
stderr_wfdZstdin_whZ	stdout_rhZ	stderr_rhZstdin_rhZ	stdout_whZ	stderr_whh)	__class__r   r   r$      sL    	zPopen.__init__)r,   r-   r.   r/   r$   r   r   )r>   r   r      s   )TT)r/   sysplatformImportErrorr	   	itertoolsr7   r   
subprocessr   r   __all__ZBUFSIZEr   r9   countr   r
   r   r   r   r   r   r   r   r   r   <module>   s&   		-0 