3
 [ð]Õ  ã               @   sê   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rÜyZd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W n$ ek
rÐ   dd
„ Zdd„ ZY nX d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   sl   t | tƒ ƒ} t |tƒ ƒ}t| |ƒr&dS d}d}x8| rf|dk rft| |ttB ƒ}|s0tjdƒ |d7 }q0W |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-w1as9q70/Werkzeug/werkzeug/posixemulation.pyÚ_rename'   s    

r   Tc             C   sˆ   t d ddddddƒ}|dkr dS zXd}d}xJ| rt|dk rtt| |d d ttB |ƒ}|r`t|ƒ}P q,tjdƒ |d7 }q,W |S t|ƒ X d 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 S ytj| |ƒ W n‚ tk
r  } zf|jtjkr>‚ d|tjdtj	ƒf }tj||ƒ tj| |ƒ ytj
|ƒ W n tk
rŽ   Y nX W Y d d }~X nX d 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   






