B
    ùÿU¿  ã               @   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Üdd	„ Zd
d	„ Z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Ð   Y nX dd„ Zn
ejZdZ
dS )a³  
    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: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.
    :license: BSD, see LICENSE for more details.
é    Né   )Ú
to_unicode)Úget_filesystem_encodingFÚntc             C   s   dS )NF© )ÚsrcÚdstr   r   ú6lib/python3.7/site-packages/werkzeug/posixemulation.pyÚ<lambda>    s    r
   c             C   s   dS )NFr   )r   r   r   r   r	   r
   !   s    é   c             C   sj   t | tƒ ƒ} t |tƒ ƒ}t| |ƒr&dS d}d}x6|sd|dk rdt| |ttB ƒ}|s0t d¡ |d7 }q0W |S )NTr   Féd   gü©ñÒMbP?r   )r   r   Ú_rename_atomicÚ_MoveFileExÚ_MOVEFILE_REPLACE_EXISTINGÚ_MOVEFILE_WRITE_THROUGHÚtimeÚsleep)r   r   ÚretryÚrvr   r   r	   Ú_rename*   s    

r   Tc             C   s†   t d ddddddƒ}|dkr dS zVd}d}xH|sr|dk rrt| |d d ttB |ƒ}|r^t|ƒ}P q,t d¡ |d7 }q,W |S t|ƒ X d S )	Nr   iè  zWerkzeug renameéÿÿÿÿFr   gü©ñÒMbP?r   )Ú_CreateTransactionÚ_MoveFileTransactedr   r   Ú_CommitTransactionr   r   Ú_CloseHandle)r   r   Ztar   r   r   r   r	   r   @   s"    


r   c             C   s¦   t | |ƒrd S yt | |¡ W n‚ tk
r  } zd|jtjkr>‚ d|t dtj	¡f }t ||¡ t | |¡ yt 
|¡ W n tk
rŽ   Y nX W d d }~X Y nX d S )Nz%s-%08xr   )r   ÚosÚrenameÚOSErrorÚerrnoZEEXISTÚrandomZrandintÚsysZmaxintÚunlinkÚ	Exception)r   r   ÚeÚoldr   r   r	   r   W   s    
r   ) Ú__doc__r    r   r   r   r   Z_compatr   Z
filesystemr   Zcan_rename_open_fileÚnamer   r   Zctypesr   r   ZwindllZkernel32ZMoveFileExWr   Zktmw32ZCreateTransactionr   ZCommitTransactionr   ZMoveFileTransactedWr   ZCloseHandler   r"   r   r   r   r   r	   Ú<module>   s8   






