
_'                 @   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  m Z d  d l  m Z d  d l  m Z d  d l  m	 Z	 d  d l  m
 Z
 d  d l  m Z d  d l  m Z d  d	 l  m Z d  d
 l  m Z d  d l  m Z d  d l  m Z d  d l  m Z d  d l m Z d  d l m Z d  d l m Z d  d l m Z d  d l Z d d l m Z d d l m Z d d l m Z y& d  d l  m Z e j Z e j Z Wn e k
 rd Z Yn Xe e
  Z  e j! Z! e! j" Z" e! j# Z# e! j$ Z$ e! j% Z% e! j& Z& e e  d e j! f  Z' e e e  e e e	   d e j( f  Z) e e  j e  j  d e j! f  Z* e" dA  Z+ e" dB  Z, e" dC  Z- d  Z. d Z/ d  Z0 d Z1 d Z2 d  Z3 d Z4 d Z5 d  Z6 d! Z7 Gd" d#   d# e  j8  Z9 e d k rd Z: n d$ d% d&  Z: Gd' d(   d( e j;  Z< Gd) d*   d* e<  Z= Gd+ d,   d, e<  Z> Gd- d.   d. e?  Z@ Gd/ d0   d0 e?  ZA eB   ZC d1 d2   ZD d3 d4   ZE d5 d6   ZF d7 d8   ZG e rd9 d:   ZH eH   ZI d; d<   ZJ d  eE d eF d eG i ZK d= d>   ZL d? d@   ZM d S)D    N)byref)c_char)c_char_p)c_int)	c_ssize_t)c_ulong)c_void_p)POINTER)	py_object)windll)WinError)WINFUNCTYPE)DWORD)HANDLE)LPCWSTR)LPWSTR   )_NonClosingTextIOWrapper)PY2)	text_type)	pythonapiGetCommandLineWCommandLineToArgvW	LocalFree
            i     s   i  c               @   s   e  Z d  Z d e f d e f d e f d e f d e f d e f d e f d e f d	 e f d
 e f d e f g Z	 e
 r e	 j d d e d f  d S)	Py_bufferbufobjlenitemsizereadonlyndimformatshapestrides
suboffsetsZinternalr   Z
smalltabler   N)__name__
__module____qualname__r   r
   r   r   r   	c_ssize_p_fields_r   insert r1   r1   2/tmp/pip-build-5gj8f0j9/click/click/_winconsole.pyr   U   s   										r   Fc             C   sp   t    } | r t n t } t t |   t |  |  z! t | j } | j | j	  SWd  t
 t |   Xd  S)N)r   PyBUF_WRITABLEPyBUF_SIMPLEPyObject_GetBufferr
   r   r   r"   from_addressr    PyBuffer_Release)r!   writabler    flagsZbuffer_typer1   r1   r2   
get_buffern   s    	r:   c               @   s(   e  Z d  Z d d   Z d d   Z d S)_WindowsConsoleRawIOBasec             C   s   | |  _  d  S)N)handle)selfr<   r1   r1   r2   __init__z   s    z!_WindowsConsoleRawIOBase.__init__c             C   s   t  j j |   d S)NT)io	RawIOBaseisatty)r=   r1   r1   r2   rA   }   s    z_WindowsConsoleRawIOBase.isattyN)r+   r,   r-   r>   rA   r1   r1   r1   r2   r;   y   s   r;   c               @   s(   e  Z d  Z d d   Z d d   Z d S)_WindowsConsoleReaderc             C   s   d S)NTr1   )r=   r1   r1   r2   readable   s    z_WindowsConsoleReader.readablec             C   s   t  |  } | s d S| d r, t d   t | d d } | d } t   } t t |  j  | | t |  d   } t   t	 k r t
 j d  | s t d j t      | d t k r d Sd | j S)Nr   r   z>cannot read odd number of bytes from UTF-16-LE encoded consoler8   Tg?zWindows error: {})r"   
ValueErrorr:   r   ReadConsoleWr   r<   r   GetLastErrorERROR_OPERATION_ABORTEDtimesleepOSErrorr&   EOFvalue)r=   bZbytes_to_be_readbufferZcode_units_to_be_readZcode_units_readrvr1   r1   r2   readinto   s,    
	
			z_WindowsConsoleReader.readintoN)r+   r,   r-   rC   rP   r1   r1   r1   r2   rB      s   rB   c               @   s:   e  Z d  Z d d   Z e d d    Z d d   Z d S)_WindowsConsoleWriterc             C   s   d S)NTr1   )r=   r1   r1   r2   r8      s    z_WindowsConsoleWriter.writablec             C   s-   |  t  k r d S|  t k r  d Sd j |   S)NERROR_SUCCESSERROR_NOT_ENOUGH_MEMORYzWindows error {})rR   rS   r&   )errnor1   r1   r2   _get_error_message   s
    z(_WindowsConsoleWriter._get_error_messagec             C   s   t  |  } t |  } t | t  d } t   } t t |  j  | | t |  d   d | j	 } | d k r | d k r t
 |  j t      | S)Nr   r   )r"   r:   minMAX_BYTES_WRITTENr   WriteConsoleWr   r<   r   rL   rJ   rU   rF   )r=   rM   Zbytes_to_be_writtenr    Zcode_units_to_be_writtenZcode_units_writtenZbytes_writtenr1   r1   r2   write   s    		z_WindowsConsoleWriter.writeN)r+   r,   r-   r8   staticmethodrU   rY   r1   r1   r1   r2   rQ      s   rQ   c               @   sj   e  Z d  Z d d   Z e d d    Z d d   Z d d   Z d	 d
   Z d d   Z	 d d   Z
 d S)ConsoleStreamc             C   s   | |  _  | |  _ d  S)N)_text_streamrN   )r=   text_streamZbyte_streamr1   r1   r2   r>      s    	zConsoleStream.__init__c             C   s
   |  j  j S)N)rN   name)r=   r1   r1   r2   r^      s    zConsoleStream.namec             C   sR   t  | t  r |  j j |  Sy |  j   Wn t k
 rA Yn X|  j j |  S)N)
isinstancer   r\   rY   flush	ExceptionrN   )r=   xr1   r1   r2   rY      s    zConsoleStream.writec             C   s"   x | D] } |  j  |  q Wd  S)N)rY   )r=   linesliner1   r1   r2   
writelines   s    zConsoleStream.writelinesc             C   s   t  |  j |  S)N)getattrr\   )r=   r^   r1   r1   r2   __getattr__   s    zConsoleStream.__getattr__c             C   s   |  j  j   S)N)rN   rA   )r=   r1   r1   r2   rA      s    zConsoleStream.isattyc             C   s   d j  |  j |  j  S)Nz'<ConsoleStream name={!r} encoding={!r}>)r&   r^   encoding)r=   r1   r1   r2   __repr__   s    zConsoleStream.__repr__N)r+   r,   r-   r>   propertyr^   rY   re   rg   rA   ri   r1   r1   r1   r2   r[      s   	r[   c               @   s:   e  Z d  Z d Z d d   Z d d   Z d d   Z d S)	WindowsChunkedWriterz
    Wraps a stream (such as stdout), acting as a transparent proxy for all
    attribute access apart from method 'write()' which we wrap to write in
    limited chunks due to a Windows limitation on binary console streams.
    c             C   s   | |  _  d  S)N)_WindowsChunkedWriter__wrapped)r=   wrappedr1   r1   r2   r>      s    zWindowsChunkedWriter.__init__c             C   s   t  |  j |  S)N)rf   rl   )r=   r^   r1   r1   r2   rg      s    z WindowsChunkedWriter.__getattr__c             C   sd   t  |  } d } xK | | k  r_ t | | t  } |  j j | | | |   | | 7} q Wd  S)Nr   )r"   rV   rW   rl   rY   )r=   textZtotal_to_writeZwrittenZto_writer1   r1   r2   rY      s    zWindowsChunkedWriter.writeN)r+   r,   r-   __doc__r>   rg   rY   r1   r1   r1   r2   rk      s   rk   c             C   s^   t  rZ t j   d  d  d k rZ |  t k rZ t t |  t t t |     t j |   d  S)Nr      r   )rp   r   )r   sysgetwindowsversion_wrapped_std_streamssetattrrk   rf   add)r^   r1   r1   r2   _wrap_std_stream  s
    rv   c             C   s4   t  t j t t   d d d d } t | |   S)Nz	utf-16-lestrictline_bufferingT)r   r?   BufferedReaderrB   STDIN_HANDLEr[   )buffer_streamr]   r1   r1   r2   _get_text_stdin  s    	r|   c             C   s4   t  t j t t   d d d d } t | |   S)Nz	utf-16-lerw   rx   T)r   r?   BufferedWriterrQ   STDOUT_HANDLEr[   )r{   r]   r1   r1   r2   _get_text_stdout  s    	r   c             C   s4   t  t j t t   d d d d } t | |   S)Nz	utf-16-lerw   rx   T)r   r?   r}   rQ   STDERR_HANDLEr[   )r{   r]   r1   r1   r2   _get_text_stderr"  s    	r   c               C   s#   t  j d j t j d d     S)N r   )zlibcrc32joinrq   argvr1   r1   r1   r2   _hash_py_argv.  s    r   c                 s   t  d  }  t t   t |        s3 t    z)   f d d   t d |  j  D } Wd  t      Xt t	 d  s | d d   } x] t
 |  d k r | d } | j d  s | d k r P| d d   } | j d	  r Pq W| d d   S)
Nr   c                s   g  |  ] }   |  q Sr1   r1   ).0i)argv_unicoder1   r2   
<listcomp>9  s   	 z%_get_windows_argv.<locals>.<listcomp>frozenr   --c-m)r   r   )r   r   r   r   r   rangerL   r   hasattrrq   r"   
startswith)Zargcr   argr1   )r   r2   _get_windows_argv3  s$    	)

r   c             C   sg   t  |  d  s d Sy |  j   } Wn t k
 r; d SYn Xt j |  } t t | t t      S)NfilenoF)	r   r   rJ   msvcrtZget_osfhandleboolGetConsoleModer   r   )fr   r<   r1   r1   r2   _is_consoleR  s    	r   c             C   s   t  d  k	 r | d k r | d k r t |   r t j |  j    } | d  k	 r t s| t |  d d   }  |  d  k r d  Sn t j |  j   t	 j
  | |   Sd  S)N	utf-16-lerw   rN   )r   N)rw   N)r:   r   _stream_factoriesgetr   r   rf   r   ZsetmodeosO_BINARY)r   rh   errorsfuncr1   r1   r2   _get_windows_console_stream_  s    r   iii)Nctypesr?   r   rq   rH   r   r   r   r   r   r   r   r   r	   r
   r   r   r   Zctypes.wintypesr   r   r   r   r   _compatr   r   r   r   r5   r7   ImportErrorr.   kernel32ZGetStdHandlerE   rX   r   rF   r   shell32r   r   rz   r~   r   r4   r3   rR   rS   rG   ZSTDIN_FILENOZSTDOUT_FILENOZSTDERR_FILENOrK   rW   	Structurer   r:   r@   r;   rB   rQ   objectr[   rk   setrs   rv   r|   r   r   r   Z_initial_argv_hashr   r   r   r   r1   r1   r1   r2   <module>
   s   									# "	


	