
À«‘_Õ  ã               @   sK  d  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 Z
 e j d k r8y… d d l Z d Z d Z e j j j Z d	 d
 „  Z e j j j Z e j j j Z e j j j Z e j j j Z d Z
 d d „  Z Wn* e k
 r(d d
 „  Z d d „  Z Yn Xd d „  Z n e j Z d Z
 d S)am  
    werkzeug.posixemulation
    ~~~~~~~~~~~~~~~~~~~~~~~

    Provides a POSIX emulation for some features that are relevant to
    web applications.  The main purpose is to simplify support for
    systems such as Windows NT that are not 100% POSIX compatible.

    Currently this only implements a :func:`rename` function that
    follows POSIX semantics.  Eg: if the target file already exists it
    will be replaced without asking.

    This module was introduced in 0.6.1 and is not a public interface.
    It might become one in later versions of Werkzeug.

    :copyright: 2007 Pallets
    :license: BSD-3-Clause
é    Né   )Ú
to_unicode)Úget_filesystem_encodingFÚnté   c             C   s”   t  |  t ƒ  ƒ }  t  | t ƒ  ƒ } t |  | ƒ r7 d Sd } d } xJ | r� | d k  r� t |  | t t Bƒ } | sF t j d ƒ | d 7} qF W| S)NTr   Féd   gü©ñÒMbP?r   )r   r   Ú_rename_atomicÚ_MoveFileExÚ_MOVEFILE_REPLACE_EXISTINGÚ_MOVEFILE_WRITE_THROUGHÚtimeÚsleep)ÚsrcÚdstÚretryÚrv© r   ú;/tmp/pip-build-5gj8f0j9/Werkzeug/werkzeug/posixemulation.pyÚ_rename'   s    r   Tc             C   sº   t  d  d d d d d d ƒ } | d k r. d Szz d } d } xc | r¢ | d k  r¢ t |  | d  d  t t B| ƒ } | rˆ t | ƒ } Pq@ t j d ƒ | d 7} q@ W| SWd  t | ƒ Xd  S)	Nr   iè  zWerkzeug renamer   Fr   gü©ñÒMbP?éÿÿÿÿ)Ú_CreateTransactionÚ_MoveFileTransactedr
   r   Ú_CommitTransactionr   r   Ú_CloseHandle)r   r   Útar   r   r   r   r   r   >   s*    	r   c             C   s   d S)NFr   )r   r   r   r   r   r   Z   s    c             C   s   d S)NFr   )r   r   r   r   r   r   ]   s    c             C   sÍ   t  |  | ƒ r d  Sy t j |  | ƒ WnŸ t k
 rÈ } z | j t j k rQ ‚  d | t j d t j	 ƒ f } t j | | ƒ t j |  | ƒ y t j
 | ƒ Wn t k
 rµ Yn XWYd  d  } ~ Xn Xd  S)Nz%s-%08xr   )r   ÚosÚrenameÚOSErrorÚerrnoÚEEXISTÚrandomÚrandintÚsysÚmaxsizeÚunlinkÚ	Exception)r   r   ÚeÚoldr   r   r   r   `   s    r   ) Ú__doc__r   r   r    r"   r   Ú_compatr   Ú
filesystemr   Zcan_rename_open_fileÚnameÚctypesr
   r   ÚwindllÚkernel32ZMoveFileExWr	   r   Zktmw32ZCreateTransactionr   ZCommitTransactionr   ZMoveFileTransactedWr   ZCloseHandler   r   r%   r   r   r   r   r   Ú<module>   s6   	