o
    *ήc4                  
   @   s  d dl Zd dlmZ ejjZedjZdZ	dZ
dZdZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZeZ eZ!eZ"dZ#dZ$dZ%d Z&dZ'dZ(G dd dej)Z*dd Z+dd Z,dd Z-e.dZ/e/j0Z0ejj1e0_2e+e0_3ejj4eejj5ejj1ejj5e6ejj5e6e*efe0_7e/j8Z8ejj4e8_2e,e8_3ejj9ejj5ejj5eejj5ejj5ejj4fe8_7e/j:Z:ejj1e:_2ejj4fe:_7e/j;Z;ejj1e;_2e+e;_3ejj4e6e*fe;_7e/j<Z=ejj4e=_2e,e=_3eejj1ejj1ejj9fe=_7e/j>Z>ejj1e>_2e+e>_3ejj4fe>_7e/j?Z?ejj5e?_2e-e?_3ejj4ejj5ejj1fe?_7e/j@Z@ejj4e@_2e,e@_3ejj4ejj4eejj5fe@_7e/jAZAejj1eA_2e+eA_3ejj4eee6e*ejj5feA_7e/jBZBejj1eB_2e+eB_3ejj4ejj5ejj5e6e*feB_7e/jCZCejj5eC_2e-eC_3ejj4ejjDejj5ejj5feC_7G dd  d ej)ZEe6eEZFeZGed!d" eeegZHed#d" e	e
eeeeeegZId$ZJd%ZKd&d' ZLd(d) ZMd*d+ ZNd,d- ZOd.d/ ZPd0d1 ZQG d2d3 d3ZRd4d5 ZSdS )6    N)reduce                   @      i   i   @      i  i        i  i  c                   @   s@   e Zd ZdefdefdejjfdejjfdefdejjfgZdS )
OVERLAPPEDInternalInternalHighOffset
OffsetHighPointerhEventN)	__name__
__module____qualname__LPVOIDctypeswintypesDWORDHANDLE_fields_ r    r    @/tmp/pip-target-vg8gfxp4/lib/python/watchdog/observers/winapi.pyr   \   s    


r   c                 C   s   | st  |S Nr   WinErrorvaluefuncargsr    r    r!   _errcheck_boolf   s   r)   c                 C   s    | st  | tkrt  |S r"   )r   r$   INVALID_HANDLE_VALUEr%   r    r    r!   _errcheck_handlel   s
   r+   c                 C   s   | dkrt  |S )Nl    r#   r%   r    r    r!   _errcheck_dwordt   s   r,   kernel32c                   @   s:   e Zd Zdejjfdejjfdejjfdejd fgZdS )FILE_NOTIFY_INFORMATIONNextEntryOffsetActionFileNameLengthFileNamer   N)r   r   r   r   r   r   c_charr   r    r    r    r!   r.      s    


r.   c                 C      | |B S r"   r    xyr    r    r!   <lambda>       r8   c                 C   r4   r"   r    r5   r    r    r!   r8      r9   i   i   c                 C   s   g }|dkrAt | td }t |tjj }t ||j}|	|j
|df |j}|dkr3	 |S | |d  } ||8 }|dks|S )Nr   zutf-16)r   castLPFNI	addressofr.   r2   offset	string_atr1   appendr0   decoder/   )
readBuffernBytesresultsfniptrfilename	numToSkipr    r    r!   _parse_event_buffer  s   rH   c                 C   s"   t t}t| |tt |j|kS r"   )r   create_unicode_bufferPATH_BUFFER_SIZEGetFinalPathNameByHandleWVOLUME_NAME_NTr&   )handlepathbuffr    r    r!   _is_observed_path_deleted'  s   

rP   c                  C   sT   t d} tdtt| | jd}t |}t t	}t 
|t || ||fS )N.r   zutf-8)r   rI   r.   FILE_ACTION_DELETED_SELFlenr&   encodesizeofcreate_string_bufferrJ   memmover<   )rN   event
event_sizerO   r    r    r!   %_generate_observed_path_deleted_event0  s   


rZ   c                 C   s   t | ttdttdS )z9Returns a Windows handle to the specified directory path.N)CreateFileWFILE_LIST_DIRECTORYWATCHDOG_FILE_SHARE_FLAGSOPEN_EXISTINGWATCHDOG_FILE_FLAGS)rN   r    r    r!   get_directory_handle:  s   r`   c                 C   sP   zt | d  t|  W d S  ty'   zt|  W Y d S  ty&   Y Y d S w w r"   )
CancelIoExCloseHandleOSError	Exception)rM   r    r    r!   close_directory_handle@  s   
re   c              
   C   s   t t}t j }zt| t |t||tt |dd W n+ t	yJ } z|j
tkr6g dfW  Y d}~S t| |rDt W  Y d}~S |d}~ww |jt|jfS )zRead changes to the directory using the specified directory handle.

    http://timgolden.me.uk/pywin32-docs/win32file__ReadDirectoryChangesW_meth.html
    Nr   )r   rV   BUFFER_SIZEr   r   ReadDirectoryChangesWbyrefrS   WATCHDOG_FILE_NOTIFY_FLAGSrc   winerrorERROR_OPERATION_ABORTEDrP   rZ   rawintr&   )rM   rN   	recursiveevent_buffernbyteser    r    r!   read_directory_changesK  s"   




rr   c                   @   sd   e Zd Zdd Zedd Zedd Zedd Zed	d
 Zedd Z	edd Z
dd ZdS )WinAPINativeEventc                 C   s   || _ || _d S r"   )actionsrc_path)selfrt   ru   r    r    r!   __init__e  s   
zWinAPINativeEvent.__init__c                 C   
   | j tkS r"   )rt   FILE_ACTION_CREATEDrv   r    r    r!   is_addedi     
zWinAPINativeEvent.is_addedc                 C   rx   r"   )rt   FILE_ACTION_REMOVEDrz   r    r    r!   
is_removedm  r|   zWinAPINativeEvent.is_removedc                 C   rx   r"   )rt   FILE_ACTION_MODIFIEDrz   r    r    r!   is_modifiedq  r|   zWinAPINativeEvent.is_modifiedc                 C   rx   r"   )rt   FILE_ACTION_RENAMED_OLD_NAMErz   r    r    r!   is_renamed_oldu  r|   z WinAPINativeEvent.is_renamed_oldc                 C   rx   r"   )rt   FILE_ACTION_RENAMED_NEW_NAMErz   r    r    r!   is_renamed_newy  r|   z WinAPINativeEvent.is_renamed_newc                 C   rx   r"   )rt   FILE_ACTION_REMOVED_SELFrz   r    r    r!   is_removed_self}  r|   z!WinAPINativeEvent.is_removed_selfc                 C   s   dt | j| j| jf S )Nz<%s: action=%d, src_path=%r>)typer   rt   ru   rz   r    r    r!   __repr__  s   zWinAPINativeEvent.__repr__N)r   r   r   rw   propertyr{   r~   r   r   r   r   r   r    r    r    r!   rs   d  s    





rs   c                 C   s(   t | ||\}}t||}dd |D S )Nc                 S   s   g | ]	\}}t ||qS r    )rs   ).0rt   ru   r    r    r!   
<listcomp>  s    zread_events.<locals>.<listcomp>)rr   rH   )rM   rN   rn   bufrp   eventsr    r    r!   read_events  s   
r   )Tctypes.wintypesr   	functoolsr   r   r   c_void_pr&   r*   FILE_NOTIFY_CHANGE_FILE_NAMEFILE_NOTIFY_CHANGE_DIR_NAMEFILE_NOTIFY_CHANGE_ATTRIBUTESFILE_NOTIFY_CHANGE_SIZEFILE_NOTIFY_CHANGE_LAST_WRITEFILE_NOTIFY_CHANGE_LAST_ACCESSFILE_NOTIFY_CHANGE_CREATIONFILE_NOTIFY_CHANGE_SECURITYFILE_FLAG_BACKUP_SEMANTICSFILE_FLAG_OVERLAPPEDr\   FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETEr^   rL   ry   FILE_ACTION_DELETEDr   r   r   rR   FILE_ACTION_OVERFLOWFILE_ACTION_ADDEDr}   r   THREAD_TERMINATEWAIT_ABANDONEDWAIT_IO_COMPLETIONWAIT_OBJECT_0WAIT_TIMEOUTrk   	Structurer   r)   r+   r,   WinDLLr-   rg   BOOLrestypeerrcheckr   r   POINTERargtypesr[   LPCWSTRrb   ra   CreateEventWCreateEventSetEventWaitForSingleObjectExCreateIoCompletionPortGetQueuedCompletionStatusPostQueuedCompletionStatusrK   LPWSTRr.   r;   r_   r]   ri   rf   rJ   rH   rP   rZ   r`   re   rr   rs   r   r    r    r    r!   <module>   s>  %














	
"