o
    ÇÜb(  ã                   @   sŒ   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZddlm	Z	 G dd„ dej
jƒZdd	„ Zd
d„ Zdd„ Zdd„ ZG dd„ de	ƒZdS )é    N)ÚGdk)ÚGLibé   )ÚvmmGObjectUIc                       sL   e Zd Zdd„ Zdd„ Zdd„ Z‡ fdd„Z‡ fd	d
„Z‡ fdd„Z‡  Z	S )Ú	_vmmMeterc                 C   s(   t jjj| dd || _|| _|| _d S )NT)Úquiet)ÚvirtinstÚprogressÚMeterÚ__init__Ú_pbar_pulseÚ_pbar_fractionÚ
_pbar_done)ÚselfÚ
pbar_pulseÚpbar_fractionÚ	pbar_done© r   ú//usr/share/virt-manager/virtManager/asyncjob.pyr      s   
z_vmmMeter.__init__c                 C   sv   | j d u r|  d| j¡ d S tjj | j¡}tjj | j	j
 ¡ d¡}| j	j
 ¡ }d|d ||f }|  ||| j¡ d S )NÚ Tz%3i%% %5sB %s ETAéd   )Ú_sizer   Ú_textr   r	   r
   Úformat_numberÚ_total_readÚformat_timeÚ_meterÚreÚremaining_timeÚfraction_readr   )r   ÚfreadÚrtimeÚfracÚoutr   r   r   Ú_write!   s   
ÿz_vmmMeter._writec                 C   s   t | jjƒS ©N)Úboolr   Ú
start_time©r   r   r   r   Ú
is_started1   s   z_vmmMeter.is_startedc                    ó   t ƒ j|i |¤Ž |  ¡  d S r%   )ÚsuperÚstartr$   ©r   ÚargsÚkwargs©Ú	__class__r   r   r,   9   ó   z_vmmMeter.startc                    r*   r%   )r+   Úupdater$   r-   r0   r   r   r3   =   r2   z_vmmMeter.updatec                    r*   r%   )r+   Úendr   r-   r0   r   r   r4   A   r2   z_vmmMeter.end)
Ú__name__Ú
__module__Ú__qualname__r   r$   r)   r,   r3   r4   Ú__classcell__r   r   r0   r   r      s    r   c              
   O   s†   z| |g|¢R i |¤Ž W d S  t yB } z(t|tjƒr*| ¡ r*|jr*W Y d }~d S | t|ƒd t	 
¡ ¡¡ W Y d }~d S d }~ww )Nr   )Ú	ExceptionÚ
isinstanceÚlibvirtÚlibvirtErrorÚ
can_cancelÚjob_canceledÚ	set_errorÚstrÚjoinÚ	tracebackÚ
format_exc)ÚcallbackÚasyncjobr.   r/   Úer   r   r   Ú
cb_wrapperF   s   ÿþ(€ùrG   c                 C   sB   | r|r
|| |ƒ n|d |  } |j j| |d |r|ƒ  d S d S )Nz: )Údetails)ÚerrÚshow_err)ÚerrorrH   ÚparentÚ
errorintroÚerrorcbÚ	finish_cbr   r   r   Ú_simple_async_done_cbS   s   ÿ
ÿrP   c
              
      sF   ˆ }
|r‡ fdd„}|}
t |
|t||||	f|||j|d}| ¡  dS )zÉ
    @show_progress: Whether to actually show a progress dialog
    @simplecb: If true, build a callback wrapper that ignores the asyncjob
               param that's passed to every cb by default
    c                    s   | }ˆ |i |¤Ž d S r%   r   )Újobr.   r/   Úignore©rD   r   r   Útmpcbj   s   z_simple_async.<locals>.tmpcb)Úshow_progressN)ÚvmmAsyncJobrP   ÚtopwinÚrun)rD   r.   rL   ÚtitleÚtextrM   rU   ÚsimplecbrN   rO   ÚdocbrT   rE   r   rS   r   Ú_simple_asynca   s   
ür]   c                    s   ‡ fdd„}|S )Nc                    s   | j ˆ | g|¢R i |¤ŽS r%   )Úidle_addr-   ©Úfnr   r   Úwrappedx   s   zidle_wrapper.<locals>.wrappedr   )r`   ra   r   r_   r   Úidle_wrapperw   s   rb   c                   @   sä   e Zd ZdZe	d.dd„ƒZe	d.dd„ƒZ	d/dd	„Zd
d„ Zd0dd„Z	d1dd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zed!d"„ ƒZed2d$d%„ƒZed3d&d'„ƒZed(d)„ ƒZed*d+„ ƒZed,d-„ ƒZdS )4rV   zH
    Displays a progress bar while executing the "callback" method.
    TNc	           	      C   s   t | |||||d|||ƒ
 d S )NT©r]   )	rD   r.   rL   rY   rZ   rM   r[   rN   rO   r   r   r   Úsimple_async   ó   þzvmmAsyncJob.simple_asyncc                 C   s   t | ||dd|d|||ƒ
 d S )Nr   Frc   )rD   r.   rL   rM   r[   rN   rO   r   r   r   Úsimple_async_noshowˆ   re   zvmmAsyncJob.simple_async_noshowc
           
      C   sú   t  | dd¡ | j |¡ t|ƒ| _|	pdg f}	|	d | _| gt|	dd… ƒ | _d| _	|| _
|p2d| _d| _d| _d| _d| _d| _d| _d| _tjt|| g| d	| _d| j_| j d
| ji¡ | j |¡ |  d¡ |¡ |  d¡ t| jƒ¡ dS )z±
        @show_progress: If False, don't actually show a progress dialog
        @cancel_cb: Cancel callback if operation supports it.
            (cb, arg1, arg2, ...)
        zasyncjob.uizvmm-progressNr   r   Fr   T)Útargetr.   Úon_async_job_cancel_clickedz	pbar-textzcancel-async-job)r   r   rW   Úset_transient_forr&   rU   Ú	cancel_cbÚlistÚcancel_argsr>   Ú
_finish_cbÚ_finish_argsÚ_timerÚ_error_infoÚ_dataÚ_details_widgetÚ_details_update_cbÚ_is_pulsingr   Ú	threadingÚThreadrG   Ú
_bg_threadÚdaemonÚbuilderÚconnect_signalsÚ
_on_cancelÚ	set_titleÚwidgetÚset_textÚset_visible)
r   rD   r.   rO   Úfinish_argsrY   rZ   rL   rU   rj   r   r   r   r      s4   	



ÿÿzvmmAsyncJob.__init__c                 C   s   d | _ d | _d | _d | _d S r%   )rw   rj   rl   r   r(   r   r   r   Ú_cleanupÁ   s   
zvmmAsyncJob._cleanupFc                 C   s"   | j r|sd S |  d¡ |¡ d S )Nz
pbar-stage)r>   r}   r~   )r   rZ   Ú	cancelingr   r   r   Ú_set_stage_textÇ   s   
zvmmAsyncJob._set_stage_textc                 C   sN   | j r| j ¡ s
d S | j | jŽ  | jr%|  d¡ ¡  | jtdƒdd d S d S )Núwarning-boxzCancelling job...T)r‚   )	rj   rw   Úis_aliverl   r>   r}   Úhiderƒ   Ú_)r   Úignore1Úignore2r   r   r   r{   Õ   s   þzvmmAsyncJob._on_cancelc                 C   s    | j st| j| j| jƒ| _ | j S r%   )r   r   r   r   r   r(   r   r   r   Ú	get_meterã   s   þzvmmAsyncJob.get_meterc                 C   s   ||f| _ d S r%   )rp   ©r   rK   rH   r   r   r   r?   ê   s   zvmmAsyncJob.set_errorc                 C   ó
   t | jƒS r%   )r&   rp   r(   r   r   r   Ú	has_errorí   ó   
zvmmAsyncJob.has_errorc                 C   rŒ   r%   )r&   rj   r(   r   r   r   r=   ð   rŽ   zvmmAsyncJob.can_cancelc                 C   s*   d| }|   d¡ ¡  |   d¡ |¡ d S )Nz<small>%s</small>r„   zwarning-text)r}   ÚshowÚ
set_markup)r   ÚsummaryÚmarkupr   r   r   Úshow_warningó   s   zvmmAsyncJob.show_warningc                 C   sP   t  | j¡ | j ¡  |  ¡  d }d }| jr| j\}}| j||g| j¢R Ž  d S r%   )	r   Úsource_removero   rW   ÚdestroyÚcleanuprp   rm   rn   r‹   r   r   r   Ú_thread_finishedù   s   

zvmmAsyncJob._thread_finishedc                 C   s\   t  d| j¡| _| jr| j ¡  | js'| jr'| j ¡ }| 	t
j | ¡ d¡¡ | j ¡  d S )Nr   r	   )r   Útimeout_addÚ_exit_if_necessaryro   rU   rW   Úpresentrj   Ú
get_windowÚ
set_cursorr   ÚCursorÚnew_from_nameÚget_displayrw   r,   )r   Ú
gdk_windowr   r   r   rX     s   

ÿzvmmAsyncJob.runc                 C   s2   | j  ¡ s|  ¡  dS | jr| jsdS |  ¡  dS )NFT)rw   r…   r—   rt   rU   Ú_pbar_do_pulser(   r   r   r   r™     s   
zvmmAsyncJob._exit_if_necessaryc                 C   s   | j sd S |  d¡ ¡  d S )NÚpbar)ry   r}   Úpulser(   r   r   r   r¡   #  s   zvmmAsyncJob._pbar_do_pulser   c                 C   s6   d| _ | jsd S |  d¡ |¡ |  |ptdƒ¡ d S )NTr¢   úProcessing...)rt   ry   r}   r~   rƒ   r‡   )r   r	   Ústager   r   r   r   )  s
   zvmmAsyncJob._pbar_pulsec                 C   sZ   d| _ | jsd S |  |ptdƒ¡ |  d¡ |¡ t|dƒ}t|dƒ}|  d¡ |¡ d S )NFr¤   r¢   r   r   )	rt   ry   rƒ   r‡   r}   r~   ÚminÚmaxÚset_fraction)r   r"   r	   r¥   r   r   r   r   1  s   

zvmmAsyncJob._pbar_fractionc                 C   s
   d| _ d S )NF)rt   r(   r   r   r   r   =  s   
zvmmAsyncJob._pbar_donec                 C   sH   ddl m} | ¡ | _|  d¡ | j¡ | j d¡ |  d¡ d¡ d S )Nr   )ÚVtezdetails-boxTrH   )Úgi.repositoryr©   ÚTerminalrr   r}   Úaddr   )r   r©   r   r   r   Údetails_enableA  s
   
zvmmAsyncJob.details_enablec                 C   s   | j  | dd¡ ¡ ¡ d S )NÚ
z
)rr   ÚfeedÚreplaceÚencode)r   Údatar   r   r   Údetails_updateI  s   zvmmAsyncJob.details_update)TNN)TN)F)NN)r   Nr%   )r5   r6   r7   Ú__doc__Ústaticmethodrd   rf   r   r   rƒ   r{   rŠ   r?   r   r=   r“   r—   rX   r™   rb   r¡   r   r   r   r­   r³   r   r   r   r   rV   }   sB    ÿÿ

ý1




rV   )ru   rB   rª   r   r   r;   Úvirtinst.progressr   Ú	baseclassr   r	   r
   r   rG   rP   r]   rb   rV   r   r   r   r   Ú<module>   s   2