
    l
j}                        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 dl	Z	d dl
Z
d dlZd dlmZ d dlmZmZmZmZmZmZ d dlZd dlmZ d dlZ	 d dlZej                  ZdadgZd Z G d d	      Zd d
l m!Z!m"Z"  e!dd      Z# e!ddejH                  jJ                  fdejH                  jL                  fdejH                  jN                  ff      Z$ e!dd      Z( e!dd      Z) e!dd      Z* e!dd      Z+ G d de"      Z, G d de      Z- G d d      Z. G d d       Z/ej`                  jc                   ejd                               a3 G d! d"ejh                        Z5dCd#Z6dCd$Z7d% Z8d& Z9d' Z:d( Z;d) Z<d* Z=d+ Z>d, Z?da@d-ZAd. ZB G d/ d0ej                        ZDd1 ZEd2 ZF eF       fd3ZGd4 ZHd5 ZId6 ZJd7 ZKd8 ZL G d9 d:ej                        ZM G d; d<      ZN G d= d>ej                        ZP ej                  ej                        ZSeSj                   eP              ej                  j                  eS       	 ej                  d?   ZXeXr&ej                  j                  ej                         n%ej                  j                  ej                          ej                         Z]dA Z^dB Z_y# e$ r Y cw xY w#  d@ZXY wxY w)D    N)Path)ThreadPoolExecutor)GLibGtkGdkGObject	GdkPixbufGio)get_network_monitorstart_transfer_opc                      t         j                  dk(  r t        j                  d       t	               ay t        j                  d       t        t        j                               ay )NlandlockzUsing NewThreadExecutorzUsing ThreadPoolExecutor)max_workers)	configsandbox_modeloggingdebugNewThreadExecutorglobal_rpc_threadpoolr   prefsget_remote_pool_max_threads     /usr/libexec/warpinator/util.pyinitialize_rpc_threadpoolr   +   sI     j(/0 1 301 2u?`?`?b cr   c                   2    e Zd Zd Zd Zd Zd Zd ZddZy)	r   c                 v   t        j                         | _        t        j                         | _        i | _        d| _        d| _        t        j                         | _        t        j                         | _        t        j                  | j                  d      | _        | j                   j#                          y )Nr   Fz NewThreadExecutor-factory-thread)targetname)r   r   r   queueSimpleQueuetransfer_queue_threadscount	_shutdown	threading	Condition_wait_conditionLock_thread_store_lockThreadfactory_thread_func_factory_threadstartselfs    r   __init__zNewThreadExecutor.__init__6   s     <<>#//1
(224"+.."2(//t7O7OVxy""$r   c                    	 | j                   5  | j                  j                         r;| j                  s/t	        j
                  d       | j                   j                          d d d        | j                  rt	        j
                  d       n-	 | j                  j                         }| j                  |       t	        j
                  d       	 | j                  5  | j                  dk(  r
	 d d d        n4	 d d d        t	        j
                  d       t        j                  d       Zt	        j
                  d       y # 1 sw Y   xY w# t        j                  $ r t	        j
                  d       Y w xY w# 1 sw Y   xY w)	Nz#NewThreadExecutor: Waiting on an opz(NewThreadExecutor: Factory shutting downz9NewThreadExecutor: factory thread woke but nothing to do.z5NewThreadExecutor: Shutting down - waiting on workersr   sleepg?z?NewThreadExecutor: done waiting for workers, end factory thread)r(   r"   emptyr%   r   r   wait
get_nowaitspawn_threadr    Emptyr*   r$   timer3   )r0   opinfos     r   r,   z%NewThreadExecutor.factory_thread_funcC   s;   %% 0&&,,.t~~MM"GH((--/0
 ~~HI[,,779!!&)   	MN(( ::? " MM'"JJrN  	WX-0 0 ;; [YZ[
 s*   AE+E E;E
(E87E8;Fc                 R   | j                   rt        d      t        j                  d|j                  z         | j
                  j                  |||f       | j                  5  t        j                  d       | j                  j                          d d d        y # 1 sw Y   y xY w)Nz1Cannot start new transfer threads, shutting down.z*NewThreadExecutor: Adding op to queue (%s)z&NewThreadExecutor: Poking the factory.)	r%   RuntimeErrorr   r   __name__r"   putr(   notify)r0   funcargskargss       r   submitzNewThreadExecutor.submit]   s    >>RSSBT]]RStU 34 !! 	*MMBC  '')	* 	* 	*s   $0BB&c                 l   dt        j                         z  }t        j                  | j                  ||f      }| j
                  5  | xj                  dz  c_        || j                  |<   t        j                  d|d| j                         d d d        |j                          y # 1 sw Y   xY w)Nzop-thread-%d)r   r   rA      z+NewThreadExecutor: Starting thread for op: z, thread count UP: )r   get_monotonic_timer&   r+   _transfer_thread_funcr*   r$   r#   r   r   r.   )r0   r:   tnamets       r   r7   zNewThreadExecutor.spawn_threadj   s    !8!8!::D$>$>URXQZ[$$ 	vJJ!OJ#$DMM% MMbgimisistu	v 	
			v 	vs   A
B**B3c                    |d   j                   t        v r\t        j                  d       t	        j
                         }|j                  t        j                                |j                           |d   |d   i |d    | j                  5  | xj                  dz  c_        | j                  t        j                         j                  = t        j                  d| j                  z         d d d        | j                   5  | j                   j#                          d d d        y # 1 sw Y   9xY w# 1 sw Y   y xY w)Nr   z.NewThreadExecutor: Applying landlock to new oprE      z:NewThreadExecutor: Finished op call, thread count DOWN: %d)r=   LANDLOCK_METHODSr   r   r   Rulesetallowr   get_save_pathapplyr*   r$   r#   r&   current_threadr   r(   r?   )r0   r:   rss      r   rG   z'NewThreadExecutor._transfer_thread_funct   s   !9!11MMJK!!#BHHU((*+HHJq	6!9*q	*$$ 	eJJ!OJi668==>MMVY]YcYccd	e
 !! 	*  '')	* 	*	e 	e
	* 	*s   A!D(D4(D14D=c                 :   t        j                  d       d| _        | j                  5  | j                  j	                          d d d        t        j                  d       | j
                  j                          t        j                  d       y # 1 sw Y   NxY w)Nz NewThreadExecutor: Shutting downTz<NewThreadExecutor: Shutting down - waiting on factory threadz$NewThreadExecutor: Shutdown complete)r   r   r%   r(   r?   r-   join)r0   r5   s     r   shutdownzNewThreadExecutor.shutdown   st    89!! 	*  '')	* 	TU!!#<=	* 	*s   BBNT)	r=   
__module____qualname__r1   r,   rC   r7   rG   rU   r   r   r   r   r   5   s!    %Y4**"	>r   r   )IntEnumIntFlagTransferDirectionzWTO_REMOTE_MACHINE                                                   FROM_REMOTE_MACHINEFileTypeREGULAR	DIRECTORYSYMBOLIC_LINKRemoteStatuszONLINE                                         OFFLINE                                         INIT_CONNECTING                                         UNREACHABLE                                         AWAITING_DUPLEXOpStatusa  INIT                                 CALCULATING                                 WAITING_PERMISSION                                 CANCELLED_PERMISSION_BY_SENDER                                 CANCELLED_PERMISSION_BY_RECEIVER                                 TRANSFERRING                                 PAUSED                                 STOPPED_BY_SENDER                                 STOPPED_BY_RECEIVER                                 FAILED                                 FAILED_UNRECOVERABLE                                 FILE_NOT_FOUND                                 FINISHED                                 FINISHED_WARNING	OpCommanda  START_TRANSFER                                   UPDATE_PROGRESS                                   CANCEL_PERMISSION_BY_SENDER                                   CANCEL_PERMISSION_BY_RECEIVER                                   PAUSE_TRANSFER                                   RETRY_TRANSFER                                   STOP_TRANSFER_BY_SENDER                                   STOP_TRANSFER_BY_RECEIVER                                   REMOVE_TRANSFERCertProcessingResultzCERT_INSERTED                                                         CERT_UPDATED                                                         CERT_UP_TO_DATE                                                         FAILUREc                       e Zd ZdZy)RemoteFeaturesrE   N)r=   rW   rX   TEXT_MESSAGESr   r   r   re   re      s    Mr   re   c                         e Zd Zd fd	Z xZS )ReceiveErrorc                 z    || _         t        j                  d| j                   |fz         t        |   |       y )NzReceiveError: (fatal: %d): %s)fatalr   r   superr1   )r0   messagerj   	__class__s      r   r1   zReceiveError.__init__   s2    
5W8MMN!r   rV   )r=   rW   rX   r1   __classcell__rm   s   @r   rh   rh      s    " "r   rh   c                   .    e Zd ZddZd Zd Zd ZddZy)	InterfaceInfoNc                     || _         	 || _        | j                  d   | _        	 || _        | j                  d   | _        y #  d | _        d | _        Y /xY w#  d | _        d | _        Y y xY w)Naddr)ifaceip4ip4_addressip6ip6_address)r0   ru   rw   rt   s       r   r1   zInterfaceInfo.__init__   sn    
	$DH#xx/D
	$DH#xx/D	$DH#D
	$DH#Ds   A A AA(c                     |y| j                   | j                   |j                   k(  S | j                  | j                  |j                  k(  S yNFrv   rx   r0   others     r   __eq__zInterfaceInfo.__eq__   sS    ='##u'8'888'##u'8'888r   c                 "    | j                         S Nget_textr/   s    r   __str__zInterfaceInfo.__str__       }}r   c                 T   g }| j                   r>	 |j                  t        j                  t        j
                  | j                               | j                  r@	 |j                  t        j                  t        j                  | j                               |S |S #  Y RxY w#  Y |S xY wr   )
ru   appendsocket	inet_ptonr   SYSDEF_AF_INETrv   rw   SYSDEF_AF_INET6rx   )r0   blists     r   as_binary_listzInterfaceInfo.as_binary_list   s    88V--d.A.A4CSCSTU 88V--d.B.BDDTDTUV us   =B =B" B"B'c                     g }| j                   |j                  | j                          | j                  |j                  | j                         |d}|j                  |      S )N, )rv   r   rx   rT   )r0   	delimiteripss      r   r   zInterfaceInfo.get_text   s]    'JJt''('JJt''(I~~c""r   r   r   )r=   rW   rX   r1   r~   r   r   r   r   r   r   rq   rq      s    $$ 	#r   rq   c                   .    e Zd ZddZd Zd ZddZd Zy)	RemoteInterfaceInfoc                 N   |r|| _         d | _        y d }d }d | _         d | _        |D ]L  }	 t        j                  t        j                  |      }	 t        j                  t        j                  |      }N |r|| _         |r|| _        y y # t
        $ r Y Fw xY w# t
        $ r Y }w xY wr   )rv   rx   r   	inet_ntopAF_INET
ValueErrorAF_INET6)r0   r   testingru   rw   items         r   r1   zRemoteInterfaceInfo.__init__  s    $D#D 	D&&v~~t<&&v=	 "D"D     s#   $B	$B		BB	B$#B$c                     |y| j                   | j                   |j                   k(  S | j                  |j                  k(  r| j                  |j                  k(  S yrz   r{   r|   s     r   r~   zRemoteInterfaceInfo.__eq__#  s[    ='##u'8'888u000##u'8'888r   c                 "    | j                         S r   r   r/   s    r   r   zRemoteInterfaceInfo.__str__-  r   r   c                 .    | j                         \  }}}|S r   )get_usable_ip)r0   r   	remote_ip_s       r   r   zRemoteInterfaceInfo.get_text0  s    ,,.	1ar   c                 (   t               j                  }| j                  3|j                  '| j                  |j                  t        j                  fS | j
                  3|j
                  '| j
                  |j
                  t        j                  fS y r   )r   current_ip_inforv   r   r   rx   r   )r0   local_ip_infos     r   r   z!RemoteInterfaceInfo.get_usable_ip4  s{    +-=='M,E,E,Q$$m&?&?PP'M,E,E,Q$$m&?&?QQr   N)Fr   )r=   rW   rX   r1   r~   r   r   r   r   r   r   r   r     s    #6r   r   c                   &     e Zd Z fdZddZ xZS )FolderFileChooserDialogc                 &    t         t           ||dd        j                  t	        d      t
        j                  j                  t	        d      t
        j                  j                         t        j                  t
        j                  j                  d       _         j                  j                  |        j                  j                  d fd	        j                  j                           j!                         j#                   j                          j!                         j%                  d
        j                  j&                   _         j                  j(                   _         j                  d j*                         y )Ni  i  )titleparentdefault_widthdefault_heightCancelAddT)actionselect_multiplezfile-activatedc                 V    j                  t        j                  j                        S r   )responser   ResponseTypeOK)chooserr0   s    r   <lambda>z2FolderFileChooserDialog.__init__.<locals>.<lambda>L  s    t}}SM]M]M`M`?a r   r   zkey-press-event)rk   r   r1   add_buttonsr   r   r   CANCELr   FileChooserWidgetFileChooserActionOPENr   set_current_folder_fileconnectshow_allget_content_areaaddset_border_widthget_urisget_current_folder_fileon_button_press)r0   window_titletransient_parentstarting_locationrm   s   `   r   r1   z FolderFileChooserDialog.__init__A  s#   %t5L=MDGEH 	6 	J
 	8c&6&6&=&=53#3#3#6#6	8 ,,C4I4I4N4N`de,,->?-/ab##DLL1003--'+||'K'K$&(<(<=r   c                 <   t        | j                  j                               dk7  }|j                  t        j
                  t        j                  fv r;|r9| j                  t        j                  j                         t        j                  S t        j                  S )NrE   )lenr   r   keyvalr   KEY_KP_Enter
KEY_Returnr   r   r   r   
EVENT_STOPEVENT_PROPAGATE)r0   widgeteventdatamultis        r   r   z'FolderFileChooserDialog.on_button_pressU  si    DLL))+,1<<C,,cnn==%MM#**--.>>!"""r   r   )r=   rW   rX   r1   r   rn   ro   s   @r   r   r   @  s    >(#r   r   c                 l    t        t        d      | t              dfd	}j                  d|       S )NzSelect file(s) to sendc                 b    |t         j                  j                  k7  ry j                         ay r   )r   r   r   r   last_location)dialogresponse_idr   r   s      r   update_last_locationz;create_file_and_folder_picker.<locals>.update_last_location`  s*    #**---  779r   r   r   )r   r   r   r   )dialog_parentr   r   s     @r   create_file_and_folder_pickerr   ]  s3    %a(@&A=R_`G: OOJ 45Nr   c                     t         j                  j                         j                         }| 5d}t        j
                  j                  t        j                         |       }nd}t        j                         }t         j                  j                  |      }t        t	        j                               }	 |j                  ddd|t        j                  d|j!                         g|f      d t         j"                  j$                  dd 	       t'        j(                  d       y # t        j*                  $ r,}t'        j(                  d|j,                  z         Y d }~nd }~ww xY wt         j.                  j1                  d	d
      }	 t'        j(                  d       t         j.                  j3                  t        j4                         d        y # t        j*                  $ r,}t'        j6                  d|j,                  z         Y d }~y d }~ww xY w)N	ShowItemsShowFolderszorg.freedesktop.FileManager1z/org/freedesktop/FileManager1z(ass)  zOpening save folder using dbusz7Could not use dbus interface to launch file manager: %szinode/directoryTz(Opening save folder using Gio (mimetype)z*Could not open received files location: %s)r
   Applicationget_defaultget_dbus_connectionospathrT   r   rO   Filenew_for_pathstrgetpid	call_syncr   Variantget_uriDBusCallFlagsNONEr   r   Errorrl   AppInfoget_default_for_typelaunch_default_for_uriget_save_uricritical)filenamebusmethodabs_pathfile
startup_ideapps           r   open_save_folderr   j  s    //
%
%
'
;
;
=C77<< 3 3 5x@&&(88  *DRYY[!J]454ll7%)\\^$4j#AC'',,		 	67:: ]ORSR[R[[\\] ++
*
*+<d
CCS@A**5+=+=+?F:: SE		QRRSs2   7A+D# #E"6"EE"AG H!"HHc                     g d} t        t        j                               j                         }t        j                         }|j                         sy|j                  |      ry| D ]'  }|j                  |      }	 |j                  |      r y) t        j                  |t        j                  t        j                  z        S # t        $ r Y jw xY w)N)z.configz.cachez.localz.dbusz.sshz.mozillaz.thunderbirdz.Trash-F)r   r   rO   resolvehomeexistssamefilejoinpathrelative_tor   r   accessR_OKW_OK)forbidden_folders	save_pathr   folder	test_paths        r   verify_save_folderr    s    	 U((*+335I99;D$# MM&)		$$Y/ 0 99Y"'' 122  		s   >C	CCc                  n    t        j                  t        j                         t         j                        S r   )r   r  r   r   r  r   r   r   home_is_writabler
    s    
 99TYY["''**r   c           	         t        t        j                               j                         }|j	                  |       }	 |j                         }|j                  |      }	 |j                  |      r
t               y # t        $ r Y y w xY w# t        $ r}t        dt        |      z        d }~wt        $ r t        d|dt              d      w xY w)NzCould not resolve path '%s': %sz5Resolved path is not valid child of the save folder: z -> T)rj   )r   r   rO   r   r   r   r   r   OSErrorr<   rh   r   )relative_pathbase
unresolvedresolvedrelativer   s         r   test_resolved_path_safetyr    s     ##%&..0D}-JF%%' ''-	  & l" ' 		  G<s1vEFF F^hjmnvjwx  AE  F  	FFs5   !B  A< <	BB BB 	CB++)Cc                      t         j                  j                  t        j                               } | j                         S r   )r
   r   r   r   rO   	is_native)r   s    r   save_folder_is_native_fsr    s,    88  !4!4!67D>>r   c                  b    t         j                  j                         } d| j                         v S )Ntrash)r
   Vfsr   get_supported_uri_schemes)vfss    r   trash_uri_supportedr    s(    
''


Cc33555r   c                  D    t         j                  j                  dd        y )Nz	trash:///)r
   r   r   r   r   r   
open_trashr    s    KK&&{D9r   c                  ,    t        j                  d      S )Nbaobab)r   find_program_in_pathr   r   r   disk_usage_availabler!    s    $$X..r   c                      t        j                  d      rDt        j                  dt        j                         gt         j                  j
                         y y )Nr  )flags)r   r   spawn_asyncget_home_dir
SpawnFlagsSEARCH_PATH_FROM_ENVPr   r   r   open_disk_usager(    s=      *(D$5$5$78@e@ef +r   i   c                      t               ay r   )FreeSpaceMonitorfree_space_monitorr   r   r   initialize_free_space_monitorr,    s    *,r   c                       e Zd Zej                  j
                  ddfej                  j
                  ddfdZdez  dgdez  dgdez  d	gd
ez  dggZd Z	ddZ
d Zg fdZd Zd Zd Zd Zd Zd Zd Zd Zy)r*  Nr   )	low-spacefolder-changed   g?r   g      ?i'  g      @i       >@c                 r   t         j                  j                  |        t        j                  d       d | _        t        j                         | _        t        j                         | _        t        j                         | _        d| _        d| _        t!        j"                         | _        t        j&                  j)                  t!        j*                               | _        t         j.                  j1                  d| j2                         t         j.                  j1                  d| j2                         y )NzFreeSpaceMonitor newr   zchanged::receiving-folderzchanged::minimum-free-space)r   Objectr1   r   r   _monitor_threadr
   Cancellable_cancellabler&   Event_monitor_enabler)   _available_bytes_lock
sleep_timeavailable_bytesr   get_min_free_spacemin_freer   r   rO   save_folderprefs_settingsr   _folder_setting_changedr/   s    r   r1   zFreeSpaceMonitor.__init__  s    %,-#  OO-(0%.^^%5" 00288001D1D1FG$$%@$B^B^_$$%BDD`D`ar   c                 6   t         j                  j                  t        j                               }t        j
                         }| j                  j                  |      s|| _        | j                  d       | j                  |k7  r| j                  d       y y )Nr/  r   )r
   r   r   r   rO   r<  r>  equalemitr=  have_enough_free)r0   settingskeyr   
new_foldernew_min_frees         r   r@  z(FreeSpaceMonitor._folder_setting_changed  su    XX**5+>+>+@A
//1%%j1)DII&'==L(!!!$ )r   c                 ^    | j                   5  | j                  cd d d        S # 1 sw Y   y xY wr   )r9  r;  r/   s    r   get_freezFreeSpaceMonitor.get_free  s)    '' 	(''	( 	( 	(s   #,c                 <   t         j                  j                  t        j                               | _        t        j                         | _        d}|D ]  }t        j                  j                  t        j                         |      }t        j                  j                  |      sUt         j                  j                  |      }fd| |      z  } | j                  j                         s| j                  | j                         | j                   5  | j"                  |z   }t%        j&                  dt)        j*                  |      dt)        j*                  |      dt)        j*                  |      d       ||k  cd d d        S # 1 sw Y   y xY w)Nr   c                    | j                  t        j                  j                  d       t        j
                  k7  r?| j                  dt        j                  j                  d       }|r|j                  d      S yd}| j                  dt        j                  j                  d       }|j                  d       }|r|j                  |      }|j                         }|j                         }|j                         }|t        j
                  k(  r| |      z  }n||j                  d      z  }|j                  d       }|r|S )Nzstandard::allocated-sizer   )query_file_typer
   FileQueryInfoFlagsNOFOLLOW_SYMLINKSr\   r^   
query_infoget_attribute_uint64enumerate_children	next_file	get_childr   get_basenameget_file_type)	r   infosize
enumeratorchild	child_urichild_basename	file_typeget_contents_sizes	           r   r^  z<FreeSpaceMonitor.have_enough_free.<locals>.get_contents_size/  s/   ''(>(>(P(PRVW[c[m[mm??+E+.+A+A+S+S+/1D #889STT !445O585K5K5]5]59;
 "++D1&006E %I%*%7%7%9N $ 2 2 4I H$6$66 1% 88 9 9:T UU%//5D  r   zFreeSpaceMonitor - op needs r   z available (z of which is being overwritten))r
   r   r   r   rO   r>  r<  r=  r   r   rT   r   r8  is_set_refresh_availabler6  r9  r;  r   r   r   format_size)	r0   rX  top_dir_basenamesexisting_allocationbasenamer   folder_filetotalr^  s	           @r   rD  z!FreeSpaceMonitor.have_enough_free!  sD   88001D1D1FG002  ) $	BH77<< 3 3 5x@D77>>$'((//5K<  #4[#AAI$	BP ##**,##D$5$56'' 	 ((+>>EMM!!$')9)9%)@$BRBRSfBgi j%<		  	  	 s   A,FFc           	      6   t         j                  j                  t        j                               | _        t        j                         | _        t        j                  d| j
                  j                         dt        j                  | j                  t        z        d       | j                  Lt        j                   | j"                  | j$                  fd      | _        | j                  j'                          | j(                  j+                          y )Nz#FreeSpaceMonitor start (monitoring z,  keeping a z reservezFreeSpaceMonitor-thread)r   rA   r   )r
   r   r   r   rO   r>  r<  r=  r   r   get_pathr   ra  MB_TO_Br4  r&   r+   _monitor_thread_funcr6  r.   r8  setr/   s    r   r.   zFreeSpaceMonitor.startZ  s    88001D1D1FG002X\XhXhXqXqXsuy  vF  vF  GK  GT  GT  W^  G^  v_  `  	a'#,#3#34;T;T\`\m\m[o  wP  $QD   &&(  "r   c                 b    t        j                  d       | j                  j                          y )NzFreeSpaceMonitor pause)r   r   r8  clearr/   s    r   pausezFreeSpaceMonitor.pausee  s!    ./""$r   c                     t        j                  d       | j                  j                          | j                  j                          | j                  | j                  j                  d       y y )NzFreeSpaceMonitor shutdown   )r   r   r6  cancelr8  rk  r4  rT   r/   s    r   rU   zFreeSpaceMonitor.shutdowni  sX    12  "  "+  %%a( ,r   c                     d}| j                   D ]  }| j                  |d   k  s|d   } n t        j                  d|z         t	        j
                  |       y )Nr1  r   rE   z'FreeSpaceMonitor - sleep duration %.2fs)poll_levelsr;  r   r   r9   r3   )r0   durationlevels      r   _sleepzFreeSpaceMonitor._sleepp  sZ    %% 	E##uQx/ 8	 	?(JK

8r   c                     |j                         s<| j                  |       | j                          | j                  j	                          Ly r   )is_cancelledr`  rv  r8  r5   )r0   cancellables     r   rj  z%FreeSpaceMonitor._monitor_thread_funcz  s?    **,##K0KKM  %%'	 -r   c           	         d}	 | j                   j                  t        j                  |      }|j	                  t        j                        }|dk(  r/t        j                  t
        j                  j                  d      	 | j                  5  || j                  dz  dz  z
  }t        j                  d|t        j                  |dk\  r|nd      fz         |dkD  r|nd| _        | j                   dk(  r| j#                          d d d        y # t
        j                  $ r.}t        j                  d|j                  z         d}Y d }~d }~ww xY w# 1 sw Y   y xY w)Nr   zGSave directory's filesystem doesn't report useful available space info.)coderl   zWCould not query available disk space for the save directory, allowing all transfers: %si   z$FreeSpaceMonitor - %d available (%s))r>  query_filesystem_infor
   FILE_ATTRIBUTE_FILESYSTEM_FREErQ  r   r   	FileErrorFAILEDr   r   rl   r9  r=  r   ra  r;  _notify_low_space)r0   ry  r;  rW  r   adjusteds         r   r`  z#FreeSpaceMonitor._refresh_available  s\   	 ##99#:\:\^ijD"778Z8Z[O!#jjdnn&;&;  FO  P  P $ '' 	)&$--$*>*EFHMM@HdN^N^kswxkx_g~  OA  DB  B  C/7!|8D ##q(&&(	) 	)	 zz 	 vyz  zC  zC  C  DO	 	) 	)s%   A=D A7EE!$E

EEc                     | j                          t        j                  t        j                  | j                         y )N)priorityfunction)rn  r   idle_addPRIORITY_HIGH_notify_idle_cbr/   s    r   r  z"FreeSpaceMonitor._notify_low_space  s%    

t11D<P<PQr   c                 P    t        j                  d       | j                  d       y )Nz FreeSpaceMonitor - out of space!r.  )r   r   rC  r/   s    r   r  z FreeSpaceMonitor._notify_idle_cb  s    ;<		+r   r   )r=   rW   rX   r   SignalFlagsRUN_LAST__gsignals__ri  rs  r1   r@  rJ  rD  r.   rn  rU   rv  rj  r`  r  r  r   r   r   r*  r*    s    ))22D"="..77rBL -T#
.T#
'/T#
7
E#	Kb(	%( 8: 7 r	#%))$Rr   r*  c                    | D ]  }t         j                  j                  t        j                         |      }t        j                  d|d       t        j                  j                  |      }|j                  d       s y y)Nz)(server side) Checking if file or folder z already exists.TF)r   r   rT   r   rO   r   r   r
   r   r   query_exists)
base_namesr   r   r   s       r   files_existr    sh     ww||E//148W[]^xx$$T*T" r   c                  *    t        j                         S r   )r   get_host_namer   r   r   get_hostnamer    s    r   c                     t        j                         d| }t        j                         }||dk7  r|dk7  r|d|}|S )N@ Unknownz - )r   get_user_nameget_real_name)hostname
local_name	real_names      r   get_local_namer    sF     ..0(;J""$IbY)5K"+Z8
r   c                     t        j                  |       } t        j                  |      }| j                  |      r| j                  |dz   d      S y )N/r  )r   uri_unescape_string
startswithreplace)r[  base_uris     r   relpath_from_urir    sJ    ((3I''1HH%  C44r   c                    | j                   r|j                   sy|j                   r| j                   sy| j                  |j                  kD  ry|j                  | j                  kD  ry| j                  r|j                  sy|j                  r| j                  sy| j                  s)|j                  s| j                  |j                  k  rdS dS | j                  |j                  k  rdS dS )NrE   )favoriterecent_timedisplay_namer  )ambms     r   sort_remote_machinesr    s    	{{2;;	R[[	"..	(	"..	(		__R__[[2;;.r6B62??22::r   c                    | dk  rd} | dk  rt        d      S | dk  rt        d      | z  S | dk  r(t        | dz        }t        j                  dd|      |z  S t	        j
                  | dz        }| d	k  rTt        | |dz  dz  z
  dz        }t        j                  d
d|      |z  }t        j                  dd|      |z  }|d|}|S t        j                  dd|      |z  S )Nr   
   zA few seconds remaining<   z%d seconds remainingi  z	%d minutez
%d minutesi@8  z%d hourz%d hoursr   zapproximately %d hourzapproximately %d hours)r   roundgettextngettextmathfloorint)secondsminuteshourshmress         r   format_time_spanr    s    {"*++"'(722'"%\7CgMMJJw'*+E+wb0B67iU;eCk<AGKQ
35MuUX]]]r   c                     t        j                  | dz  dz        \  }}|dz  }t        j                  |dz        \  }}|dz  }t        j                  |dz        \  }}|dz  }	d|	||t        |      dd fz  S )Nr   r  z%02d:%02d:%02d.%srK   rp  )r  modfr   )
microsdectotal_secondsr  mdectotal_minutesr  hdectotal_hoursr  s
             r   precise_format_time_spanr    s    ))EDL4$78D-b G))MB$67D-b G		-""45D+"E5'7CIaN"KKLr   c                      t         j                  j                         } t        j                  t
              }| j                  d|      r|j                         S y)Nzgdk-window-scaling-factorrE   )r   Screenr   r   Valuer  get_setting	get_value)screenvs     r   get_global_scale_factorr    sB    ZZ##%FcA5q9{{}r   c                       e Zd Zdej                  j
                  ddfiZej                  j                  fdZ
ddZd Zd Zy)	CairoSurfaceLoadererrorNr   c                     t        j                         | _        | j                  j                  d| j                         t
        j                  j                  |      \  }}}|| _        |t               z  | _
        y )Nzsize-prepared)r	   PixbufLoaderloaderr   on_loader_size_preparedr   IconSizelookupsurface_sizer  pixbuf_size)r0   	icon_sizeswr  s        r   r1   zCairoSurfaceLoader.__init__   s_    ++-OT-I-IJ,,%%i01a688r   c                     | j                   }| j                   }||k7  r2||kD  r||z  }| j                   }||z  }n||z  }| j                   }||z  }| j                  j                  ||       y r   )r  r  set_size)r0   r  widthheightr   	new_width
new_heightaspect_ratios           r   r  z*CairoSurfaceLoader.on_loader_size_prepared	  sv    $$	%%
F?v~%~ ,,	&5
$v~!--
&5	Y
3r   c                     	 | j                   j                  t        j                  |             y # t        j                  $ r7 	 | j                   j                          n#  Y nxY w| j                  d       Y y w xY wNr  )r  write_bytesr   Bytesr   closerC  )r0   _bytess     r   	add_byteszCairoSurfaceLoader.add_bytes  s`    	KK##DJJv$67zz 	!!#IIg	s'   .1 A;A A; A$"A;:A;c                     	 | j                   j                          | j                   j                         }|r!t        j                  |t               d       }|S y #  | j                  d       Y y xY wr  )r  r  
get_pixbufr    cairo_surface_create_from_pixbufr  rC  )r0   pixbufsurfaces      r   get_surfacezCairoSurfaceLoader.get_surface&  sg    
	KK[[++-F>>v?V?X?CE 	 
	IIgs   AA A/r   )r=   rW   rX   r   r  r  r  r   r  DNDr1   r  r  r  r   r   r   r  r    sD    '%%..b9L "%!1!1 94$	r   r  c                       e Zd Zd Zy)AboutDialogc                    t         j                  rd}nd}t        j                  |t	        d      |ddt	        d      dt         j
                  t        j                  j                  	      }|j                          |j                          y )NzWarpinator (Flatpak)
WarpinatorAboutzorg.x.Warpinatorz)Send and Receive Files across the Networkz'https://github.com/linuxmint/warpinator)	r   r   program_name	icon_namelogo_icon_namecommentswebsiteversionlicense_type)
r   FLATPAK_BUILDr   r  r   VERSIONLicenseGPL_3_0rundestroy)r0   r   r   r   s       r   r1   zAboutDialog.__init__4  sk    )DD'(z.2+=0B*+,W*X)R)/.1kk.A.AC 	

r   N)r=   rW   rX   r1   r   r   r   r  r  3  s    r   r  c                   ,     e Zd ZdZdZ fdZd Z xZS )WarpLogFormatterzX%(asctime)-15s::warpinator::%(levelname)s: %(message)s -- %(filename)s (line %(lineno)d)z'%(asctime)-15s::warpinator: %(message)sc                 "    t         |           y r   )rk   r1   )r0   rm   s    r   r1   zWarpLogFormatter.__init__M  s    r   c                 V   |j                   t        j                  t        j                  fv r t        j
                  | j                  _        n<|j                   t        j                  k(  rt        j                  | j                  _        t        j                  j                  | |      }|S r   )levelnor   DEBUGERRORr  dbg_crit_format_style_fmtINFOinfo_format	Formatterformat)r0   recordresults      r   r  zWarpLogFormatter.formatP  sl    >>gmmW]];;/??DKK^^w||+/;;DKK""))$7r   )r=   rW   rX   r
  r  r1   r  rn   ro   s   @r   r  r  I  s    pO;K	r   r  WARPINATOR_DEBUGFc                 H   t        j                  t        j                         t         j                        st        j                  d       y t        |       dk(  r	 t        j                  | d          y y # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)NzRecents storage not writablerE   r   z2Could not add '%s' single item to recent files: %s)r   r  r   get_user_data_dirr  r   r   r   recent_manageradd_item	Exceptionwarning)uri_listr   s     r   "add_to_recents_if_single_selectionr  m  s    99T++-rww745
8}	V##HQK0   	VOOPSTTUU	Vs   A6 6	B!?BB!c                  f    t        j                  dt         j                  j                  d      } | S )NTF)	show_tips	sort_typeshow_not_found)r   RecentChooserMenuRecentSortTypeMRU)r   s    r   get_recent_chooser_menur#  x  s-    ##d.1.@.@.D.D38:G Nr   r   )`r&   r  r  r   r   pathlibr   r    sysr   r9   	tracebackconcurrent.futuresr   gi.repositoryr   r   r   r   r	   r
   r   networkmonitorr   r   r   r  r   r   rL   r   r   enumrY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   re   rh   rq   r   r   r   r%  r   Dialogr   r   r   r  r
  r  r  r  r  r!  r(  r+  ri  r,  r3  r*  r  r  r  r  r  r  r  r  r  r  r  r  StreamHandlerstdoutlog_handlersetFormatterroot
addHandlerenvironr   setLevelr  r  RecentManagerr  r  r#  r   r   r   <module>r5     s       	   
    1 A A  . 	 OO    
dY> Y>v "/ 2G H 
 :CLL,@,@ A!,cll.D.D E!0#,,2L2L M O P ~ (9 : :  2 3 K "3 4	 5 8A B 
W "9 "9# 9#v3 3j %%&7d&7&7&9:#cjj #:+SZ3@+F46:/g  
-hw~~ hT  )N ;&^8M6 6p ,w(( $ $g##CJJ/   )+ ,    $JJ)*E 	LL'--(LL',,' #""$	VA  		REs   J3 ?J? 3J<;J<?K