
    QKfmM                        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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  G d de
      Z! G d dejD                        Z# G d dee      Z$e%dk(  rUd d
l&Z& e&jN                         Z(dZ)d dl*m+Z+  e+e)e(      Z, e$e,d
      Z-e-j]                  dgg g         ej^                          y
y
)    )Gtk)clienterrors)inline_callbacks)AptCancelButtonAptConfigFileConflictDialogAptDetailsExpanderAptMediumRequiredDialogAptProgressBar)	EXIT_SUCCESSEXIT_FAILEDSTATUS_COMMITTINGSTATUS_DOWNLOADINGSTATUS_DOWNLOADING_REPOSTATUS_FINISHEDget_error_description_from_enumget_error_string_from_enumget_status_string_from_enum)InstallBackend)UnitySupport)BuilderDialog)gettextNc                   *     e Zd ZdZd fd	Zd Z xZS )UpdateManagerExpandera:  An AptDetailsExpander which can be used with multiple terminals.

    The default AptDetailsExpander will shrink/hide when its transaction
    finishes. But here we want to support "chaining" transactions. So we
    override the status-changed handler to only do that when we are
    running the final transaction.c                 4    t         |   ||       || _        y N)super__init__final)selftransactionterminalr   	__class__s       O/usr/lib/python3/dist-packages/UpdateManager/backend/InstallBackendAptdaemon.pyr   zUpdateManagerExpander.__init__/   s    h/
    c                    |t         t        fv rS| j                  d       | j                  j	                          | j
                  r| j
                  j                          y y |t        k(  r| j                  j                          | j
                  r,| j
                  j	                          | j                  d       y | j                  r#| j                  d       | j                  d       y y | j                  rm|t        k(  rc| j                  j                          | j
                  r| j
                  j                          | j                  d       | j                  d       y y y NTF)r   r   set_sensitivedownload_scrolledshowr"   hider   r   set_expandedr   )r    transstatuss      r$   _on_status_changedz(UpdateManagerExpander._on_status_changed3   s   (*ABBt$""'')}}""$ ((""'')}}""$""4(!!%(""5)  ZZFo5""'')}}""$u%e$ 6Zr%   )TF)__name__
__module____qualname____doc__r   r/   __classcell__r#   s   @r$   r   r   '   s    &%r%   r   c                   4     e Zd ZdZ fdZd Zd Zd Z xZS )AptStackedProgressBarap  A GtkProgressBar which represents the state of many aptdaemon
    transactions.

    aptdaemon provides AptProgressBar for the state of *one* transaction to
    be represented in a progress bar. This widget creates one of those per
    containing transaction, and scales its progress to the given ratio, so
    one progress bar can show the state of many transactions.c                 L    d| _         g | _        || _        t        |           y )Nr   )current_max_progressprogress_barsunityr   r   )r    r;   r#   s     r$   r   zAptStackedProgressBar.__init__R   s%    $%!
r%   c                 z   d|cxk  rdk  sJ  J t        |      }| j                  j                  |       | j                  |_        | xj                  |z  c_        | j                  dkD  rd| _        | j                  |_        |j                  d| j                         |j                  d| j                         y )Nr      znotify::fractionznotify::text)	r   r:   appendr9   minmaxconnect_update_progress_update_text)r    r-   max_progressprogresss       r$   add_transactionz%AptStackedProgressBar.add_transactionY   s    L%A%%%%%!%(!!(+00!!\1!$$q(()D%00+T-B-BC):):;r%   c                     |j                   |j                  z
  }||j                         z  }|j                  |z   }| j                  |       | j                  j                  |dz         y )Nd   )r@   r?   get_fractionset_fractionr;   set_progress)r    inner_progressdatadeltaposition_in_deltanew_progresss         r$   rB   z&AptStackedProgressBar._update_progressh   sb    ""^%7%77!N$?$?$AA%)),==,'

s 23r%   c                 B    | j                  |j                                y r   )set_textget_text)r    rL   rM   s      r$   rC   z"AptStackedProgressBar._update_texto   s    n--/0r%   )	r0   r1   r2   r3   r   rF   rB   rC   r4   r5   s   @r$   r7   r7   I   s    A<41r%   r7   c                       e Zd ZdZd Zd Zed        Zd Zd Z	ed        Z
d Zed	        Zed
        Zd Zd Ze	 	 dd       Zd Zd Zd Zd Zd Zy)InstallBackendAptdaemonzCMakes use of aptdaemon to refresh the cache and to install updates.c                 Z   t        j                  | ||       t        j                  j	                  |j
                  d      }t        j                  | ||d       t        j                         | _        t               | _
        d | _        d | _        d | _        d | _        d | _        d | _        y )Nzgtkbuilder/UpdateProgress.uipane_update_progress)r   r   ospathjoindatadirr   r   	AptClientr   r;   _expanded_sizebutton_canceltrans_failed_msgprogressbar_active_transaction	_expander)r    window_mainactionui_paths       r$   r   z InstallBackendAptdaemon.__init__v   s    k6:'',,!?
 	+w(>	
 &&(!^
"! $#' r%   c                     | j                   r6| j                   j                         r	 | j                   j                          yy# t        $ r Y yw xY wr'   )r^   get_sensitiveclicked	Exception)r    s    r$   closezInstallBackendAptdaemon.close   sT    $"4"4"B"B"D""**,
    	s   A 	AAc              #   `  K   	 | j                   j                  d      }| j                  || j                  t	        d      d       y# t
        j                  $ r# | j                  | j                  dddd       Y yt        $ r" | j                  | j                  dddd        w xY ww)zRefresh the package listTdeferu   Checking for updates…FN
authorizedsuccesserror_string
error_desc)	r   update_cache_show_transactionACTION_UPDATE_r   NotAuthorizedError_action_doneri   )r    r-   s     r$   updatezInstallBackendAptdaemon.update   s     	++222>>E((t))1-F+G  (( 	"" !    	""!   	s)   B.AA B.3B+?B.*B++B.c                     t        |j                  j                        }t        |j                  j                        }| j                  rd}|dz   | j                  z   }nd }| j                  |dd|||       y )NT
Fro   rp   rq   rr   trans_failed)r   errorcoder   r_   rx   )r    r-   rd   rq   rr   r}   s         r$   _show_transaction_errorz/InstallBackendAptdaemon._show_transaction_error   sw    1%++2B2BC4U[[5E5EF
  L#d*T-B-BBJL%!% 	 	
r%   c                 \    |t         k(  r| j                  ||       y | j                          y r   )r   r   _apt_update_oem)r    r-   r.   rd   s       r$   _update_next_packagez,InstallBackendAptdaemon._update_next_package   s)    [ ((7r%   c           	   #   Z  K   | j                   sJ | j                   j                         }d| d}	 t        j                  j	                  |      r}| j
                  j                  |      }| j                   r| j                  }n| j                  }| j                  || j                  t        d      d|d| j                  z         y y # t        j                  $ r# | j                  | j                  ddd d 	       Y y t        j                   $ r}t#        |      | _        Y d }~y d }~wt&        j(                  $ r>}|j+                         d
k7  r | j                  | j                  ddd d 	       Y d }~y d }~wt,        $ r" | j                  | j                  ddd d 	        w xY ww)Nz/etc/apt/sources.list.d/z.list)sources_list   Installing updates…T皙?on_finished_handlerprogress_bar_maxFrn   "org.freedesktop.DBus.Error.NoReply)_oem_packages_to_updatepoprX   rY   existsr   rs   r   _on_finishedrt   ACTION_PRE_INSTALLrv   _len_oem_updatesr   rw   rx   TransactionFailedstrr_   dbusDBusExceptionget_dbus_nameri   )r    elemsources_list_filer-   finished_handleres         r$   r   z'InstallBackendAptdaemon._apt_update_oem   s    ++++++//16tfEB.	ww~~/0"kk66!2 7   //'+'@'@$'+'8'8$,,++-.(8%(4+@+@%@ -   1" (( 	'' !   '' 	+$'FD!!!! 		 $HH'' !     	''!   	sM   /F+BC F+3F(F+F(D+&F++F(4E:5F+:.F((F+c                     |t         k(  r| j                  ||       y |j                  \  }}}}}}t        |      | _        t        |      | _        | j                          y r   )r   r   packagessetr   lenr   r   )r    r-   r.   rd   installrv   s         r$   _update_oemz#InstallBackendAptdaemon._update_oem   sY    
 [ ((7#(>> !Q1a'*7|$ #Gr%   c              #     K   t        |      t        |      z  | _        	 |s$|s"| j                  | j                  ddd d d        y |rV| j                  j                  |d      }| j                  || j                  t        d      d| j                  d       y y # t        j                  $ r# | j                  | j                  ddd d        Y y t        j                  $ r}t        |      | _        Y d }~y d }~wt        j                  $ r>}|j!                         d	k7  r | j                  | j                  ddd d        Y d }~y d }~wt"        $ r" | j                  | j                  ddd d         w xY ww)
NTr|   rl   r   r   r   Frn   r   )r   all_oem_packagesrx   r   r   install_packagesrt   rv   r   r   rw   r   r   r_   r   r   r   ri   )r    pkgs_install_oempkgs_upgrade_oemr-   r   s        r$   
commit_oemz"InstallBackendAptdaemon.commit_oem  s     #$4 5<L8M M4	#,<!!++# !%#!% "  "kk::$D ;   ,,++-.(,(8(8%( -  	   (( 	'' !   '' 	+$'FD!!!! 		 $HH'' !     	''!   	sY   E;%B E;AB E;3E8E;E8&C;6E;;E84E
E;
.E88E;c           	   #   l  K   	 g x}x}}| j                   j                  ||||||d      }| j                  || j                  t	        d      d       y# t
        j                  $ r# | j                  | j                  dddd       Y yt
        j                  $ r}t        |      | _
        Y d}~yd}~wt        j                  $ r>}|j                         dk7  r | j                  | j                  dddd       Y d}~yd}~wt        $ r" | j                  | j                  dddd        w xY ww)z)Commit a list of package adds and removesTrl   r   FNrn   r   )r   commit_packagesrt   ACTION_INSTALLrv   r   rw   rx   r   r   r_   r   r   r   ri   )	r    pkgs_installpkgs_upgradepkgs_remove	reinstallpurge	downgrader-   r   s	            r$   commitzInstallBackendAptdaemon.commitE  s[    +	,..I.	++55 6  E ((t**A.E,F  (( 	## !   '' 	+$'FD!!!! 
	 $HH## !     	##!   	sM   D4AA D43D1D4D1B4/D44D1
4D>D4.D11D4c                 &    |j                  |       y r   )	set_label)r    r-   detailslabel_detailss       r$   _on_details_changedz+InstallBackendAptdaemon._on_details_changedu  s    (r%   c                     |j                  t        |             |t        k(  rN| j                  rA| j                  j                  j                         r| j                  | j                         y y y y r   )r   r   r   rb   r"   get_visible_resize_to_show_details)r    r-   r.   r   s       r$   r/   z*InstallBackendAptdaemon._on_status_changedx  s_     ;F CD ''''335((8 6  (r%   Nc              #     K   || j                   }| j                  j                  |       | j                  sYt	        | j
                        | _        | j                  j                          | j                  j                  | j                         | j                  j                  ||       | j                  r| j                  j                  |       nOt        |      | _
        | j                  j                          | j                  j                  | j                         || j                  k(  r)| j                  j                  t        j                          |r| j"                  st%        |      | _        | j"                  j'                  d       | j"                  j)                  d       | j"                  j+                          | j"                  j-                  d| j.                         | j0                  j                  | j"                         | j0                  j                          n| j"                  j                  |       || j2                  k7  | j"                  _        n&| j"                  r| j6                  j9                          |j-                  d| j:                  | j<                         |j-                  d| j>                  | j<                         |j-                  d||       |j-                  d| j@                         |j-                  d| jB                         |jE                  d       |jG                          y w)	NTznotify::expandedzstatus-details-changedzstatus-changedfinishedzmedium-requiredzconfig-file-conflictgnome)$r   label_headerr   r`   r7   r;   r*   progressbar_slotaddrF   r^   set_transactionr   button_cancel_slotru   r   
STOCK_STOPrb   r   set_vexpandset_hexpandshow_allrA   _on_expandedexpander_slotr   r   _expander_slotr+   r   r   r/   _on_medium_required_on_config_file_conflictset_debconf_frontendrun)r    r-   rd   headershow_detailsr   r   s          r$   rt   z)InstallBackendAptdaemon._show_transaction  st     &"&"3"3##F+4TZZ@D!!#!!%%d&6&67((0@A..u5!0!7D##%##''(:(:;T'''((8>>!6u!=**40**40'')&&'94;L;LM""&&t~~6""'')..u5#)T-D-D#DDNN ^^$$&$$$	

 	d55t7I7I	
 	j"5v>')A)AB,d.K.KL((11iiks   MMc                    |j                         sT|j                  j                         | j                  j	                         f| _        | j                  j                          y | j
                  r^| j
                  \  }\  }}||j                  j                         k7  r| j                  |       y | j                  j                  ||       y | j                  |       y r   )	get_expandedr"   r   rc   get_sizer]   end_user_resizabler   begin_user_resizable)r    expanderparamterm_visiblestored_widthstored_heights         r$   r   z$InstallBackendAptdaemon._on_expanded  s     $$&!!--/  ))+#D //1  :>:M:M7L7< x00<<>> ,,X6  55 - ((2r%   c                    |j                         r| j                  j                         \  }}|j                         j                  }|j                         j
                  }|j                  j                         rK|j                  j                         dz  }|j                  j                         dz  }||z
  |z   }||z
  |z   }	n
|dz   }|dz   }	| j                  j                  ||	       yy)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      rH      N)r   rc   r   get_allocationwidthheightr"   r   get_char_widthget_char_heightr   )
r    r   	win_width
win_height	exp_width
exp_heightterminal_widthterminal_height	new_width
new_heights
             r$   r   z/InstallBackendAptdaemon._resize_to_show_details  s       "$($4$4$=$=$?!Iz //177I!00299J  ,,.!)!2!2!A!A!Cb!H"*"3"3"C"C"E"J*Y6B	,z9JF
%O	'#-
11)ZH #r%   c                     t        ||| j                        }|j                         }|j                          |t        j
                  j                  k(  r|j                  |       y |j                          y r   )	r
   rc   r   r+   r   ResponseTypeOKprovide_mediumcancel)r    r!   mediumdrivedialogress         r$   r   z+InstallBackendAptdaemon._on_medium_required  sX    (8H8HIjjl#""%%%&&v. r%   c                     t        ||| j                        }|j                         }|j                          |t        j
                  j                  k(  r|j                  |d       y |j                  |d       y )Nreplacekeep)r   rc   r   r+   r   r   YESresolve_config_file_conflict)r    r!   oldnewr   r   s         r$   r   z0InstallBackendAptdaemon._on_config_file_conflict  s^    ,S#t7G7GHjjl#""&&&44S)D44S&Ar%   c                    d }d }d}|t         k(  r^t        |j                  j                        }t	        |j                  j                        }| j
                  rd}|dz   | j
                  z   }| j                  j                  d       |t        k(  }	 | j                  |d||||       y # t        $ r | j                  |d|||       Y y w xY w)NFTr{   r|   rn   )r   r   r~   r   r   r_   r;   rK   r   rx   	TypeError)r    r-   r.   rd   rq   rr   r}   
is_successs           r$   r   z$InstallBackendAptdaemon._on_finished  s    
[ 5ekk6F6FGL89I9IJJ$$#'$.1F1FF


#|+
	")%)    
	 ")%  	
	s   B+ +CC)r=   N)r0   r1   r2   r3   r   rj   r   ry   r   r   r   r   r   r   r   r/   rt   r   r   r   r   r    r%   r$   rU   rU   s   s    M$
  2
" 3 3j  7 7r - -^)	9   < <|30I.!B r%   rU   __main__z/usr/share/update-manager)UpdateManager2vcard)0gi.repositoryr   	aptdaemonr   r   rm   r   aptdaemon.gtk3widgetsr   r   r	   r
   r   aptdaemon.enumsr   r   r   r   r   r   r   r   r   UpdateManager.backendr   UpdateManager.UnitySupportr   UpdateManager.Dialogsr   r   rv   r   rX   r   ProgressBarr7   rU   r0   mockMockoptionsdata_dirUpdateManager.UpdateManagerr   appbr   mainr   r%   r$   <module>r     s     $ " 
 
 
 1 3 /    	%. %D'1COO '1Tpnm pf zdiikG*H9
'
*CT*AHHhZR CHHJ r%   