
    <iD                        % S r SSKrSSKrSSKrSSKJrJrJrJrJr  SSK	J
r
JrJr  \
R                  r " S S\R                  5      r " S S	\R                  5      r " S
 S5      r\\\\\R&                  4   \/\4   \\\4   \\\   4   r\\S'   \R0                  S:X  a  S\R2                  S\\\\R4                  \      \\   4   4S jrS\\R4                  \      S\\   SS4S jr " S S\5      r " S S\5      r\" 5       r \\\   \4   \S'   \r!S\R2                  S\SS4S jr"S\R2                  SS4S jr#gSSK$r$SSK%r%\\R2                  \R&                  4   r& " S S\5      r' " S S \'5      r( " S! S"\'5      r)\%RT                  r!\'" 5       r+S\R2                  S\SS4S# jr"S\R2                  SS4S$ jr#g)%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                   >    \ rS rSrS\R
                  S\SS4S jrSrg)LockCallable"   file_objflagsreturnNc                     g N selfr   r   s      Q/home/james-whalen/.local/lib/python3.13/site-packages/portalocker/portalocker.py__call__LockCallable.__call__#   s        r   )	__name__
__module____qualname____firstlineno__r   FileArgument	LockFlagsr   __static_attributes__r   r   r   r   r   "   s%    **3<	r   r   c                   :    \ rS rSrS\R
                  SS4S jrSrg)UnlockCallable(   r   r   Nc                     g r   r   r   r   s     r   r   UnlockCallable.__call__)   s    cr   r   )r   r   r   r   r   r   r   r!   r   r   r   r#   r#   (   s    A!3!3AAr   r#   c                   h    \ rS rSrSrS\R                  S\SS4S jrS\R                  SS4S jr	S	r
g)

BaseLocker,   z&Base class for locker implementations.r   r   r   Nc                     [         e)zLock the file.NotImplementedErrorr   s      r   lockBaseLocker.lock/       !!r   c                     [         e)zUnlock the file.r,   r&   s     r   unlockBaseLocker.unlock3   r0   r   r   )r   r   r   r   __doc__r   r   r    r.   r2   r!   r   r   r   r)   r)   ,   s>    0"U// "	 "d ""u11 "d "r   r)   LOCKERntr   r   c                    [        U [        5      (       a  U SS4$ [        U [        R                  5      (       af  U R	                  5       nU R                  5       nUS:w  a  U R                  S5        U[        R                  " [        R                  [           U 5      U4$ [        R                  " [        R                  U 5      R	                  5       nUSS4$ )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_filerD   H   s     h$$T4'' h		**oo'B#==?Lq a v{{699S>8<lJJ [[(3::<4~r   file_io_objrC   c                 L    U (       a  Ub  US:w  a  U R                  U5        gggg)z?Restore file position if it was an IO object and pos was saved.Nr   )r>   )rE   rC   s     r   _restore_windows_file_posrG   ]   s,    
 <38I\* 9J3;r   c                       \ rS rSr% Sr\\S'   Sr\\S'   SS jr	S	\S\4S
 jr
S\R                  S\SS4S jrS\R                  SS4S jrSrg)Win32Lockere   z1Locker using Win32 API (LockFileEx/UnlockFileEx)._overlappedi  _lock_bytes_lowr   Nc                 t     SS K nUR                  5       U l        g ! [         a  n[        S5      UeS nAff = f)Nr   zMpywintypes is required for Win32Locker but not found. Please install pywin32.)
pywintypesImportError
OVERLAPPEDrK   )r   rN   es      r   __init__Win32Locker.__init__k   sF    !  *446D  !5 s    
727rB   c                      SS K n[        [        UR	                  U5      5      $ ! [         a  n[        S5      UeS nAff = f)Nr   z?msvcrt is required for _get_os_handle on Windows but not found.)msvcrtrO   r   r9   get_osfhandle)r   rB   rU   rQ   s       r   _get_os_handleWin32Locker._get_os_handleu   sM     V11"566  !% s   % 
A ;A r   r   c                 `   SS K nSS KnSS KnSS Kn[	        U5      u  pxn	U R                  U5      n
SnU[        R                  -  (       a  XR                  -  nU[        R                  -  (       a  XR                  -  n UR                  XSU R                  U R                  5         [+        X5        g ! UR                   aY  nUR                  UR                  :X  a9  [         R"                  " [         R$                  R&                  UR(                  US9Uee S nAff = f! [+        X5        f = fNr   fh)rN   win32con	win32filewinerrorrD   rW   r    NON_BLOCKINGLOCKFILE_FAIL_IMMEDIATELY	EXCLUSIVELOCKFILE_EXCLUSIVE_LOCK
LockFileExrL   rK   errorERROR_LOCK_VIOLATIONr
   AlreadyLockedLockExceptionLOCK_FAILEDstrerrorrG   )r   r   r   rN   r]   r^   r_   rB   
io_obj_ctxpos_ctxos_fhmode	exc_values                r   r.   Win32Locker.lock   s   &;H&E#BG''+EDy---:::y***888?$$D$8$8$:J:J **> ## %%)F)FF$22"00<<!**# %	%  **>s%   ?(B4 4DADDD   D-c                 N   SS K nSS KnSS Kn[        U5      u  pVnU R	                  U5      n UR                  USU R                  U R                  5        [        Xg5        g ! UR                   a]  n	U	R                  UR                  :w  a9  [        R                  " [        R                  R                  U	R                  US9U	e S n	A	NtS n	A	f[         a>  n	[        R                  " [        R                  R                  U	R                  US9U	eS n	A	ff = f! [        Xg5        f = frZ   )rN   r^   r_   rD   rW   UnlockFileExrL   rK   re   ERROR_NOT_LOCKEDr
   rh   ri   rj   OSErrorrG   )
r   r   rN   r^   r_   rB   rk   rl   rm   excs
             r   r2   Win32Locker.unlock   s   &;H&E#BG''+E?&&1d22D4D4D" **> ## <<8#<#<<$22"00<<# 	 =   ..,,88LL 	 **>s6   (A! !D1AC	D 	D9DDD D$)rK   r   N)r   r   r   r   r4   r   __annotations__rL   r9   rR   rW   r   r   r    r.   r2   r!   r   r   r   rI   rI   e   sf    ?''	7	7S 	7S 	7	?!3!3 	?I 	?$ 	?>	?5#5#5 	?$ 	?r   rI   c                       \ rS rSr% \\S'   Sr\\S'   SS jrS\	R                  S	\SS4S
 jrS\	R                  SS4S jrSrg)MsvcrtLocker   _win32_lockeri   _msvcrt_lock_lengthr   Nc                     [        5       U l         SS Kn/ SQn/ SQn[	        X45       H#  u  pV[        X5      (       a  M  [        XU5        M%     g ! [         a  n[        S5      UeS nAff = f)Nr   z2msvcrt is required for MsvcrtLocker but not found.)LK_LOCKLK_RLCKLK_NBLCKLK_UNLCK	LK_NBRLCK)r   r         r   )rI   r|   rU   rO   ziphasattrsetattr)r   rU   rQ   attrsdefaultsattrdefault_vals          r   rR   MsvcrtLocker.__init__   sm    !,D PE&H%(%9!v,,F+6 &:  !Hs   A 
A+A&&A+r   r   c                    SS K nU[        R                  -  (       aR  [        S5      nU[        R                  -  (       a  U[        R                  -  nU R                  R                  X5        g [        U5      u  pVnU[        R                  -  (       a  UR                  OUR                  n UR                  UUU R                  5         [%        Xg5        g ! [         a  n	U	R                  S;   a8  [        R                  " [        R                  R                   [#        U	5      US9U	e[        R                  " [        R                  R                   [#        U	5      US9U	eS n	A	ff = f! [%        Xg5        f = f)Nr   )      !   $   r[   )rU   r    SHAREDr`   r|   r.   rD   r   r   lockingr}   rt   errnor
   rg   rh   ri   strrG   )
r   r   r   rU   win32_api_flagsrB   rk   rl   rn   ro   s
             r   r.   MsvcrtLocker.lock   s=   y'''"+A,9111#y'='==O""''B&;H&E#BG 9111 ^^ ?,,$ **>  !??&66$22"00<<I# %	%
 !..,,88	N !	!! **>s%   .C 
E'"B E""E''E* *E7c           
      L   SS K n[        U5      u  p4nSn UR                  UUR                  U R                  5        U(       d  [        XE5        g g ! [
         Ga/  nUR                  S:X  a  Sn[        XE5         U R                  R                  U5         S nAN]! [        R                   aO  n[        R                  " [        R                  R                  SUR                   SUR                   S3US9UeS nAf[         aE  n	[        R                  " [        R                  R                  SUR                   S	U	< 3US9U	eS n	A	ff = f[        R                  " [        R                  R                  UR                  US9UeS nAff = f! U(       d  [        XE5        f f = f)
Nr   Fr   Tzmsvcrt unlock failed (z), and win32 fallback failed ()r[   z4), and win32 fallback failed with unexpected error: )rU   rD   r   r   r}   rt   r   rG   r|   r2   r
   rh   ri   rj   	Exception)
r   r   rU   rB   rk   rl   took_fallback_pathru   	win32_exc	final_excs
             r   r2   MsvcrtLocker.unlock   s   &;H&E#BG!&'COO,,J *-jB *A  99?)-& .jB)**11$  &33 )(66&44@@4S\\N C66?6H6H5IL'	
  )) % )(66&44@@4S\\N CL(m-  (  ))) %22"00<<# 	5@ *-jB *sU   'A FF:BF E
.A
C88E
A EE

<FFF F#)r|   rw   )r   r   r   r   rI   rx   r}   r9   rR   r   r   r    r.   r2   r!   r   r   r   rz   rz      sU    ""#*S*	7$	?!3!3 $	?I $	?$ $	?L-	C5#5#5 -	C$ -	Cr   rz   _locker_instancesfiler   c                    [        [        [        5      (       a  [        R                  nO[        [        [        5      (       a
  [        S   nOu[        [        [        5      (       a@  [        R                  [        5      nUc  [        5       =[        [        '   nUR                  nO[        S[        [        5       S35      eU" X5        g )Nr   mLOCKER must be a BaseLocker instance, a tuple of lock and unlock functions, or a subclass of BaseLocker, got .)
r8   r5   r)   r.   tuple
issubclassr   get	TypeErrortype)r   r   lockerlocker_instances       r   r.   r.   &  s    fj))   &&AYF
++/33F;O&>DhF!&)O$))FF|nA'  	tr   c                    [        [        [        5      (       a  [        R                  nO[        [        [        5      (       a
  [        S   nOu[        [        [        5      (       a@  [        R                  [        5      nUc  [        5       =[        [        '   nUR                  nO[        S[        [        5       S35      eU" U 5        g )Nr   r   r   )
r8   r5   r)   r2   r   r   r   r   r   r   )r   unlockerr   s      r   r2   r2   >  s    fj))=C]]H&&ayH
++/33F;O&>DhF!&)O&--HF|nA'  	r   c                       \ rS rSr% SrSr\\\\	\
R                  4   \	/\4      \S'   \S\\\	\
R                  4   \	/\4   4S j5       rS\S\	4S jrS\S	\SS4S
 jrS\SS4S jrSrg)PosixLockeri\  z1Locker implementation using the `LOCKER` constantN_lockerr   c                     U R                   c>  [        [        [        [        [
        R                  4   [        /[        4   [        5      $ U R                   c   eU R                   $ r   )	r   r   r   r   r9   r   rA   r   r5   )r   s    r   r   PosixLocker.lockerc  sY    ||#
 eC$893?DEv  <<+++<<r   r   c                     [        U[        5      (       a  U$ [        US5      (       a*  [        UR                  5      (       a  UR	                  5       $ [        S5      e)Nr<   zWArgument 'file_obj' must be an int, an IO object with fileno(), or implement HasFileno.)r8   r9   r   callabler<   r   r&   s     r   _get_fdPosixLocker._get_fds  sP    (C((8,,(//1J1J((  = r   r   c                 <   U[         R                  -  (       a4  U[         R                  [         R                  -  -  (       d  [	        S5      eU R                  U5      n U R                  X25        g ! [         as  nUR                  [        R                  [        R                  4;   a   [        R                  " U[        U5      US9Ue[        R                  " U[        U5      US9UeS nAf[         a%  n[        R                  " U[        U5      US9UeS nAff = f)NzcWhen locking in non-blocking mode on POSIX, the SHARED or EXCLUSIVE flag must be specified as well.)rj   r\   )r    r`   r   rb   RuntimeErrorr   r   rt   r   EACCESEAGAINr
   rg   r   rh   EOFError)r   r   r   rB   ro   s        r   r.   PosixLocker.lock  s   	...  9#6#669 #N 
 h'B!B& %??u||U\\&BB$22!!$Y# %	% %22!!$Y# %	%
  ! .. ^ !	!!s%   A1 1
D;A.C))D6 DDc                 f    U R                  U5      nU R                  U[        R                  5        g r   )r   r   r    UNBLOCK)r   r   rB   s      r   r2   PosixLocker.unlock  s$    h'BKKI--.r   r   )r   r   r   r   r4   r   r   r   r   r9   r   rA   r   rx   propertyr   PosixFileArgumentr   r    r.   r2   r!   r   r   r   r   r   \  s    ?  	eC0137<=
 	 
	 HeC,@&A3%G%LM 	  
	 	$5 	# 	 	!!2 	!9 	! 	!@	/#4 	/ 	/r   r   c                   0    \ rS rSrSr\R                  rSrg)FlockLockeri  z>FlockLocker is a PosixLocker implementation using fcntl.flock.r   N)	r   r   r   r   r4   fcntlflockr5   r!   r   r   r   r   r         Lr   r   c                   0    \ rS rSrSr\R                  rSrg)LockfLockeri  z>LockfLocker is a PosixLocker implementation using fcntl.lockf.r   N)	r   r   r   r   r4   r   lockfr5   r!   r   r   r   r   r     r   r   r   c                 .    [         R                  X5        g r   )_posix_locker_instancer.   )r   r   s     r   r.   r.     s    ##D0r   c                 .    [         R                  U 5        g r   )r   r2   )r   s    r   r2   r2     s    %%d+r   ),r4   r:   osr?   r   r   r   r   r    r	   r
   r   r    Protocolr   r#   r)   r9   rA   r   r   
LockerTyperx   namer   r@   rD   rG   rI   rz   dictr   r5   r.   r2   r   r   r   r   r   r   r   r   r   r   r   <module>r      s8   
 	   + * 	6?? BV__ B	" 	" eC()3/45	,
&'	
 	 77d?$$	sHVYYs^,hsm;	<*+fiin-+sm+ 
+S?j S?jfCz fCP =AFtD,j89BF5%% i D 0U'' D 0  e00%//ABI/j I/Vk 
k  [[F(]15%% 1i 1D 1,U'' ,D ,r   