o
    Q`8  ã                   @   sØ   d dl Z d dlZe 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  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
jdkr^dd„ Zddd„ZG dd„ dƒZdS )é    NÚGtkz3.0)ÚGObjectr   )Úgettext)Ú
MirrorTest)Úsetup_uié   é   )ÚCountryInformationÚ3c                 C   s   | |k| |k  S ©N© )ÚaÚbr   r   úE/usr/lib/python3/dist-packages/softwareproperties/gtk/DialogMirror.pyÚ<lambda>-   s    r   c                 C   s–   |   |dddd¡\}}}}|   |dddd¡\}}	}
}|  |¡}|  |¡}|r-|
r-t||ƒS |r1dS |
r5dS |r9dS |	r=dS ||krFt||ƒ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   é   éÿÿÿÿ)ÚgetZiter_has_childÚcmp)ÚmodelZiter1Ziter2ÚdataZurl1Zsep1Zcustom1Zmirror1Zurl2Zsep2Zcustom2Zmirror2Z
has_child1Z
has_child2r   r   r   Úsort_mirrors/   s"   





r   c                   @   sx   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zdd
d„Zddd„Zddd„Z	ddd„Z
dd„ Zddd„Zdd„ Zdd„ ZdS )ÚDialogMirrorc                 C   s  ddd„}|| _ tƒ | _t| tj |dd¡dd | j| _| j 	|¡ | j
| _| j 	| j¡ || _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _| j| _t  t!j"t!j"¡}| j #|¡ t $¡ }| j %|d¡ | j &|d	d
¡ t 't!j"t!j(t!j(t!j)¡| _*| j +|d¡ tj,| j*d| _-|| _| j #| j-¡ t $¡ | _.| j. /d| j0| j*¡ tj1d| j.t2d| _3| j 4| j3¡ i }d}	| j 5¡  5¡ }
t6| j ƒd
kró| j D ]}|
 7d|dddg¡ | j3 &| j.dt8¡ qÕ|
 7dg d¢¡ | jj9j: ;¡ D ]\}| jj9j:| }|j<|v r|
 7||j< |dd|g¡ qú|j<dkrL|
 7d| j =|j<¡dddg¡}|j<| jj>kr;|	dkr;|}	|
 7||dd|g¡f |||j<< qú|
 7d|dd|g¡ qú|	dkr€| j- ?| j- @|	¡d ¡}| j A|d¡ | j B|dd¡ | jjC|ddd | j- DtEd¡ dS )zQ
    Initialize the dialog that allows to choose a custom or official mirror
    Nc                 S   s   |   |t¡S r   )Ú	get_valueÚCOLUMN_SEPARATOR)r   Úiterr   r   r   r   Úis_separatorQ   s   z+DialogMirror.__init__.<locals>.is_separatorZ
gtkbuilderzdialog-mirror.uizsoftware-properties)ÚdomainTZmarkupr   )r   ZeditedZURI)ÚtextFZeditable)NTFNr   ç      à?©Z	use_alignZ	row_alignr   )FÚcustom_mirrorsr	   Zcountry_infor   ÚosÚpathÚjoinZdialog_mirrorÚdialogZset_transient_forZdialog_mirror_testÚdialog_testÚdistroZtreeview_mirrorsÚtreeviewZbutton_mirror_editÚbutton_editZbutton_mirror_removeÚbutton_removeZbutton_mirror_chooseÚbutton_chooseZbutton_test_cancelÚbutton_cancelZlabel_test_mirrorÚ
label_testZprogressbar_test_mirrorÚprogressbar_testZcombobox_mirror_protoÚcomboboxÚprogressZlabel_actionr   Z	ListStorer   ZTYPE_STRINGZ	set_modelZCellRendererTextZ
pack_startZadd_attributeZ	TreeStoreZTYPE_BOOLEANZTYPE_PYOBJECTr   Zset_row_separator_funcZTreeModelSortÚ
model_sortZrenderer_mirrorZconnectÚon_edited_custom_mirrorZTreeViewColumnÚ
COLUMN_URIÚcolumn_mirrorZappend_columnÚ	get_modelÚlenÚappendÚCOLUMN_CUSTOMÚsource_templateÚ
mirror_setÚkeysÚlocationZget_country_nameÚcodeZget_pathZconvert_child_iter_to_iterZ
expand_rowÚ
set_cursorÚscroll_to_cellZset_default_sort_funcr   )ÚselfÚparentZdatadirr(   r"   r   Úmodel_protoZcrZmap_locZpatriotr   ÚmirrorÚhostnameZ	path_sortr   r   r   Ú__init__M   sš   
ÿý
þþ

þ
ÿÿ
zDialogMirror.__init__c                 C   s¨   |  |¡}| |¡}|dkr8| |t|¡ |dkr-| |t¡s-| |t¡s-| dg d¢¡ | j 	|  
|¡¡ dS | |¡ | | ¡ t¡rL| | ¡ ¡ | j d¡ dS )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_nextZ	set_valuer4   r   r   r9   Úinsertr,   Úset_sensitiveÚis_valid_mirrorÚremoveÚget_iter_firstr)   r?   )rA   Zcellr$   Znew_textr   r   rJ   r   r   r   r3   «   s"   


ÿ
þ
ûz$DialogMirror.on_edited_custom_mirrorc                 C   s$   |dkrdS t  d|¡dkrdS dS )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)rA   Zurir   r   r   rM   Á   s
   zDialogMirror.is_valid_mirrorNc                 C   s$  |  ¡ \}}|dkr| j d¡ | j d¡ | j d¡ dS | ¡ }| |¡}| |t¡}| j	 ¡ }| 
¡  |dkri| j	 d¡ g }	|jD ]}
|
j|	v rMqE|	 |
j¡ | |
 ¡ ¡ qE| j	 d¡ | j d¡ dS | j | |t¡¡ | j | |t¡¡ | j |  | |t¡¡¡ | j	 d¡ dS )ze Check if the currently selected row in the mirror list
        contains a mirror and or is editable NFTr   )Ú
get_cursorr+   rL   r*   r,   r6   rI   r   ÚCOLUMN_MIRRORr0   ÚclearZrepositoriesÚprotor8   Zget_infoZ
set_activer9   rM   r4   )rA   r)   r   ÚrowÚcolumnr   r   rD   Zmodel_protosZseen_protosZrepor   r   r   Ú"on_treeview_mirrors_cursor_changedÊ   s2   



z/DialogMirror.on_treeview_mirrors_cursor_changedc                 C   sd   | j  ¡ \}}| j  ¡  |¡}| j  ¡  ¡ }| |¡ | | ¡ t¡r*| | ¡ ¡ | j  d¡ dS )z& Remove the currently selected mirror rH   N)	r)   rR   r6   rI   rN   r   rO   r   r?   )rA   Úbuttonr   r$   rW   r   r   r   r   r   Úon_button_mirror_remove_clickedë   s   
z,DialogMirror.on_button_mirror_remove_clickedc                 C   sH   | j  ¡  ¡ }| dtdƒdddg¡ | j  ¡  | j jd| jdd dS )zI Add a new mirror at the beginning of the list and start
        editing Nz
New mirrorFTrH   ©Zfocus_columnZstart_editing)r)   r6   r8   Ú_Ú
grab_focusr?   r5   )rA   rY   r   r   r   r   r   Úon_button_mirror_add_clickedö   s   

þz)DialogMirror.on_button_mirror_add_clickedc                 C   s.   | j  ¡ \}}| j  ¡  | j j||dd dS )z@ Grab the focus and start editing the currently selected mirror Tr[   N)r)   rR   r]   r?   )rA   rY   r   r$   rW   r   r   r   Úon_button_mirror_edit_clicked   s   
z*DialogMirror.on_button_mirror_edit_clickedc                 C   s   |   d¡ dS )z< If anybody wants to close the dialog, stop the test before NT)Úon_button_cancel_test_clicked)rA   r&   Zeventr   r   r   r   Ú"on_dialog_mirror_test_delete_event  s   
z/DialogMirror.on_dialog_mirror_test_delete_eventc                 C   s°   | j  ¡ }| j  ¡  | j ¡ \}}|sdS | j ¡ }| |¡}| |t¡}|t	j
jkrV|dkr5| |t¡S | j ¡ }| | j ¡ ¡}| |t¡}	| |t¡}
d|	|j|
f S dS )z= Run the chooser dialog and return the chosen mirror or None Nz
%s://%s/%s)r&   ÚrunÚhider)   rR   r6   rI   r   rS   r   ZResponseTypeZOKr4   r0   Z
get_activeÚCOLUMN_PROTOÚ
COLUMN_DIRrE   )rA   ÚresrV   rW   r   r   rD   rC   Z
iter_protorU   Údirr   r   r   rb     s"   




zDialogMirror.runc                 C   s^  | j  d¡ | j ¡  t ¡ | _| j ¡  t ¡ }t 	d¡}| 
¡  ¡ }d| jjj| jjjd j|f }tt| jjj ¡ ƒ||| jƒ}| ¡  | j ¡ r†t ¡ rYt d¡ t ¡ sP| d¡ | ¡ r| j tdƒ|jd |jd f ¡ | j |jd	 ¡ | ¡  | j ¡ sL| j ¡  | j  !d
¡ |j"dkr¡| j# $| j%|j"¡ dS t& '| j(tdƒtdƒ¡ dS )zZ Perform a test to find the best mirror and select it 
        afterwards in the treeview Tzdpkg --print-architecturez!dists/%s/%s/binary-%s/Packages.gzr   Fgš™™™™™¹?zCompleted %s of %s testsr   r   rG   Nz%No suitable download server was foundz&Please check your Internet connection.))r-   rL   r'   ZshowÚ	threadingZEventÚrunningÚsetr#   ÚpopenÚreadÚstripr(   r:   ÚnameZ
componentsr   Úlistr;   ÚvaluesÚstartZis_setr   Zevents_pendingZmain_iteration_doÚwaitr1   Zset_textr\   Úset_fractionrT   rc   r.   Ú	set_labelZbestr2   ZforeachÚselect_mirrorÚdialogsZshow_error_dialogr&   )rA   rY   r   Zprogress_updateÚpipeZarchZ	test_fileÚtestr   r   r   Úon_button_test_clicked(  sN   



þÿý

ÿ
ÿ
ô

þz#DialogMirror.on_button_test_clickedc                 C   sP   |  |t¡|kr&| j |¡ | j |dd¡ | jj|ddd | j ¡  dS dS )z;Select and expand the path to a matching mirror in the listNFTr    r!   )r   r4   r)   Zexpand_to_pathr?   r@   r]   )rA   r   r$   r   rD   r   r   r   ru   T  s   
úzDialogMirror.select_mirrorc                 C   s:   | j  ¡  | j dtdƒ ¡ | j d¡ | j d¡ dS )z# Abort the mirror performance test z	<i>%s</i>zCanceling...Fr   N)	ri   rT   r.   rt   r\   r-   rL   r/   rs   )rA   rY   r   r   r   r`   ^  s   
z*DialogMirror.on_button_cancel_test_clickedr   )Ú__name__Ú
__module__Ú__qualname__rF   r3   rM   rX   rZ   r^   r_   ra   rb   ry   ru   r`   r   r   r   r   r   K   s    ^
	
!




,
r   r   ) r#   ZgiZrequire_versionZgi.repositoryr   r   r   r\   rh   rP   ÚsysZsoftwareproperties.gtk.dialogsZgtkrv   Zsoftwareproperties.MirrorTestr   Zsoftwareproperties.gtk.utilsr   ro   Úrangerd   re   r4   r   r9   rS   Z%softwareproperties.CountryInformationr	   Úversionr   r   r   r   r   r   r   Ú<module>   s$   

