U
    9¡_Ó   ã                   @   sÚ   d dl Zd dlmZ d dlmZ d dlmZ d dlmZ d dlZd dlZd dl	Z	d dl
Z
e
je	je	jd d dlT e ¡  ejj ¡  G dd	„ d	eƒZG d
d„ dƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZdS )é    N)ÚGObject)ÚGLib)ÚGdk)ÚGtk)ZdomainÚ	localedir)Ú*c                   @   s   e Zd ZdS )ÚOperationCanceledN)Ú__name__Ú
__module__Ú__qualname__© r   r   ú,/usr/share/system-config-printer/timedops.pyr   '   s   r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTimedc                 C   s   d S ©Nr   ©Úselfr   r   r   Úrun+   s    z	Timed.runc                 C   s   dS ©NFr   r   r   r   r   Úcancel.   s    zTimed.cancelN)r	   r
   r   r   r   r   r   r   r   r   *   s   r   c                   @   sF   e Zd Zddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dS )ÚTimedSubprocessé`ê  NTc                 K   sŠ   t jf |Ž| _tƒ | _g | _d| _|| _|| _|| _	| jj
| jjfD ]:}|d k	rDt |tjtjtjB tjB | j¡}| j |¡ qDd | _d S )Né   )Ú
subprocessÚPopenÚsubpÚdictÚoutputÚ	io_sourceÚwatchersÚtimeoutÚparentÚshow_dialogÚstdoutÚstderrr   Zio_add_watchZPRIORITY_DEFAULTÚIO_INÚIO_HUPZIO_ERRÚwatcherÚappendÚwait_window)r   r   r    r!   ÚargsÚfÚsourcer   r   r   Ú__init__2   s(    ÿþûzTimedSubprocess.__init__c                 C   s¶   | j rt d| j¡| _t | j| j¡| _t	 
¡  | jrBt | j¡ | j rTt | j¡ | jD ]}t |¡ qZ| jd k	r~| j ¡  | j | jjd¡ d¡| j | jjd¡ d¡| j ¡ fS )Né   Ú Ú
)r!   r   Ztimeout_add_secondsÚshow_wait_windowZwait_sourceÚtimeout_addr   Ú
do_timeoutÚtimeout_sourcer   ÚmainÚsource_remover   r(   Údestroyr   Úgetr   r"   Úsplitr#   Zpoll)r   r+   r   r   r   r   G   s*    þÿ


þzTimedSubprocess.runc                 C   s   d | _ t ¡  dS r   )r3   r   Ú	main_quitr   r   r   r   r2   \   s    zTimedSubprocess.do_timeoutc                 C   sb   |t j@ r4| j |d¡}|| ¡  d¡7 }|| j|< |t j@ r^|  jd8  _| jdkr^t 	¡  dS )Nr.   zutf-8r-   r   T)
r   r$   r   r7   ÚreadÚdecoder%   r   r   r9   )r   r+   Z	conditionÚbufferr   r   r   r&   a   s    



zTimedSubprocess.watcherc                 C   s’   t  ¡  tj| jddtjjtjjt	dƒd}| 
ddd„ ¡ | 
d| j¡ | jr\| | j¡ | tjj¡ | t	dƒ¡ | ¡  || _t  ¡  d	S )
NTúPlease wait©r    ZmodalZdestroy_with_parentZmessage_typeZbuttonsÚtextÚdelete_eventc                  W   s   dS r   r   ©r)   r   r   r   Ú<lambda>u   ó    z2TimedSubprocess.show_wait_window.<locals>.<lambda>ÚresponseúGathering informationF)r   Zthreads_enterr   ÚMessageDialogr    ÚMessageTypeÚINFOÚButtonsTypeÚCANCELÚ_ÚconnectÚwait_window_responseÚset_transient_forÚset_positionÚWindowPositionÚCENTER_ON_PARENTÚformat_secondary_textÚshow_allr(   Zthreads_leave©r   Úwaitr   r   r   r0   n   s$     üz TimedSubprocess.show_wait_windowc                 C   s   |t jjkr|  ¡  d S r   ©r   ZResponseTyperJ   r   ©r   ZdialogrD   r   r   r   rM   €   s    z$TimedSubprocess.wait_window_responsec                 C   s$   | j dkr tdƒ t ¡  d| _ dS )Nr   úCommand canceledF)r   Ú
debugprintr   r9   r   r   r   r   r   „   s
    
zTimedSubprocess.cancel)r   NT)
r	   r
   r   r,   r   r2   r&   r0   rM   r   r   r   r   r   r   1   s   
r   c                   @   s,   e Zd Zddi fdd„Zdd„ Zdd„ ZdS )	ÚOperationThreadNr   c                 C   s8   t j | ¡ |  d¡ || _|| _|| _d | _d | _d S )NT)	Ú	threadingÚThreadr,   Z	setDaemonÚtargetr)   ÚkwargsÚ	exceptionÚresult)r   r]   r)   r^   r   r   r   r,      s    
zOperationThread.__init__c              
   C   sf   z,t d| j ƒ | j| j| jŽ| _t dƒ W n4 tk
r` } zt d| ƒ || _W 5 d }~X Y nX d S )Nz
Calling %sZDonezCaught exception %s)rY   r]   r)   r^   r`   Ú	Exceptionr_   )r   Úer   r   r   r   –   s    zOperationThread.runc                 C   s    |   ¡ rtƒ ‚| jr| j‚| jS r   )ÚisAliver   r_   r`   r   r   r   r   Úcollect_resultŸ   s
    zOperationThread.collect_result)r	   r
   r   r,   r   rd   r   r   r   r   rZ   Œ   s   		rZ   c                   @   sB   e Zd Zdi ddddfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTimedOperationr   NFc                 C   s\   d | _ || _|| _|| _|| _t|||d| _| j ¡  |d k	| _| jrXt	 
d| j¡| _d S )N)r]   r)   r^   é2   )r(   r    r!   ÚcallbackÚcontextrZ   ÚthreadÚstartÚuse_callbackr   r1   Ú_check_threadr3   )r   r]   r)   r^   r    r!   rg   rh   r   r   r   r,   ª   s    þ

zTimedOperation.__init__c                 C   sÊ   | j r
t‚| jrˆtj| jddtjjtjj	t
dƒd}| ddd„ ¡ | d| j¡ | jrd| | j¡ | tjj¡ | t
dƒ¡ | ¡  t d	| j¡| _t ¡  | jr²t | j¡ | jrÀ| ¡  | j ¡ S )
NTr=   r>   r@   c                  W   s   dS r   r   rA   r   r   r   rB   Ä   rC   z$TimedOperation.run.<locals>.<lambda>rD   rE   rf   )rk   ÚRuntimeErrorr!   r   rF   r    rG   rH   rI   rJ   rK   rL   Ú_wait_window_responserN   rO   rP   rQ   rR   rS   r   r1   rl   r3   r4   r5   r6   ri   rd   rT   r   r   r   r   º   s0     üzTimedOperation.runc                 C   sj   | j  ¡ rdS d| _| jr^| jd k	rf| jd k	rH|  | j j| j j| j¡ qf|  | j j| j j¡ nt 	¡  dS )NTF)
ri   rc   r3   rk   rg   rh   r`   r_   r   r9   r   r   r   r   rl   Ö   s    


ÿzTimedOperation._check_threadc                 C   s   |t jjkr|  ¡  d S r   rV   rW   r   r   r   rn   é   s    z$TimedOperation._wait_window_responsec                 C   s"   t dƒ | jrd | _nt ¡  dS )NrX   F)rY   rk   rg   r   r9   r   r   r   r   r   í   s
    zTimedOperation.cancel)r	   r
   r   r,   r   rl   rn   r   r   r   r   r   re   ©   s     ÿ
re   )Zdbus.mainloop.glibZdbusZgi.repositoryr   r   r   r   r   r[   ZconfigÚgettextÚinstallZPACKAGEr   ÚdebugZthreads_initZmainloopZglibrm   r   r   r   r\   rZ   re   r   r   r   r   Ú<module>   s"   [