U
    ꥡ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 )
OVERLAPPEDZInternalZInternalHighZOffsetZ
OffsetHighZPointerZhEventN)	__name__
__module____qualname__LPVOIDctypeswintypesDWORDHANDLE_fields_ r   r   =/tmp/pip-unpacked-wheel-thtqfo2i/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   s   | |B S r   r   xyr   r   r   <lambda>       r1   c                 C   s   | |B S r   r   r.   r   r   r   r1      r2   i   i   c                 C   s|   g }|dkrxt | td }t |tjj }t ||j}|	|j
|df |j}|dkrbqx| |d  } ||8 }q|S )Nr   zutf-16)r   castLPFNI	addressofr(   r,   offset	string_atr+   appendr*   decoder)   )Z
readBufferZnBytesresultsZfniptrfilenameZ	numToSkipr   r   r   _parse_event_buffer  s    
r=   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    
rE   c                  C   sT   t d} tdtt| | jd}t |}t t	}t 
|t || ||fS )N.r   zutf-8)r   r>   r(   FILE_ACTION_DELETED_SELFlenr    encodesizeofcreate_string_bufferr?   memmover5   )rC   eventZ
event_sizerD   r   r   r   %_generate_observed_path_deleted_event0  s    


rN   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)rC   r   r   r   get_directory_handle:  s       rT   c                 C   sV   zt | d  t|  W n: tk
rP   zt|  W n tk
rJ   Y Y d S X Y nX d S r   )
CancelIoExCloseHandleOSError	Exception)rB   r   r   r   close_directory_handle@  s    
rY   c              
   C   s   t t}t j }z*t| t |t||tt |dd W nX t	k
r } z:|j
tkrjg df W Y "S t| |rt  W Y 
S |W 5 d}~X Y nX |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   rK   BUFFER_SIZEr   r   ReadDirectoryChangesWbyrefrH   WATCHDOG_FILE_NOTIFY_FLAGSrW   winerrorERROR_OPERATION_ABORTEDrE   rN   rawintr    )rB   rC   	recursiveZevent_buffernbyteser   r   r   read_directory_changesK  s$    

   

re   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)selfrg   rh   r   r   r   __init__e  s    zWinAPINativeEvent.__init__c                 C   s
   | j tkS r   )rg   FILE_ACTION_CREATEDri   r   r   r   is_addedi  s    zWinAPINativeEvent.is_addedc                 C   s
   | j tkS r   )rg   FILE_ACTION_REMOVEDrl   r   r   r   
is_removedm  s    zWinAPINativeEvent.is_removedc                 C   s
   | j tkS r   )rg   FILE_ACTION_MODIFIEDrl   r   r   r   is_modifiedq  s    zWinAPINativeEvent.is_modifiedc                 C   s
   | j tkS r   )rg   FILE_ACTION_RENAMED_OLD_NAMErl   r   r   r   is_renamed_oldu  s    z WinAPINativeEvent.is_renamed_oldc                 C   s
   | j tkS r   )rg   FILE_ACTION_RENAMED_NEW_NAMErl   r   r   r   is_renamed_newy  s    z WinAPINativeEvent.is_renamed_newc                 C   s
   | j tkS r   )rg   FILE_ACTION_REMOVED_SELFrl   r   r   r   is_removed_self}  s    z!WinAPINativeEvent.is_removed_selfc                 C   s   dt | j| j| jf S )Nz<%s: action=%d, src_path=%r>)typer   rg   rh   rl   r   r   r   __repr__  s
      zWinAPINativeEvent.__repr__N)r   r   r   rj   propertyrm   ro   rq   rs   ru   rw   ry   r   r   r   r   rf   d  s   





rf   c                 C   s(   t | ||\}}t||}dd |D S )Nc                 S   s   g | ]\}}t ||qS r   )rf   ).0rg   rh   r   r   r   
<listcomp>  s     zread_events.<locals>.<listcomp>)re   r=   )rB   rC   rb   bufrc   eventsr   r   r   read_events  s    
r   )TZctypes.wintypesr   	functoolsr   r   r   c_void_pr    r$   ZFILE_NOTIFY_CHANGE_FILE_NAMEZFILE_NOTIFY_CHANGE_DIR_NAMEZFILE_NOTIFY_CHANGE_ATTRIBUTESZFILE_NOTIFY_CHANGE_SIZEZFILE_NOTIFY_CHANGE_LAST_WRITEZFILE_NOTIFY_CHANGE_LAST_ACCESSZFILE_NOTIFY_CHANGE_CREATIONZFILE_NOTIFY_CHANGE_SECURITYZFILE_FLAG_BACKUP_SEMANTICSZFILE_FLAG_OVERLAPPEDrP   ZFILE_SHARE_READZFILE_SHARE_WRITEZFILE_SHARE_DELETErR   rA   rk   ZFILE_ACTION_DELETEDrp   rr   rt   rG   ZFILE_ACTION_OVERFLOWZFILE_ACTION_ADDEDrn   rv   ZTHREAD_TERMINATEZWAIT_ABANDONEDZWAIT_IO_COMPLETIONZWAIT_OBJECT_0ZWAIT_TIMEOUTr_   	Structurer   r#   r%   r&   ZWinDLLr'   r[   ZBOOLrestypeerrcheckr   r   POINTERargtypesrO   ZLPCWSTRrV   rU   ZCreateEventWZCreateEventZSetEventZWaitForSingleObjectExZCreateIoCompletionPortZGetQueuedCompletionStatusZPostQueuedCompletionStatusr@   ZLPWSTRr(   r4   rS   rQ   r]   rZ   r?   r=   rE   rN   rT   rY   re   rf   r   r   r   r   r   <module>&   s<  














	
"