
    r{gaJ                     &   d dl Z  e j                  dd       d dlmZmZmZmZmZmZmZ d dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dlZdZdZ e
j2                  ee        e	j2                  ee        e	j4                  e       e	j                  Z ej                  d       d Zd	 Z G d
 d      Z G d d      Zd Z  G d d      Z! e"ejF                        dk7  r e$d        ejJ                  d       ejL                  jO                  ejF                  d         Z(de(v r	 e!e(      Z)n@ejL                  jU                  e(      s e$de(         ejJ                  d        ee(      Z) ejV                          y)    NGtkz3.0)r   GioGLibGdkr   PangoGObject)
guess_typecaptainz/usr/share/localec                       fd}|S )Nc                  f    t        j                  | |      }d|_        |j                          |S )N)targetargskwargsT)	threadingThreaddaemonstart)r   r   threadfuncs      /usr/lib/captain/captain.pywrapperz_async.<locals>.wrapper   s,    !!DH     r   r   s   ` r   _asyncr      s    
 Nr   c                       fd}|S )Nc                  2    t        j                  g|   y N)r   idle_add)r   r   s    r   r   z_idle.<locals>.wrapper(   s    d"T"r   r   r   s   ` r   _idler    '   s    #Nr   c                   (    e Zd Zd Zed        Zd Zy)UIHelperc                     || _         y r   )window)selfr$   s     r   __init__zUIHelper.__init__0   s	    r   c                     t        j                  | j                  d|t         j                  j                        }|j                  d|d|       |j                          |j                          y NT)parentmodalmessage_typebuttonsz<big><b>z</b></big>

)r   MessageDialogr$   ButtonsTypeCLOSE
set_markuprundestroy)r%   dialog_typetitlemsgdialogs        r   show_dialogzUIHelper.show_dialog3   sT    ""$++*.1<,/OO,A,AC 	%EF

r   c                 h   t        j                  | j                  dt         j                  j                  t         j
                  j                        }|j                  d|d|       |j                          |j                          t        j                          t        j                          y r(   )r   r-   r$   MessageTypeERRORr.   r/   r0   r1   r2   	main_quitsysexit)r%   r4   r5   r6   s       r   show_criticalzUIHelper.show_critical=   sp    ""$++*.141F1F,/OO,A,AC 	%EF


r   N)__name__
__module____qualname__r&   r    r7   r>   r   r   r   r"   r"   .   s       	r   r"   c                       e Zd Zd Zed        Zed        Zed        Zed        Z	ed        Z
d Zd Zd	 Zd
 Zd Zedd       Zedd       Zd Zd Zd Zd Zd Zy)Appc                 P   t         j                  j                  |      | _        t         j                  j	                  |      | _        t        j                  d      | _        t        j                         | _        | j                  j                  t               | j                  j                  d       | j                  j                  |        | j                  j!                         D ]U  }t#        t%        |      t        j&                        s'dt        j&                  j)                  |      z  }t+        | ||       W t        j,                  t.        j0                        | _        t        j4                  d      }t        j6                         }|j9                  |d       |j;                  |dd       | j<                  j?                  |       | j<                  jA                  | j2                         t        j,                  t.        j0                        | _!        t        j4                  d      }t        j6                         }|j9                  |d       |j;                  |dd       | jD                  j?                  |       | jD                  jA                  | jB                         t        j4                  d      }t        j6                         }|j9                  |d       |j;                  |d	d       | jF                  j?                  |       | jH                  jK                  | j
                         | jL                  jO                  | j                         | jP                  jS                          tU        | jP                        | _+        | jY                          y )
Norg.x.captainschemaz!/usr/share/captain/deb_package.uiui_%s Tmarkupr   text)-ospathabspathabsolute_pathbasenamefilenamer   Settingssettingsr   Builderbuilderset_translation_domainAPPadd_from_fileconnect_signalsget_objects
issubclasstype	Buildableget_namesetattr	ListStorer   TYPE_STRING
added_listTreeViewColumnCellRendererText
pack_startadd_attributeui_treeview_addedappend_column	set_modelremoved_listui_treeview_removedui_treeview_filesui_headerbar	set_titleui_path_labelset_text	ui_windowshowr"   uihload_deb_file)r%   rM   widgetnamecolumnrenders         r   r&   zApp.__init__J   s   WW__T2((.O<{{}++C0""#FG$$T*ll..0 	,F$v,6!7!7!??dF+	, --(;(;<##B'%%'&$'VXq1,,V4((9MM'*=*=>##B'%%'&$'VXq1  ..v6  **4+<+<= ##B'%%'&$'VVQ/,,V4##DMM2##D$6$67DNN+r   c                 L   t        j                         | _        | j                  j                  j                  dkD  r.| j
                  j                  t        d      t        d             	 t         j                  j                  | j                  | j                        | _        d| _        d| _        d| _        d| _        d| j                  v r| j                  d   | _        d| j                  v r| j                  d   | _        d| j                  v r| j                  d   | _        d| j                  v r#| j!                  | j                  d         | _        | j#                          y # t$        t&        t(        f$ r}t+        d	|z         t-        | j                        }|d   d k7  r2|d   d
k7  r*t        d      | j.                  z  }t        d      |d   z  }n#t        d      | j.                  z  }t        d      }| j
                  j                  ||       Y d }~y d }~ww xY w)Nr   Broken dependencies?To fix this run 'sudo apt-get install -f' in a terminal window.rI   Version
MaintainerDescriptionzInstalled-SizezOpen failed with %sz%application/vnd.debian.binary-packagez%s is not a valid packagez#The MIME type of this file is '%s'.zCould not open %sz3The file might be corrupted or missing permissions.)aptCachecache	_depcachebroken_countrs   r>   _debfile
DebPackagerO   debversion
maintainerdescriptioninstalled_size
round_sizeon_file_loadedIOErrorSystemError
ValueErrorprintr	   rQ   )r%   emimetypeheaderbodys        r   rt   zApp.load_deb_filey   s   YY[
::,,q0HH""1%:#;Q  @A  >B  C	1{{--d.@.@$**MDH DL DO!D"$DDHH$#xx	2txx'"&((<"8(#'88M#: 488+&*oodhh?O6P&Q#!j1 
	1'!+, !3!34Ht#FF67$--G>?(1+M./$--?NOHH""6400
	1s   ,C<E) )H#=BHH#c                 4   | j                   j                  d       | j                  j                  | j                  j
                         | j                  j                  | j                  j
                         | j                  j                  | j                         | j                  j                  | j                         | j                  j                  | j                         t        | j                  d | j                          t#        j$                  t&              }	 |j)                  d t+        d      g      }| j                  j,                  D ]'  }|j/                  d      r|j)                  ||g       ) |j)                  d t+        d      g      }| j                  j0                  D ]'  }|j/                  d      r|j)                  ||g       ) 	 | j8                  j;                  |       | j8                  j=                          | j>                  jA                         jC                  d       | jE                          y # t2        $ rB}t5        d|       |j7                          |j)                  d t+        d      g       Y d }~d }~ww xY w)N	main_pagezControl files/z
Data filesz$Exception while reading the filelistzError while reading the contentsuggested-action)#ui_main_stackset_visible_child_namerq   rn   r   pkgnamerm   set_subtitler   ui_maintainer_labelrp   r   ui_size_labelr   set_descriptionui_textview_descriptionr   r   	TreeStorestrappendr   control_filelistendswithfilelist	Exceptionr   clearrl   ri   
expand_allui_install_buttonget_style_contextremove_class
run_checks)r%   storer   rv   r   s        r   r   zApp.on_file_loaded   s   11+>  !1!12##DHH$4$45&&t||4  ))$//:##D$7$7844dD<L<LM c"	G\\$?);(<=F11 1}}S)LL$01 \\$<(9:F)) 1}}S)LL$01 	((/))+002??@RS  	G8!<KKMLL"C DEFF	Gs&   $AI +AI I 	J8JJc                 *   | j                   j                  |       | j                  j                  |       | j                  j	                          | j
                  j                  |       |t        j                  j                  k(  r| j                  j                          y |t        j                  j                  k(  r| j                  j                          y |t        j                  j                  k(  r| j                  j	                          y y r   )ui_infobar_labelr0   
ui_infobarset_message_typerr   r   	set_labelr   r9   r:   ui_details_buttonhideINFOWARNING)r%   status_typestatusbutton_labels       r   set_package_statuszApp.set_package_status   s    ((0((5((6#/////""'')COO000""'')COO333""'') 4r   c                 B   d}| j                   j                         sU| j                  t        j                  j
                  t        d      | j                   j                  z  t        d             y| j                         }|rRt        d      dj                  |      z  }| j                  t        j                  j
                  |t        d             y| j                         }| j                   j                  \  | _        | _        | _        t        | j                        t        | j                        z   }|dkD  rPd}t!        j"                  dd	|      |z  }| j                  t        j                  j$                  |t        d             | j'                  |       y )
NTz	Error: %sz_Install PackageFzError: No longer provides %sz, r   z$Requires changes in %d other packagez%Requires changes in %d other packages)r   checkr   r   r9   r:   r   _failure_stringget_broken_providesjoincompare_deb_with_cacherequired_changesinstallremoveunauthenticatedlengettextngettextr   set_suggested_action)r%   all_okprovidesr   num_changeschangess         r   r   zApp.run_checks   sO    xx~~##COO$9$91[>DHHLdLd;dfghzf{| ++-5689LLF##COO$9$9FAFXDYZ,,.<@HH<U<U9t{D$8$++&T\\)::?F&&'MOv  yD  E  HS  SG##COO$;$;WaHZF[\!!&)r   c                     |rC| j                   j                         j                  d       | j                   j                          | j                   j	                  d       y )Nr   T)r   r   	add_classgrab_defaultset_sensitive)r%   r   s     r   r   zApp.set_suggested_action   sI    ""446@@AST""//1,,T2r   c                     t        |      }t        d      t        d      t        d      fD ]  }|dk  s|t        d      k(  r n|dz  } |dd S )NKBMBGBg      @z.0f )floatr   )r%   sizeunits      r   r   zApp.round_size   s_    T{tWagqw/ 	Df}$FND	 s1TF##r   c                    t               }t               }	 | j                  | j                  j                     j                  }|r|j                  r6| j                  j                  D ]  }|D ]  }|j                  |d            t        |j                        j                  |      }|rt        | j                  j                               D ]  }| j                  |   j                  s| j                  |   j                  j                  D ]=  }|j                  D ],  }|j                  |v s|j                  |j                         . ?  |S y # t
        t        f$ r d }Y 'w xY wNr   )setr   r   r   	installedKeyError	TypeErrorr   add
differencelistkeysdependenciesor_dependenciesrv   )	r%   r   broken_providespkgpipackagedepds	            r   r   zApp.get_broken_provides   sK   5%	**TXX--.88C ||** +A + QqT*++ 3<<(33H=H#DJJOO$56 @Gzz'*44#'::g#6#@#@#M#M @C%(%8%8 @#$66X#5$3$7$7$?@@@ #"  )$ 	C	s   -E E+*E+c                    d}| j                   j                  | j                  v rd}| j                  | j                   j                     }| j                   j                  d      }|t        j
                  j                  j                  k(  rK|j                  r?| j                  t        j                  j                  t        d      t        d             |S |j                  r_|j                  j                  rIt        d      }| j                   j#                  t        j                  j                  t        d      |       |S )NTF)use_installedz%The same version is already installedz_Reinstall PackagezEIt is safer and recommended to install from the repositories instead.z-This package is available in the repositories)r   r   r   compare_to_version_in_cacher   r   r   VERSION_SAMEr   r   r   r9   r   r   	candidatedownloadablers   r7   )r%   r   r   resr5   s        r   r   zApp.compare_deb_with_cache  s    88tzz)F**TXX--.C((66T6JCckk,,999cmm''(<(<a@g>hjk  mA  kB  C  3==#=#=_`$$S__%9%91=l;morsr   c                 H   | j                   j                  d       t        j                  j	                  | j                         } |j
                  | j                          |j                  | j                          |j                  | j                  j                         y )NF)rq   r   aptkitsimpleclientSimpleAPTClientset_finished_callbackon_install_finishedset_cancelled_callbackon_install_cancelledinstall_filer   rQ   )r%   ru   r   r   s       r   dpkg_actionzApp.dpkg_action  st    $$U+!!11$..A!!!$":":;"""4#<#<=**+r   c                    | j                   j                         }|r|r|j                  t        j                  j                  t        j                  j                         t        j                  j                               t        j                         r*t        j                          t        j                         r)y y |j                  d        y y r   )rq   
get_window
set_cursorr   Cursornew_for_displayDisplayget_default
CursorTypeWATCHr   events_pendingmain_iteration)r%   show_busy_cursorwins      r   r
  zApp.show_busy_cursor&  s    nn'')szz99#++:Q:Q:SUXUcUcUiUijk((*&&( ((* t$ r   Nc                    | j                  d       t        j                         }| j                  d       |j                  j                  dkD  r.| j
                  j                  t        d      t        d             | j                  j                  |v r|| j                  j                     }|j                  rt        |j                  j                        t        | j                        k(  r| j                  j                  d       | j                  j                  d| j                  }| j                   j#                  t        d      |z         | j$                  j'                  d       y y y y )	NTFr   z"Failed to install all dependenciesr{   page_successr   z%s is now installed.)r
  r   r   r   r   rs   r>   r   r   r   is_installedr   r   r   r   r   ui_success_labelrp   rq   r   )r%   transaction
exit_stater   r   pkg_strs         r   r   zApp.on_install_finished0  s"   d#		e$??''!+HH""1%I#JA  OP  MQ  R88u$(()Cs}},,-T\\1BB&&==nM)-)9)94<<HG))2215K3Lw3VWNN006	 C   %r   c                 :    | j                   j                  d       y NT)rq   r   r%   r  r  s      r   r   zApp.on_install_cancelled@  s    $$T*r   c                 ,    t        j                          y r   r   r;   r%   ru   events      r   on_window_deletedzApp.on_window_deletedH      r   c                     |j                         r| j                  j                  d       y | j                  j                  d       y )Ncontent_pagedescription_page)
get_activeui_stackr   r%   ru   s     r   on_content_button_toggledzApp.on_content_button_toggledK  s3    MM00@MM001CDr   c                 &   |j                         }|j                         \  }}|r|r|j                         dk\  r||   d   }|j                         d   }t	        d      }| j                  d       	 |dk(  r| j                  j                  |      }n |dk(  r| j                  j                  |      }| j                  j                         j                  |      }	| j                  d       y y y y # t        $ r}t        |       Y d }~Wd }~ww xY w)N   r   z"The content could not be extractedT   F)	get_model
get_cursor	get_depthget_indicesr   r
  r   control_contentdata_contentr   r   ui_textview_file_content
get_bufferrp   )
r%   treeviewmodelrM   colrv   parent_pathdatar   bufs
             r    on_treeview_files_cursor_changedz$App.on_treeview_files_cursor_changedQ  s    ""$))+sTdnn.!3;q>D**,Q/K9:D!!$'!#8833D9D A%88006D //::<EEdKC!!%( 4T5  as   3AC2 2	D;DDc                    | j                   sy | j                  j                          | j                  j                          | j                  D ]  }| j                  j                  |g         | j                  D ]  }| j                  j                  |g         t        | j                        dk  r4| j                  j                          | j                  j                          t        | j                        dk  r4| j                  j                          | j                  j                          | j                  j                  | j                         | j                  j!                          | j                  j                          y r   )r   rb   r   rj   r   r   r   r   ui_added_labelr   ui_added_scrolledwindowui_removed_labelui_removed_scrolledwindowui_dialog_detailsset_transient_forrq   r1   )r%   ru   instrms       r   on_details_button_clickedzApp.on_details_button_clickedc  s$   xx
!LL 	+DOO""D6*	+++ 	+B$$bT*	+t||!$$&((--/t{{q !!&&(**//100@""$##%r   c                 (    | j                  |d       y r  )r   r!  s     r   on_install_button_clickedzApp.on_install_button_clickedv  s    &r   NN)r?   r@   rA   r&   r   rt   r    r   r   r   r   r   r   r   r   r
  r   r   r  r"  r4  r>  r@  r   r   r   rC   rC   H   s    -^ 1 1B  > 
* 
* * *4 3 3$#,,% 7 7 + +E)$&&'r   rC   c                    | j                         }	 |j                  d      }||d   }d|d<   n|dz   }d|j                         z  }|D ]%  }|j                         }|dk(  r|dz  }||dz   z  }' t	        j
                  dt        j                        j                  d|      }t	        j
                  dt        j                        j                  d	|      }t	        j
                  d
t        j                        j                  d|      }|j                  |       |j                  d t        j                  j                        }|j                  d      }|j                  dt        j                   j"                  d       \  }}	|j%                  |||	       y # t&        $ r&}
t)        |
       |j                  d       Y d }
~
y d }
~
ww xY w)N
r   rI   z%s
.z^(\s|\t)*(\*|0|-)z
*z\nr   z\s\s+)weight)r-  splitr4   striprecompile	MULTILINEsubrp   
create_tagr   WeightBOLDget_iter_at_offsetforward_searchr   TextSearchFlags	TEXT_ONLY	apply_tagr   r   )textviewsummaryr   bufferrK   linetagiterr   endr   s              r   r   r   z  s     "F!''-?!!nGKNnG'   	$D::<Ds{t#	$ zz.r||<@@Mzz%.223=zz(BLL155dDA U\\->->?((+**41D1D1N1NPTUtS) as   F
F 	G&GGc                   H    e Zd Zd Zedd       Zedd       Zd Zd Zd Z	y)	URLAppc                    t        d       | _        |j                  dd      }|j                  d      d   | _        t
        j                  j                  d       } |j                  | j                          |j                          y )Napt://rI   ?r   )r"   rs   replacerF  r   r   r   r   r   on_update_finishedupdate_cache)r%   urlr   s      r   r&   zURLApp.__init__  so    D> kk(B'yy~a( !!11$7!!!$"9"9:r   Nc                    |t         j                  j                  k7  rt        j                          t        j                         }|j                  j                  dkD  r.| j                  j                  t        d      t        d             | j                  |vr;| j                  j                  t        d      | j                  z  t        d             || j                     | _        | j                  j                  r;| j                  j                  t        d      | j                  z  t        d             | j                  j                  r | j                  j                  j                   s;| j                  j                  t        d      | j                  z  t        d             t#        j$                  d	      | _        t        j(                         | _        | j*                  j-                  t.               | j*                  j1                  d
       | j*                  j3                  |        | j*                  j5                         D ]U  }t7        t9        |      t        j:                        s'dt        j:                  j=                  |      z  }t?        | ||       W | j@                  jC                  t        d      | j                  z         tE        | jF                  | j                  j                  jH                  | j                  j                  jJ                         | jL                  jO                          y )Nr   rz   r{   'The package '%s' could not be installedz%It was not found in the repositories.zIt is already installed.zIt is not installable.rE   rF   z/usr/share/captain/apt_url.uirH   zDo you want to install '%s'?)(r   enumsEXIT_SUCCESSr   r;   r   r   r   r   rs   r>   r   r   r   r  r   r   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   ui_body_labelrp   r   ui_textviewrU  r   rq   rr   )r%   r  r  r   ru   rv   s         r   ra  zURLApp.on_update_finished  sR   222MMO 		??''!+HH""1%:#;Q  @A  >B  C <<u$HH""1%N#ORVR^R^#^`a  cJ  aK  L&88  HH""1%N#ORVR^R^#^`ab|`}~""txx'9'9'F'FHH""1%N#ORVR^R^#^`abz`{| O<{{}++C0""#BC$$T*ll..0 	,F$v,6!7!7!??dF+	, 	##A&D$E$TU(($((*<*<*D*DdhhFXFXFdFder   c                 ,    t        j                          y r   r  r  s      r   r   zURLApp.on_install_finished  s    r   c                 ,    t        j                          y r   r  r  s      r   r  zURLApp.on_window_deleted  r  r   c                 ,    t        j                          y r   r  r!  s     r   on_cancel_button_clickedzURLApp.on_cancel_button_clicked  r  r   c                 X   	 t         j                  j                  d       } |j                  | j                          |j
                  | j                  g       y # t        $ rE}| j                  j                  t        d      | j                  z  t        |             Y d }~y d }~ww xY w)Nre  )r   r   r   r   r   install_packagesr   r   rs   r>   r   r   )r%   ru   r   r   s       r   r@  z URLApp.on_install_button_clicked  s    	h%%55d;C%C%%d&>&>? C  $,,0 	hHH""1%N#ORVR^R^#^`cde`fgg	hs   AA 	B)$;B$$B)rA  )
r?   r@   rA   r&   r    ra  r   r  rm  r@  r   r   r   r\  r\    s@    
 # #J  hr   r\  r$  zUsage: captain filename.debr%  r^  zFile not found: ),girequire_versiongi.repositoryr   r   r   r   r   r   r   localerL   setproctitler<   r   r   apt.debfilerH  	mimetypesr	   aptkit.simpleclientr   aptkit.enumsrW   
LOCALE_DIRbindtextdomain
textdomainr   r   r    r"   rC   r   r\  r   argvr   r=   rM   
expanduserargumentappexistsmainr   r   r   <module>r     so   
   5%   C C C   	  
  
  	      
   c: &   sJ '   3 OO   ) $ 4o' o'd	!FJh JhX sxx=A	
'(CHHQK77chhqk*x

C77>>(# 
+,
h-C 
r   