
    khD                     x   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j0                  dk(  rdej2                  deeeej4                  e      ee   f   fdZdeej4                  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j2                  deddfdZ"dej2                  ddfdZ#yddl$Z$ddl%Z%eej2                  ej&                  f   Z& G d de      Z' G d d e'      Z( G d! d"e'      Z)e%jT                  Z! e'       Z+dej2                  deddfd#Z"dej2                  ddfd$Z#y)%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                   4    e Zd Zdej                  deddfdZy)LockCallablefile_objflagsreturnNc                      y N selfr   r   s      S/var/www/teggl/fontify/venv/lib/python3.12/site-packages/portalocker/portalocker.py__call__zLockCallable.__call__#   s        )__name__
__module____qualname__r   FileArgument	LockFlagsr   r   r   r   r   r   "   s%    **3<	r   r   c                   0    e Zd Zdej                  ddfdZy)UnlockCallabler   r   Nc                      y 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!3AAr   r   c                   \    e Zd ZdZdej
                  deddfdZdej
                  ddfdZy)
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#   ,   s>    0"U// "	 "d ""u11 "d "r   r#   LOCKERntr   r   c                    t        | t              r| ddfS t        | t        j                        rd| j	                         }| j                         }|dk7  r| j                  d       |t        j                  t        j                  t           |       |fS t        j                  t        j                  |       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		*oo'B#==?Lq a v{{699S>8<lJJ [[(3::<4~r   file_io_objr:   c                 >    | r||dk7  r| j                  |       yyyy)z?Restore file position if it was an IO object and pos was saved.Nr   )r5   )r<   r:   s     r   _restore_windows_file_posr>   ]   s,    
 <38I\* 9J3;r   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y)Win32Lockerz1Locker using Win32 API (LockFileEx/UnlockFileEx)._overlappedi  _lock_bytes_lowr   Nc                 r    	 dd l }|j                         | _        y # t        $ r}t        d      |d }~ww xY w)Nr   zMpywintypes is required for Win32Locker but not found. Please install pywin32.)
pywintypesImportError
OVERLAPPEDrA   )r   rD   es      r   __init__zWin32Locker.__init__k   sF    !  *446D  !5 s    	616r9   c                     	 dd l }t        t        |j	                  |            S # t        $ r}t        d      |d }~ww xY w)Nr   z?msvcrt is required for _get_os_handle on Windows but not found.)msvcrtrE   r   r0   get_osfhandle)r   r9   rJ   rG   s       r   _get_os_handlezWin32Locker._get_os_handleu   sM     V11"566  !% s   % 	?:?r   r   c                 X   dd l }dd l}dd l}dd l}t	        |      \  }}}	| j                  |      }
d}|t        j                  z  r||j                  z  }|t        j                  z  r||j                  z  }	 |j                  |
|d| j                  | j                         	 t+        ||	       y # |j                  $ rZ}|j                  |j                  k(  r;t!        j"                  t         j$                  j&                  |j(                  |      | d }~ww xY w# t+        ||	       w xY wNr   fh)rD   win32con	win32filewinerrorr;   rL   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   rQ   rR   rS   r9   
io_obj_ctxpos_ctxos_fhmode	exc_values                r   r'   zWin32Locker.lock   s   &;H&E#B
G''+EDy---:::y***888?$$4D$8$8$:J:J **g> ## %%)F)FF$22"00<<!**# %	%  **g>s%   8)B/ /D>ADDD D)c                 V   dd l }dd l}dd l}t        |      \  }}}| j	                  |      }	 |j                  |d| j                  | j                         t        ||       y # |j                  $ r^}	|	j                  |j                  k7  r;t        j                  t        j                  j                  |	j                  |      |	Y d }	~	ud }	~	wt        $ r@}	t        j                  t        j                  j                  |	j                  |      |	d }	~	ww xY w# t        ||       w xY wrN   )rD   rR   rS   r;   rL   UnlockFileExrB   rA   rY   ERROR_NOT_LOCKEDr
   r\   r]   r^   OSErrorr>   )
r   r   rD   rR   rS   r9   r_   r`   ra   excs
             r   r*   zWin32Locker.unlock   s	   &;H&E#B
G''+E?&&1d22D4D4D" **g> ## <<8#<#<<$22"00<<# 	 =   ..,,88LL 	 **g>s6   (A# #D2ACD D;DDD D(r   N)r   r   r   r+   r   __annotations__rB   r0   rH   rL   r   r   r   r'   r*   r   r   r   r@   r@   e   sf    ?''	7	7S 	7S 	7	?!3!3 	?I 	?$ 	?>	?5#5#5 	?$ 	?r   r@   c                   z    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y)MsvcrtLocker_win32_lockeri   _msvcrt_lock_lengthr   Nc                     t               | _        	 dd l}g d}g d}t	        ||      D ]  \  }}t        ||      rt        |||       ! y # t        $ r}t        d      |d }~ww xY w)Nr   z2msvcrt is required for MsvcrtLocker but not found.)LK_LOCKLK_RLCKLK_NBLCKLK_UNLCK	LK_NBRLCK)r   r         ru   )r@   rm   rJ   rE   ziphasattrsetattr)r   rJ   rG   attrsdefaultsattrdefault_vals          r   rH   zMsvcrtLocker.__init__   sw    !,D PE&H%(%9 7!kvt,FD+67  !Hs   A 	A&A!!A&r   r   c                    dd l }|t        j                  z  rNt        d      }|t        j                  z  r|t        j                  z  }| j                  j                  ||       y t        |      \  }}}|t        j                  z  r|j                  n|j                  }	 |j                  ||| j                         	 t%        ||       y # t        $ r}	|	j                  dv r:t        j                  t        j                  j                   t#        |	      |      |	t        j                  t        j                  j                   t#        |	      |      |	d }	~	ww xY w# t%        ||       w xY w)Nr   )      !   $   rO   )rJ   r   SHAREDrT   rm   r'   r;   rr   rp   lockingrn   rg   errnor
   r[   r\   r]   strr>   )
r   r   r   rJ   win32_api_flagsr9   r_   r`   rb   rc   s
             r   r'   zMsvcrtLocker.lock   sE   y'''"+A,9111#y'='==O""''/B&;H&E#B
G 9111 ^^ ?,,$ **g>  !??&66$22"00<<I# %	%
 !..,,88	N !	!! **g>s%   !C 	EBEEE E-c           
      F   dd l }t        |      \  }}}d}	 |j                  ||j                  | j                         |st        ||       y y # t
        $ r4}|j                  dk(  rd}t        ||       	 | j                  j                  |       n# t        j                  $ rQ}t        j                  t        j                  j                  d|j                   d|j                   d|      |d }~wt        $ rF}	t        j                  t        j                  j                  d|j                   d	|	|      |	d }	~	ww xY wt        j                  t        j                  j                  |j                  |      |Y d }~Id }~ww xY w# |st        ||       w w xY w)
Nr   Fr   Tzmsvcrt unlock failed (z), and win32 fallback failed ()rO   z4), and win32 fallback failed with unexpected error: )rJ   r;   r   rs   rn   rg   r   r>   rm   r*   r
   r\   r]   r^   	Exception)
r   r   rJ   r9   r_   r`   took_fallback_pathrh   	win32_exc	final_excs
             r   r*   zMsvcrtLocker.unlock   s   &;H&E#B
G!&'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<<# 	'@ *-j'B *s[   'A 
FF6BFE%AC11E=AD>>E>FF FF F ri   )r   r   r   r@   rj   rn   r0   rH   r   r   r   r'   r*   r   r   r   rl   rl      sU    ""#*S*	7$	?!3!3 $	?I $	?$ $	?L-	C5#5#5 -	C$ -	Cr   rl   _locker_instancesfiler   c                 z   t        t        t              rt        j                  }nt        t        t              r
t        d   }not        t        t              r?t        j                  t              }|t               xt        t        <   }|j                  }nt        dt        t               d       || |       y )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)   &AYF
+/33F;O&>DhF!&)O$))FF|nA'  	tUr   c                 x   t        t        t              rt        j                  }nt        t        t              r
t        d   }not        t        t              r?t        j                  t              }|t               xt        t        <   }|j                  }nt        dt        t               d       ||        y )Nr   r   r   )
r/   r,   r#   r*   r   r   r   r   r   r   )r   unlockerr   s      r   r*   r*   >  s    fj)=C]]H&ayH
+/33F;O&>DhF!&)O&--HF|nA'  	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y)PosixLockerz1Locker implementation using the `LOCKER` constantN_lockerr   c                     | j                   >t        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  sY    ||#
 eC$893?DEv  <<+++<<r   r   c                     t        |t              r|S t        |d      r%t        |j                        r|j	                         S t        d      )Nr3   zWArgument 'file_obj' must be an int, an IO object with fileno(), or implement HasFileno.)r/   r0   rx   callabler3   r   r!   s     r   _get_fdzPosixLocker._get_fds  sG    (C(8,(//1J((  = r   r   c                 .   |t         j                  z  r/|t         j                  t         j                  z  z  st	        d      | j                  |      }	 | j                  ||       y # t        $ ru}|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^   rP   )r   rT   r   rV   RuntimeErrorr   r   rg   r   EACCESEAGAINr
   r[   r   r\   EOFError)r   r   r   r9   rc   s        r   r'   zPosixLocker.lock  s   	...  9#6#669 #N 
 h'B!B& %??u||U\\&BB$22!!$Y# %	% %22!!$Y# %	%
  ! .. ^ !	!!s%   A( (	D1A0C!!D-"DDc                 f    | j                  |      }| j                  |t        j                         y r   )r   r   r   UNBLOCK)r   r   r9   s      r   r*   zPosixLocker.unlock  s$    h'BKKI--.r   )r   r   r   r+   r   r   r   r   r0   r   r8   r   rj   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y)FlockLockerz>FlockLocker is a PosixLocker implementation using fcntl.flock.N)r   r   r   r+   fcntlflockr,   r   r   r   r   r         Lr   r   c                   (    e Zd ZdZej
                  Zy)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                 0    t         j                  | |       y r   )_posix_locker_instancer'   )r   r   s     r   r'   r'     s    ##D%0r   c                 .    t         j                  |        y 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   
LockerTyperj   namer   r7   r;   r>   r@   rl   dictr   r,   r'   r*   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   