
£à[]·+  ã               @   s•  d  d l  m Z d  d l m Z d  d l m Z m Z d  d l m Z d  d l	 m
 Z
 m Z m Z m Z m Z d  d l m Z m Z m Z m Z m Z m 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  Gd d „  d e e ƒ Z! e" d k r‘d  d l# Z# e# j$ ƒ  Z% d Z& d  d l' m( Z( e( e& e% ƒ Z) e! e) d ƒ Z* e* j+ d g g  g  ƒ e j, ƒ  d S)é    )Úprint_function)ÚGtk)ÚclientÚerrors)Úinline_callbacks)ÚAptCancelButtonÚAptConfigFileConflictDialogÚAptDetailsExpanderÚAptMediumRequiredDialogÚAptProgressBar)ÚEXIT_SUCCESSÚEXIT_FAILEDÚSTATUS_COMMITTINGÚget_error_description_from_enumÚget_error_string_from_enumÚget_status_string_from_enum)ÚInstallBackend)ÚUnitySupport)ÚBuilderDialog)ÚgettextNc               @   sÇ   e  Z d  Z d Z d d „  Z d d „  Z e d d „  ƒ Z e g  d d	 „ ƒ Z d
 d „  Z	 d d „  Z
 d d „  Z e d d „  ƒ Z d d „  Z d d „  Z d d „  Z d d „  Z d d „  Z d S)ÚInstallBackendAptdaemonzCMakes use of aptdaemon to refresh the cache and to install updates.c             C   s{   t  j |  | | ƒ t j j | j d ƒ } t j |  | | d ƒ t j ƒ  |  _ t	 ƒ  |  _
 d  |  _ d  |  _ d  |  _ d  S)Nzgtkbuilder/UpdateProgress.uiZpane_update_progress)r   Ú__init__ÚosÚpathÚjoinZdatadirr   r   Z	AptClientr   ÚunityÚ_expanded_sizeÚbutton_cancelÚtrans_failed_msg)ÚselfÚwindow_mainÚactionZui_path© r"   úO/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.pyr   &   s    			z InstallBackendAptdaemon.__init__c             C   sJ   |  j  rB |  j  j ƒ  rB y |  j  j ƒ  Wn t k
 r= Yn Xd Sd Sd  S)NTF)r   Zget_sensitiveZclickedÚ	Exception)r   r"   r"   r#   Úclose3   s    zInstallBackendAptdaemon.closec             c   só   y t  j j ƒ  Wn t k
 r% Yn Xy: |  j j d d ƒ V} |  j | |  j t d ƒ d ƒ VWnŒ t	 j
 k
 rŸ |  j |  j d d d d d d d	 d ƒYnP t k
 rî } z0 |  j |  j d d d d d d d	 d ƒ‚  WYd d } ~ Xn Xd S)
zRefresh the package listÚdeferTu   Checking for updatesâ€¦FÚ
authorizedÚsuccessÚerror_stringNÚ
error_desc)ÚaptÚapt_pkgÚpkgsystem_unlockÚSystemErrorr   Zupdate_cacheÚ_show_transactionÚACTION_UPDATEÚ_r   ÚNotAuthorizedErrorÚ_action_doner$   )r   ÚtransÚer"   r"   r#   Úupdate?   s"    zInstallBackendAptdaemon.updatec       	      c   sÓ  y t  j j ƒ  Wn t k
 r% Yn Xym g  } } } |  j j | | | | | | d d ƒV} | j d |  j ƒ |  j | |  j	 t
 d ƒ d ƒ VWn9t j k
 rå } z- |  j |  j	 d d d d d d	 d
 d	 ƒWYd	 d	 } ~ Xnê t j k
 r} z t | ƒ |  _ WYd	 d	 } ~ Xn´ t j k
 r} zB | j ƒ  d k rE‚  |  j |  j	 d d d d d d	 d
 d	 ƒWYd	 d	 } ~ XnP t k
 rÎ} z0 |  j |  j	 d d d d d d	 d
 d	 ƒ‚  WYd	 d	 } ~ Xn Xd	 S)z)Commit a list of package adds and removesr&   Tzprogress-changedu   Installing updatesâ€¦r'   Fr(   r)   Nr*   z"org.freedesktop.DBus.Error.NoReply)r+   r,   r-   r.   r   Zcommit_packagesÚconnectÚ_on_progress_changedr/   ZACTION_INSTALLr1   r   r2   r3   ZTransactionFailedÚstrr   ÚdbusZDBusExceptionÚget_dbus_namer$   )	r   Zpkgs_installZpkgs_upgradeZpkgs_removeZ	reinstallÚpurgeZ	downgrader4   r5   r"   r"   r#   ÚcommitT   s:    	!zInstallBackendAptdaemon.commitc             C   s   |  j  j | ƒ d  S)N)r   Úset_progress)r   r4   Zprogressr"   r"   r#   r8   v   s    z,InstallBackendAptdaemon._on_progress_changedc             C   s   | j  | ƒ d  S)N)Ú	set_label)r   r4   ZdetailsÚlabel_detailsr"   r"   r#   Ú_on_details_changedz   s    z+InstallBackendAptdaemon._on_details_changedc             C   sE   | j  t | ƒ ƒ | t k rA | rA | j j ƒ  rA |  j | ƒ d  S)N)r?   r   r   ÚterminalÚget_visibleÚ_resize_to_show_details)r   r4   Ústatusr@   Úexpanderr"   r"   r#   Ú_on_status_changed}   s    z*InstallBackendAptdaemon._on_status_changedc             c   s„  |  j  j | ƒ t | ƒ } | j ƒ  |  j j | ƒ t | ƒ |  _ | |  j k rg |  j j t	 j
 ƒ |  j j ƒ  |  j j |  j ƒ | rð t | ƒ } | j d ƒ | j d ƒ | j ƒ  | j d |  j ƒ |  j j | ƒ |  j j ƒ  n d  } | j d |  j |  j ƒ | j d |  j |  j | ƒ | j d |  j | ƒ | j d |  j ƒ | j d |  j ƒ | j d ƒ V| j ƒ  Vd  S)	NTznotify::expandedzstatus-details-changedzstatus-changedZfinishedzmedium-requiredzconfig-file-conflictZgnome)Zlabel_headerr?   r   ZshowZprogressbar_slotÚaddr   r   r0   r   Z
STOCK_STOPZbutton_cancel_slotr	   Zset_vexpandZset_hexpandZshow_allr7   Ú_on_expandedZexpander_slotrA   r@   rG   Ú_on_finishedÚ_on_medium_requiredÚ_on_config_file_conflictZset_debconf_frontendÚrun)r   r4   r!   ÚheaderZshow_detailsZprogressbarrF   r"   r"   r#   r/   …   s6    


z)InstallBackendAptdaemon._show_transactionc             C   s§   | j  ƒ  s= | j j ƒ  |  j j ƒ  f |  _ |  j j ƒ  nf |  j r– |  j \ } \ } } | | j j ƒ  k r€ |  j | ƒ q£ |  j j | | ƒ n |  j | ƒ d  S)N)	Úget_expandedrB   rC   r    Úget_sizer   Zend_user_resizablerD   Úbegin_user_resizable)r   rF   ZparamZterm_visibleZstored_widthZstored_heightr"   r"   r#   rI   ©   s    	
z$InstallBackendAptdaemon._on_expandedc       
      C   s¾   | j  ƒ  rº |  j j ƒ  \ } } | j ƒ  j } | j ƒ  j } | j j ƒ  r“ | j j ƒ  d } | j j	 ƒ  d } | | | } | | | }	 n | d } | d }	 |  j j
 | |	 ƒ d S)a¯  Resize the window to show the expanded details.

        Unfortunately the expander only expands to the preferred size of the
        child widget (e.g showing all 80x24 chars of the Vte terminal) if
        the window is rendered the first time and the terminal is also visible.
        If the expander is expanded afterwards the window won't change its
        size anymore. So we have to do this manually. See LP#840942
        éP   é   éd   éÈ   N)rO   r    rP   Zget_allocationÚwidthZheightrB   rC   Zget_char_widthZget_char_heightrQ   )
r   rF   Z	win_widthZ
win_heightZ	exp_widthZ
exp_heightZterminal_widthZterminal_heightZ	new_widthZ
new_heightr"   r"   r#   rD   ¾   s    	

z/InstallBackendAptdaemon._resize_to_show_detailsc             C   s[   t  | | |  j ƒ } | j ƒ  } | j ƒ  | t j j k rM | j | ƒ n
 | j ƒ  d  S)N)	r
   r    rM   Úhider   ÚResponseTypeZOKZprovide_mediumZcancel)r   ÚtransactionZmediumZdriveÚdialogÚresr"   r"   r#   rK   Õ   s    
z+InstallBackendAptdaemon._on_medium_requiredc             C   sd   t  | | |  j ƒ } | j ƒ  } | j ƒ  | t j j k rP | j | d ƒ n | j | d ƒ d  S)NÚreplaceZkeep)r   r    rM   rW   r   rX   ZYESZresolve_config_file_conflict)r   rY   ÚoldÚnewrZ   r[   r"   r"   r#   rL   Þ   s    
z0InstallBackendAptdaemon._on_config_file_conflictc             C   së   d  } d  } d } | t  k rb t | j j ƒ } t | j j ƒ } |  j rb d } | d |  j } |  j j d
 ƒ | t k } y/ |  j	 | d d d | d | d | d	 | ƒWn7 t
 k
 ræ |  j	 | d d d | d | d | ƒYn Xd  S)NFTÚ
é   r'   r(   r)   r*   Útrans_failedéÿÿÿÿ)r   r   ÚerrorÚcoder   r   r   r>   r   r3   Ú	TypeError)r   r4   rE   r!   r)   r*   ra   Z
is_successr"   r"   r#   rJ   ç   s(    	z$InstallBackendAptdaemon._on_finishedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r%   r   r6   r=   r8   rA   rG   r/   rI   rD   rK   rL   rJ   r"   r"   r"   r#   r   #   s   !$		r   Ú__main__z/usr/share/update-manager)ÚUpdateManagerZ2vcard)-Z
__future__r   Zgi.repositoryr   Z	aptdaemonr   r   r&   r   Zaptdaemon.gtk3widgetsr   r   r	   r
   r   Zaptdaemon.enumsr   r   r   r   r   r   ZUpdateManager.backendr   ZUpdateManager.UnitySupportr   ZUpdateManager.Dialogsr   r   r1   r+   r:   r   r   rf   ZmockZMockZoptionsZdata_dirZUpdateManager.UpdateManagerrk   ZappÚbr=   Úmainr"   r"   r"   r#   Ú<module>   s,   (.ß