
    m0jD                     ~   U d Z ddlZddlZddlZddlmZmZmZmZmZ ddl	m
Z
mZmZ e
j        Z G d dej                  Z G d d	ej                  Z G d
 d          Zeeeeej        f         egef         eeef         eee         f         Zeed<   ej        dk    rdej        deeeej        e                  ee         f         fdZdeej        e                  dee         ddfdZ G d de          Z G d de          Z e            Z eee         ef         ed<   eZ!dej        deddfdZ"dej        ddfdZ#dS ddl$Z$ddl%Z%eej        ej        f         Z& G d de          Z' G d d e'          Z( G d! d"e'          Z)e%j*        Z! e'            Z+dej        deddfd#Z"dej        ddfd$Z#dS )%a  Module portalocker.

This module provides cross-platform file locking functionality.
The Windows implementation now supports two variants:

  1. A default method using the Win32 API (win32file.LockFileEx/UnlockFileEx).
  2. An alternative that uses msvcrt.locking for exclusive locks (shared
     locks still use the Win32 API).

This version uses classes to encapsulate locking logic, while maintaining
the original external API, including the LOCKER constant for specific
backwards compatibility (POSIX) and Windows behavior.
    N)AnyCallableOptionalUnioncast   )	constants
exceptionstypesc                   ,    e Zd Zdej        deddfdZdS )LockCallablefile_objflagsreturnNc                     d S N selfr   r   s      Z/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/portalocker/portalocker.py__call__zLockCallable.__call__#   s    s    )__name__
__module____qualname__r   FileArgument	LockFlagsr   r   r   r   r   r   "   sC        *3<	     r   r   c                   (    e Zd Zdej        ddfdZdS )UnlockCallabler   r   Nc                     d S r   r   r   r   s     r   r   zUnlockCallable.__call__)   s      r   )r   r   r   r   r   r   r   r   r   r   r   (   s)        A!3AAAAAAAr   r   c                   J    e Zd ZdZdej        deddfdZdej        ddfdZdS )
BaseLockerz&Base class for locker implementations.r   r   r   Nc                     t           )zLock the file.NotImplementedErrorr   s      r   lockzBaseLocker.lock/       !!r   c                     t           )zUnlock the file.r%   r!   s     r   unlockzBaseLocker.unlock3   r(   r   )	r   r   r   __doc__r   r   r   r'   r*   r   r   r   r#   r#   ,   sk        00"U/ "	 "d " " " ""u1 "d " " " " " "r   r#   LOCKERntr   r   c                    t          | t                    r| ddfS t          | t          j                  rp|                                 }|                                 }|dk    r|                     d           |t          j        t          j	        t                   |           |fS t          j        t          j        |                                           }|ddfS )z?Prepare file for Windows: get fd, optionally seek and save pos.Nr   )
isinstanceintioIOBasefilenotellseektypingr   IOr   r   	HasFileno)r   fdoriginal_poss      r   _prepare_windows_filer;   H   s     h$$ 	(T4'' h	** 	Koo''B#==??Lq  a   v{69S>8<<lJJ [(33::<<4~r   file_io_objr:   c                 P    | r||dk    r|                      |           dS dS dS dS )z?Restore file position if it was an IO object and pos was saved.Nr   )r5   )r<   r:   s     r   _restore_windows_file_posr>   ]   sK    
  	+<38I8I\*****	+ 	+338I8Ir   c                   |    e Zd ZU dZeed<   dZeed<   ddZdedefd	Z	d
e
j        deddfdZd
e
j        ddfdZdS )Win32Lockerz1Locker using Win32 API (LockFileEx/UnlockFileEx)._overlappedi  _lock_bytes_lowr   Nc                     	 dd l }n"# t          $ r}t          d          |d }~ww xY w|                                | _        d S )Nr   zMpywintypes is required for Win32Locker but not found. Please install pywin32.)
pywintypesImportError
OVERLAPPEDrA   )r   rD   es      r   __init__zWin32Locker.__init__k   sm    !!!!!   !5  
  *4466D    
&!&r9   c                     	 dd l }n"# t          $ r}t          d          |d }~ww xY wt          t          |                    |                    S )Nr   z?msvcrt is required for _get_os_handle on Windows but not found.)msvcrtrE   r   r0   get_osfhandle)r   r9   rK   rG   s       r   _get_os_handlezWin32Locker._get_os_handleu   sm       !%  
 V11"55666rI   r   r   c                    dd l }dd l}dd l}dd l}t	          |          \  }}}	|                     |          }
d}|t          j        z  r
||j        z  }|t          j	        z  r
||j
        z  }	 |                    |
|d| j        | j                   nO# |j        $ rB}|j        |j        k    r,t!          j        t           j        j        |j        |          | d }~ww xY w	 t+          ||	           d S # t+          ||	           w xY wNr   fh)rD   win32con	win32filewinerrorr;   rM   r   NON_BLOCKINGLOCKFILE_FAIL_IMMEDIATELY	EXCLUSIVELOCKFILE_EXCLUSIVE_LOCK
LockFileExrB   rA   errorERROR_LOCK_VIOLATIONr
   AlreadyLockedLockExceptionLOCK_FAILEDstrerrorr>   )r   r   r   rD   rR   rS   rT   r9   
io_obj_ctxpos_ctxos_fhmode	exc_values                r   r'   zWin32Locker.lock   sd   OOOOOO&;H&E&E#B
G''++EDy-- ;::y** 988?$$4D$8$:J    #   %)FFF$2"0<!*#   %	%  **g>>>>>)*g>>>>s*   .#B C4 
C=CCC4 4Dc                    dd l }dd l}dd l}t          |          \  }}}|                     |          }	 |                    |d| j        | j                   n# |j        $ rF}	|	j        |j	        k    r,t          j        t          j        j        |	j        |          |	Y d }	~	nAd }	~	wt          $ r1}	t          j        t          j        j        |	j        |          |	d }	~	ww xY wt          ||           d S # t          ||           w xY wrO   )rD   rS   rT   r;   rM   UnlockFileExrB   rA   rZ   ERROR_NOT_LOCKEDr
   r]   r^   r_   OSErrorr>   )
r   r   rD   rS   rT   r9   r`   ra   rb   excs
             r   r*   zWin32Locker.unlock   sg   OOO&;H&E&E#B
G''++E?&&1d2D4D    #   <8#<<<$2"0<#   	 =<<<<     .,8L   	 **g>>>>>)*g>>>>s;   "A C7 
C"#<B$C7 $C"1,CC""C7 7D	r   N)r   r   r   r+   r   __annotations__rB   r0   rH   rM   r   r   r   r'   r*   r   r   r   r@   r@   e   s         ??''''	7 	7 	7 	7	7S 	7S 	7 	7 	7 	7	?!3 	?I 	?$ 	? 	? 	? 	?>	?5#5 	?$ 	? 	? 	? 	? 	? 	?r   r@   c                   h    e Zd ZU eed<   dZeed<   ddZdej	        de
ddfd	Zdej	        ddfd
ZdS )MsvcrtLocker_win32_lockeri   _msvcrt_lock_lengthr   Nc                     t                      | _        	 dd l}n"# t          $ r}t          d          |d }~ww xY wg d}g d}t	          ||          D ]&\  }}t          ||          st          |||           'd S )Nr   z2msvcrt is required for MsvcrtLocker but not found.)LK_LOCKLK_RLCKLK_NBLCKLK_UNLCK	LK_NBRLCK)r   r         rv   )r@   rn   rK   rE   ziphasattrsetattr)r   rK   rG   attrsdefaultsattrdefault_vals          r   rH   zMsvcrtLocker.__init__   s    !,D   !H 
 POOE&H%(%9%9 7 7!kvt,, 7FD+6667 7s    
949r   r   c                    dd l }|t          j        z  rJt          d          }|t          j        z  r|t          j        z  }| j                            ||           d S t          |          \  }}}|t          j        z  r|j        n|j        }	 |	                    ||| j
                   n# t          $ rv}	|	j        dv r4t          j        t          j        j        t#          |	          |          |	t          j        t          j        j        t#          |	          |          |	d }	~	ww xY w	 t%          ||           d S # t%          ||           w xY w)Nr   )      !   $   rP   )rK   r   SHAREDrU   rn   r'   r;   rs   rq   lockingro   rh   errnor
   r\   r]   r^   strr>   )
r   r   r   rK   win32_api_flagsr9   r`   ra   rc   rd   s
             r   r'   zMsvcrtLocker.lock   s   MMMy'' "+A,,911 >#y'==O"''/BBB&;H&E&E#B
G 911$^ ?,   
  ! ! !?&666$2"0<I#   %	%
 !.,8	NN   !	!!$ **g>>>>>)*g>>>>s+   B, +E ,
D,6A1D''D,,E Ec           
         dd l }t          |          \  }}}d}	 |                    ||j        | j                   n
# t
          $ r}|j        dk    rd}t          ||           	 | j        	                    |           n# t          j        $ r=}t          j        t          j        j        d|j         d|j         d|          |d }~wt          $ r7}	t          j        t          j        j        d|j         d	|	|          |	d }	~	ww xY wt          j        t          j        j        |j        |          |Y d }~nd }~ww xY w|st          ||           d S d S # |st          ||           w w xY w)
Nr   Fr   Tzmsvcrt unlock failed (z), and win32 fallback failed ()rP   z4), and win32 fallback failed with unexpected error: )rK   r;   r   rt   ro   rh   r   r>   rn   r*   r
   r]   r^   r_   	Exception)
r   r   rK   r9   r`   ra   took_fallback_pathri   	win32_exc	final_excs
             r   r*   zMsvcrtLocker.unlock   sA   MMM&;H&E&E#B
G!&'CO,   
    9??)-& .j'BBB)*11$    &3 ) ) )(6&4@LS\ L L6?6HL L L'	  
  )) % ) ) )(6&4@-S\ - -(- -  (    ))) %2"0<#   	'    @ * C-j'BBBBBC C) C-j'BBBBCs\   !> E 
EE &B E D8CD2DD/E ;E  EE E3rj   )r   r   r   r@   rk   ro   r0   rH   r   r   r   r'   r*   r   r   r   rm   rm      s         """"#*S***	7 	7 	7 	7$	?!3 $	?I $	?$ $	? $	? $	? $	?L-	C5#5 -	C$ -	C -	C -	C -	C -	C -	Cr   rm   _locker_instancesfiler   c                    t          t          t                    rt          j        }nt          t          t                    rt          d         }nt          t          t                    rFt                              t                    }|t                      xt          t          <   }|j        }n%t          dt          t                     d           || |           d S )Nr   mLOCKER must be a BaseLocker instance, a tuple of lock and unlock functions, or a subclass of BaseLocker, got .)
r/   r,   r#   r'   tuple
issubclassr   get	TypeErrortype)r   r   lockerlocker_instances       r   r'   r'   &  s    fj)) 	  F && 	AYFF
++ 	/33F;;O&>DhhF!&)O$)FF'F||' ' '   	tUr   c                    t          t          t                    rt          j        }nt          t          t                    rt          d         }nt          t          t                    rFt                              t                    }|t                      xt          t          <   }|j        }n%t          dt          t                     d           ||            d S )Nr   r   r   )
r/   r,   r#   r*   r   r   r   r   r   r   )r   unlockerr   s      r   r*   r*   >  s    fj)) 	=C]HH&& 	ayHH
++ 	/33F;;O&>DhhF!&)O&-HH'F||' ' '   	r   c                       e Zd ZU dZdZeeeee	j
        f         egef                  ed<   edeeee	j
        f         egef         fd            ZdedefdZdededdfd	Zdeddfd
ZdS )PosixLockerz1Locker implementation using the `LOCKER` constantN_lockerr   c                     | j         Jt          t          t          t          t
          j        f         t          gt          f         t                    S | j         J | j         S r   )	r   r   r   r   r0   r   r8   r   r,   )r   s    r   r   zPosixLocker.lockerc  sV    |#
 eC$893?DEv   <+++<r   r   c                     t          |t                    r|S t          |d          r(t          |j                  r|                                S t          d          )Nr3   zWArgument 'file_obj' must be an int, an IO object with fileno(), or implement HasFileno.)r/   r0   ry   callabler3   r   r!   s     r   _get_fdzPosixLocker._get_fds  se    (C(( 8,, 
(/1J1J 
(((  =  r   r   c                 ,   |t           j        z  r+|t           j        t           j        z  z  st	          d          |                     |          }	 |                     ||           d S # t          $ rn}|j        t          j	        t          j
        fv r%t          j        |t          |          |          |t          j        |t          |          |          |d }~wt          $ r*}t          j        |t          |          |          |d }~ww xY w)NzcWhen locking in non-blocking mode on POSIX, the SHARED or EXCLUSIVE flag must be specified as well.)r_   rQ   )r   rU   r   rW   RuntimeErrorr   r   rh   r   EACCESEAGAINr
   r\   r   r]   EOFError)r   r   r   r9   rd   s        r   r'   zPosixLocker.lock  sQ   	..  9#669  #N  
 h''B!B&&&&& % % %?u|U\&BBB$2!!$Y#   %	% %2!!$Y#   %	%
  ! ! ! . ^^   !	!!s%   A) )
D3A)CD)%DDc                 p    |                      |          }|                     |t          j                   d S r   )r   r   r   UNBLOCK)r   r   r9   s      r   r*   zPosixLocker.unlock  s0    h''BKKI-.....r   )r   r   r   r+   r   r   r   r   r0   r   r8   r   rk   propertyr   PosixFileArgumentr   r   r'   r*   r   r   r   r   r   \  s        ??  	eC0137<=
 	 	 	 
	 HeC,@&A3%G%LM 	  	  	  
	 	$5 	# 	 	 	 	 	!!2 	!9 	! 	! 	! 	! 	!@	/#4 	/ 	/ 	/ 	/ 	/ 	/ 	/r   r   c                        e Zd ZdZej        ZdS )FlockLockerz>FlockLocker is a PosixLocker implementation using fcntl.flock.N)r   r   r   r+   fcntlflockr,   r   r   r   r   r             LLr   r   c                        e Zd ZdZej        ZdS )LockfLockerz>LockfLocker is a PosixLocker implementation using fcntl.lockf.N)r   r   r   r+   r   lockfr,   r   r   r   r   r     r   r   r   c                 <    t                               | |           d S r   )_posix_locker_instancer'   )r   r   s     r   r'   r'     s    ##D%00000r   c                 :    t                               |            d S r   )r   r*   )r   s    r   r*   r*     s    %%d+++++r   ),r+   r1   osr6   r   r   r   r   r    r	   r
   r   r   Protocolr   r   r#   r0   r8   r   r   
LockerTyperk   namer   r7   r;   r>   r@   rm   dictr   r,   r'   r*   r   r   r   r   r   r   r   r   r   r   r   <module>r      s!     
			 				               + * * * * * * * * * 	    6?   B B B B BV_ B B B	" 	" 	" 	" 	" 	" 	" 	" eC()3/45	,
&'	
 	   7d??$	sHVYs^,hsm;	<   *+fin-+sm+ 
+ + + +S? S? S? S? S?j S? S? S?jfC fC fC fC fCz fC fC fCP =ADFFtD,j89BBBF5% i D    0U' D      0 LLLLLL e0%/ABI/ I/ I/ I/ I/j I/ I/ I/V    k   
    k    [F([]]15% 1i 1D 1 1 1 1,U' ,D , , , , , ,r   