B
    x\B                 @   s`   d 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Zddl	m
Z
 G dd deZdd	 ZdS )
zD
This module implements clipboard handling on Windows using ctypes.
    N)c_size_tc_wchar	c_wchar_p	get_errnosizeof   )PyperclipWindowsExceptionc                   s,   e Zd Z fddZdd Zdd Z  ZS )CheckedCallc                s   t t| d| d S )Nf)superr	   __setattr__)selfr
   )	__class__ :lib/python3.7/site-packages/pandas/io/clipboard/windows.py__init__   s    zCheckedCall.__init__c             G   s(   | j | }|s$t r$td| j j |S )NzError calling )r
   r   r   __name__)r   argsZretr   r   r   __call__   s    

zCheckedCall.__call__c             C   s   t | j|| d S )N)setattrr
   )r   keyvaluer   r   r   r      s    zCheckedCall.__setattr__)r   
__module____qualname__r   r   r   __classcell__r   r   )r   r   r	      s   r	   c                 s  ddl m} m}m}m}m}m}m}m}m	}m
}	m}
 tj}t|jj||||||||||||g_|_t|jj|g_|_|jj|g_|_t|jjg _|_t|jjg _|_t|jj|	g_|
_t|jj|	|
g_|
_t|jj	|	tg	_| 	_t|jj
| g
_|
_t|jj| g_|_dd tjfddtjfdd 	
f	d	d
} fdd}||fS )Nr   )HGLOBALLPVOIDDWORDLPCSTRINTHWND	HINSTANCEHMENUBOOLUINTHANDLE      c              3   s8    dddddddddddd} z
| V  W d|  X dS )z=
        Context that provides a valid Windows hwnd.
        r   s   STATICNr   )hwnd)safeCreateWindowExAsafeDestroyWindowr   r   windowM   s
    
z&init_windows_clipboard.<locals>.windowc             3   s^   t   d }d}x(t   |k r8 | }|r,P t d qW |sFtdz
dV  W d  X dS )z
        Context manager that opens the clipboard and prevents
        other applications from modifying the clipboard content.
        g      ?Fg{Gz?zError calling OpenClipboardN)timeZsleepr   )r(   tZsuccess)OpenClipboardsafeCloseClipboardr   r   	clipboard[   s    	
z)init_windows_clipboard.<locals>.clipboardc          
      s    z}|f   | rrt | d }|tt }|}tt|t| |tt  |  | W d Q R X W d Q R X d S )Nr   )lenr   r   ctypesZmemmover   )textr(   counthandleZlocked_handle)	CF_UNICODETEXTGMEM_MOVEABLEr0   safeEmptyClipboardsafeGlobalAllocsafeGlobalLocksafeGlobalUnlocksafeSetClipboardDatar+   r   r   copy_windowss   s    

z,init_windows_clipboard.<locals>.copy_windowsc           	      s.   d   } | sdS t | jS Q R X d S )N )r   r   )r5   )r6   r0   safeGetClipboardDatar   r   paste_windows   s
    
z-init_windows_clipboard.<locals>.paste_windows) Zctypes.wintypesr   r   r   r   r   r    r!   r"   r#   r$   r%   r2   windllr	   Zuser32ZCreateWindowExAZargtypesZrestypeZDestroyWindowr.   ZCloseClipboardZEmptyClipboardZGetClipboardDataZSetClipboardDataZkernel32ZGlobalAllocr   Z
GlobalLockZGlobalUnlock
contextlibcontextmanager)r   r   r   r   r   r    r!   r"   r#   r$   r%   rA   r=   r@   r   )r6   r7   r.   r0   r/   r)   r*   r8   r?   r9   r:   r;   r<   r+   r   init_windows_clipboard   sP    4

rD   )__doc__rB   r2   r   r   r   r   r   r,   
exceptionsr   objectr	   rD   r   r   r   r   <module>   s   