
    ehZ8                     ,   d dl Z d dlZ ej                  dd       d dlmZmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlmc mZ d dlmZ d dlmZ  e ed            \  ZZ e ed	            \  ZZZZd d
lmZ e
j8                  dk\  rd ZddZ G d d      Zy)    NGtkz3.0)GObjectr   )gettext)
MirrorTest)setup_ui      )CountryInformation3c                     | |kD  | |k  z
  S N )abs     E/usr/lib/python3/dist-packages/softwareproperties/gtk/DialogMirror.py<lambda>r   -   s    A!a%(     c                     | j                  |dddd      \  }}}}| j                  |dddd      \  }}	}
}| j                  |      }| j                  |      }|r|
rt        ||      S |ry|
ry|ry|	ry||k7  rt        ||      S t        ||      S )a    sort function for the mirror list:
           - at first show all custom urls
           - secondly the separator
           - show mirrors without a county first (e.g. the automatic mirror url)
           - third the official mirrors. if available
             sort the countries
      r      r      )getiter_has_childcmp)modeliter1iter2dataurl1sep1custom1mirror1url2sep2custom2mirror2
has_child1
has_child2s                 r   sort_mirrorsr)   /   s     (-yy1a'C$tT7G',yy1a'C$tT7G''.j''.j	WT4
 		z	!z:..t_r   c                   `    e Zd Zd Zd Zd ZddZddZddZddZ	dd	Z
d
 ZddZd Zd Zy)DialogMirrorc                    dd}|| _         t               | _        t        | t        j
                  j                  |dd      d       | j                  | _        | j                  j                  |       | j                  | _        | j                  j                  | j                         || _        | j                  | _        | j                  | _        | j"                  | _        | j&                  | _        | j*                  | _        | j.                  | _        | j2                  | _        | j6                  | _        | j2                  | _        | j.                  | _        t?        j@                  tB        jD                  tB        jD                        }| j8                  jG                  |       t?        jH                         }| j8                  jK                  |d       | j8                  jM                  |dd	       t?        jN                  tB        jD                  tB        jP                  tB        jP                  tB        jR                        | _*        | j                  jW                  |d       t?        jX                  | jT                  
      | _-        || _        | j                  jG                  | jZ                         t?        jH                         | _.        | j\                  j_                  d| j`                  | jT                         t?        jb                  d| j\                  td              | _3        | j                  ji                  | jf                         i }d}	| j                  jk                         jk                         }
tm        | j                         d	kD  rf| j                   D ]C  }|
jo                  d|dddg       | jf                  jM                  | j\                  dtp               E |
jo                  dg d       | j                  jr                  jt                  jw                         D ]  }| j                  jr                  jt                  |   }|jx                  |v r$|
jo                  ||jx                     |dd|g       Y|jx                  dk7  r|
jo                  d| j                  j{                  |jx                        dddg      }|jx                  | j                  j|                  k(  r|	dk(  r|}	|
jo                  ||dd|g      f |||jx                  <   |
jo                  d|dd|g       
 |	dk7  r| jZ                  j                  | jZ                  j                  |	      d         }| j                  j                  |d       | j                  j                  |dd       | j                  j                  |dd       | jZ                  j                  t        d       y)zQ
    Initialize the dialog that allows to choose a custom or official mirror
    Nc                 .    | j                  |t              S r   )	get_valueCOLUMN_SEPARATOR)r   iterr   s      r   is_separatorz+DialogMirror.__init__.<locals>.is_separatorQ   s    t%566r   
gtkbuilderzdialog-mirror.uizsoftware-properties)domainTmarkupr   )r   editedURI)textFeditable)NTFNr         ?	use_align	row_alignr   )Fcustom_mirrorsr
   country_infor   ospathjoindialog_mirrordialogset_transient_fordialog_mirror_testdialog_testdistrotreeview_mirrorstreeviewbutton_mirror_editbutton_editbutton_mirror_removebutton_removebutton_mirror_choosebutton_choosebutton_test_cancelbutton_cancellabel_test_mirror
label_testprogressbar_test_mirrorprogressbar_testcombobox_mirror_protocomboboxprogresslabel_actionr   	ListStorer   TYPE_STRING	set_modelCellRendererText
pack_startadd_attribute	TreeStoreTYPE_BOOLEANTYPE_PYOBJECTr   set_row_separator_funcTreeModelSort
model_sortrenderer_mirrorconnecton_edited_custom_mirrorTreeViewColumn
COLUMN_URIcolumn_mirrorappend_column	get_modellenappendCOLUMN_CUSTOMsource_template
mirror_setkeyslocationget_country_namecodeget_pathconvert_child_iter_to_iter
expand_row
set_cursorscroll_to_cellset_default_sort_funcr)   )selfparentdatadirrG   r=   r1   model_protocrmap_locpatriotr   mirrorhostname	path_sorts                 r   __init__zDialogMirror.__init__M   s   7 )D*,DT277<<7IJShi$$DKKK!!&)..D&&t{{3DK))DM..D22D22D00D,,DO 88D..DM00DM..D -- 3 3 ' 3 35KMMK(				BMMR&MMHa0w22&33&33&446DJ 	MM((t<''djj9DODKMMDOO,//1D  !%!=!=!%- ++E,0,@,@1;=D 	MM 2 23 GGMM##%//1E
4!#)) 	<FLLtT:;,,T-A-A-7-:<	<
 	T45KK//::??A A,,77A??g%LL1"E5&9;__$\\$#'#4#4#E#Efoo#VX]_dfj"kmF$"3"3"8"88W_ LL(E5&!ABC'-GFOO$LL%?@A $OO,,T__-W-WX_-`ab-cd	  E2  D%8$$Y$#$NOO)),=r   c                 >   |j                  |      }|j                  |      }|dk7  r|j                  |t        |       |dk7  r@|j	                  |t
              s*|j	                  |t              s|j                  dg d       | j                  j                  | j                  |             y|j                  |       |j	                  |j                         t
              r|j                  |j                                | j                  j                  d       y)zh Check if the new mirror uri is faild, if yes change it, if not
        remove the mirror from the list  Nr   )NTFr   )get_iter	iter_next	set_valuerj   r.   r/   rp   insertrO   set_sensitiveis_valid_mirrorremoveget_iter_firstrI   rz   )r}   cellr@   new_textr   r0   r   s          r   rh   z$DialogMirror.on_edited_custom_mirror   s     >>$D%I2~j(3 OOI'78OOI}5LL/0(()=)=h)GH  	T??5//13CDLL--/0  &
r   c                 D    |dk(  ryt        j                  d|      dk(  ryy)z% Check if a given uri is a vaild one NFzG^((ftp)|(http)|(file)|(rsync)|(https))://([a-z]|[A-Z]|[0-9]|:|/|\.|~)+$T)rematch)r}   uris     r   r   zDialogMirror.is_valid_mirror   s(    
d{	\^a	bfj	jr   Nc                 n   |j                         \  }}|dk(  rR| j                  j                  d       | j                  j                  d       | j                  j                  d       y|j                         }|j                  |      }|j                  |t              }| j                  j                         }|j                          |dk7  r| j                  j                  d       g }	|j                  D ]K  }
|
j                  |	v r|	j                  |
j                         |j                  |
j                                M | j                  j                  d       | j                  j                  d       y| j                  j                  |j                  |t                      | j                  j                  |j                  |t                      | j                  j                  | j#                  |j                  |t$                           | j                  j                  d       y)ze Check if the currently selected row in the mirror list
        contains a mirror and or is editable NFTr   )
get_cursorrM   r   rK   rO   rm   r   r.   COLUMN_MIRRORrW   clearrepositoriesprotoro   get_info
set_activerp   r   rj   )r}   rI   r   rowcolumnr   r0   r   model_protosseen_protosrepos              r   "on_treeview_mirrors_cursor_changedz/DialogMirror.on_treeview_mirrors_cursor_changed   s    '')MS&
d{((/&&u-((/ E>>#D__T=1F==**,L~##D)'' 	1Dzz[(tzz*0	1 	  #((. 	((})MN&&ut]'KL(()=)=eoodT^>_)`a##E*r   c                    | j                   j                         \  }}| j                   j                         j                  |      }| j                   j                         j                         }|j	                  |       |j                  |j                         t              r|j	                  |j                                | j                   j                  d       y)z& Remove the currently selected mirror r   N)	rI   r   rm   r   r   r.   r   r/   rz   )r}   buttonr   r@   r   r0   r   s          r   on_button_mirror_remove_clickedz,DialogMirror.on_button_mirror_remove_clicked   s    ==++-LD&==""$--d3DMM##%//1E	LLu++-/?@U))+,MMT"r   c                    | j                   j                         j                         }|j                  dt        d      dddg       | j                   j	                          | j                   j                  d| j                  d       y)zI Add a new mirror at the beginning of the list and start
        editing Nz
New mirrorFTr   focus_columnstart_editing)rI   rm   ro   _
grab_focusrz   rk   )r}   r   r   r   s       r   on_button_mirror_add_clickedz)DialogMirror.on_button_mirror_add_clicked   so     MM##%//1E	LL,d;<MMMMT*.*<*<+/  1r   c                     | j                   j                         \  }}| j                   j                          | j                   j                  ||d       y)z@ Grab the focus and start editing the currently selected mirror Tr   N)rI   r   r   rz   )r}   r   r   r@   r   s        r   on_button_mirror_edit_clickedz*DialogMirror.on_button_mirror_edit_clicked   sA    ==++-LD&MMMMTdKr   c                 &    | j                  d       y)z< If anybody wants to close the dialog, stop the test before NT)on_button_cancel_test_clicked)r}   rC   eventr   s       r   "on_dialog_mirror_test_delete_eventz/DialogMirror.on_dialog_mirror_test_delete_event  s    &&t,r   c                    | j                   j                         }| j                   j                          | j                  j	                         \  }}|sy| j                  j                         }|j                  |      }|j                  |t              }|t        j                  j                  k(  r|dk(  r|j                  |t              S | j                  j                         }|j                  | j                  j                               }|j                  |t              }	|j                  |t               }
|	d|j"                  d|
S y)z= Run the chooser dialog and return the chosen mirror or None Nz:///)rC   runhiderI   r   rm   r   r.   r   r   ResponseTypeOKrj   rW   
get_activeCOLUMN_PROTO
COLUMN_DIRr   )r}   resr   r   r   r0   r   r   
iter_protor   dirs              r   r   zDialogMirror.run  s   
++//
CKKMM,,.MS&MM##%E>>#D__T=1F c!!!T>??444 --113K$--dmm.F.F.HIJ))*lCE''
J?C#(&//3??r   c                 4   | j                   j                  d       | j                  j                          t	        j
                         | _        | j                  j                          t	        j
                         }t        j                  d      }|j                         j                         }d| j                  j                  j                  d| j                  j                  j                  d   j                  d|d}t!        t#        | j                  j                  j$                  j'                               ||| j                        }|j)                          | j                  j+                         rt-        j.                         r*t-        j0                  d       t-        j.                         r*|j3                  d	       |j+                         r{| j4                  j7                  t9        d
      |j4                  d   |j4                  d   fz         | j4                  j;                  |j4                  d          |j=                          | j                  j+                         r| j                  j?                          | j@                  jC                  d       |jD                  dk7  r1| jF                  jI                  | jJ                  |jD                         ytM        jN                  | jP                  t9        d      t9        d             y)zY Perform a test to find the best mirror and select it
        afterwards in the treeview Tzdpkg --print-architecturezdists/r   r   z/binary-z/Packages.gzFg?zCompleted %s of %s testsr   r   r   Nz%No suitable download server was foundz&Please check your Internet connection.))rQ   r   rF   show	threadingEventrunningsetr?   popenreadstriprG   rq   name
componentsr   listrr   valuesstartis_setr   events_pendingmain_iteration_dowaitrX   set_textr   set_fractionr   r   rS   	set_labelbestre   foreachselect_mirrordialogsshow_error_dialogrC   )r}   r   r   progress_updatepipearch	test_filetests           r   on_button_test_clickedz#DialogMirror.on_button_test_clicked(  s7    	$$T*??$DLLLoo'O88/0D99;D++--22++--88;@@I d4;;66AAHHJK"('D 	JJL ,,


  "!!%(   "
 	S!!!#MM""1%?#@$(MM!$4dmmA6F#G$H IMM&&t}}Q'78!!# ,,


 	OOb!yyD 2 2DII>!!$++"#$K"L"#$L"M	Or   c                    |j                  |t              |k(  rq| j                  j                  |       | j                  j	                  |dd       | j                  j                  |dd       | j                  j                          yy)z;Select and expand the path to a matching mirror in the listNFTr9   r:   )r.   rj   rI   expand_to_pathrz   r{   r   )r}   r   r@   r0   r   s        r   r   zDialogMirror.select_mirrorT  sn    tZ(F2$$T*  tU3$$TTS$I  " 3r   c                     | j                   j                          | j                  j                  dt	        d      z         | j
                  j                  d       | j                  j                  d       y)z# Abort the mirror performance test z	<i>%s</i>zCanceling...Fr   N)	r   r   rS   r   r   rQ   r   rU   r   )r}   r   s     r   r   z*DialogMirror.on_button_cancel_test_clicked^  sV    LLOOkAn,==>$$U+&&q)r   r   )__name__
__module____qualname__r   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r+   r+   K   sD    \>|,+B	#1L
:*OX*r   r+   r   ) r?   girequire_versiongi.repositoryr   r   r   r   r   r   syssoftwareproperties.gtk.dialogsgtkr   softwareproperties.MirrorTestr   softwareproperties.gtk.utilsr   r   ranger   r   rj   r/   rp   r   %softwareproperties.CountryInformationr
   versionr   r)   r+   r   r   r   <module>r      s   . 
 	   5%   &    	 
 0 0 4
 "%(^ z?CE!H~ <}m D;;#
(C8X* X*r   