
    l
jp                     ,   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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mZmZ d dlmZmZmZmZmZmZ ej                  Z e	j8                         ZdZdZdZ dZ! G d	 d
ejD                        Z#y)    N)GObjectGLib)SendOp	ReceiveOpTextMessageOp)TransferDirectionOpStatus	OpCommandRemoteStatusReceiveErrorRemoteFeatures   
         c                      e Zd Zej                  j
                  ddfej                  j
                  ddfej                  j
                  deffej                  j
                  deffej                  j
                  ddfej                  j
                  ddfdZd Zd Z	d Z
d Zd Zd%d	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej2                  d%d       Zd Zd&dZd Zd'dZd&dZd Z d Z!ej2                  d        Z"ej2                  d        Z#ej2                  d        Z$d Z%ej2                  d%d        Z&d! Z'ej2                  d"        Z(ej2                  d#        Z)d$ Z*y)(RemoteMachineN )machine-info-changedops-changednew-incoming-opnew-outgoing-opfocus-remoteremote-status-changedc                    t         j                  j                  |        || _        || _        || _        || _        || _        || _        || _	        d| _
        d| _        t        j                  | j
                        | _        d| _        d| _        d | _        g | _        | j                  | _        t(        j*                  | _        d| _        t1        j2                         | _        d| _        t1        j2                         | _        d | _        d| _        t1        j>                         | _         t1        j>                         | _!        t        jD                  jG                  d| jH                         d| _%        d| _&        y )N r   Fzchanged::favorites)'r   Object__init__ip_infoportidentlocal_identapi_versionhostnamedisplay_hostname	user_namedisplay_nameprefsget_is_favoritefavoriterecent_timesupports_messagesavatar_surfacetransfer_opssort_keyr   INIT_CONNECTINGstatusmachine_info_changed_source_id	threadingLockmachine_info_changed_lockstatus_idle_source_idstatus_lockstubbusyEvent
ping_timerchannel_keepaliveprefs_settingsconnectupdate_favorite_statushas_zc_presencelast_register)selfr!   r$   r%   r   r    r"   r#   s           !/usr/libexec/warpinator/remote.pyr   zRemoteMachine.__init__.   s+   %	
&&  0--djj9!&""22./+)2)9&%&"$>>+		#//+!*!2$$%94;V;VW$    c           	      f   | j                   dk(  r| j                  }n| j                   dk(  r| j                  }t        j                  d| j                   | j
                  | j                  j                  | j                  | j                  fz        | _
        | j                  j                          y )N12z"remote-main-thread-v%s-%s-%s:%d-%s)targetname)r#   remote_thread_v1remote_thread_v2r3   Threadr$   r   ip4_addressr    r!   remote_threadstart)rB   funcs     rC   start_remote_threadz!RemoteMachine.start_remote_threadV   s     s"((D$((D&--T@d151A1A4==RVR^R^RjRjlpluluw{  xB  xB  1CAC D 	  "rD   c                      j                   j                           j                          t        j                  d j
                  d j                  j                  d        j                  t        j                          fd}	  |       r	  j                  t        j                         d _        y # t        $ rD}t        j                  d j
                   j                   j                  |fz         Y d }~od }~ww xY w)N!Remote: Attempting to connect to  (z) - api version 1c            	      	   t        j                  dj                  j                  j                  fz         t        j                         j                  j                  j                        } t        j                  |       }t        j                  dj                  j                  j                  fz  |      5 }t        j                  |      }	 |j                  d       t        j                   |      _        d}d}j.                  j1                         sgj6                  rBt        j                  d	j                  j                  j                  fz         d_        n	 t        j                  d
j                  j                  j                  fz         j"                  j9                  t;        j<                  j>                  tA        jB                               d       |s0j'                  t(        jD                         jG                         rt        j                  dj                  j                  j                  fz         j'                  t(        jH                         jK                  jL                         jK                  jN                         d}np|dz  }|tP        kD  rbt        j                  dj                  j                  j                  fz         j.                  j5                  t2               	 d d d        yj.                  j5                  jT                  t(        jH                  k(  rtV        ntX               j.                  j1                         sgjZ                  r$j.                  j1                         s
	 d d d        y	 d d d        y# t        j$                  $ r j'                  t(        j*                         |j-                          j.                  j1                         sgt        j                  dj                  j                  j                  t2        fz         j.                  j5                  t2               Y d d d        yY d d d        yw xY w# t        jR                  $ rD}t        j                  dj                  j                  j                  fz         Y d }~]d }~ww xY w# 1 sw Y   y xY w)Nz5Remote: Starting a new connection loop for %s (%s:%d)%s:%d   timeoutzRRemote: Unable to establish secure connection with %s (%s:%d). Trying again in %dsTFr   z9Remote Ping: Skipping keepalive ping to %s (%s:%d) (busy)zRemote Ping: to   %s (%s:%d)idreadable_name   zRemote: Connected to %s (%s:%d)r   zARemote: CheckDuplexConnection to %s (%s:%d) failed too many timesz-Remote: Ping failed, shutting down %s (%s:%d)).loggingdebugr%   r   r    authget_singletonget_cached_certr$   grpcssl_channel_credentialssecure_channelrM   channel_ready_futureresultwarp_pb2_grpcWarpStubr8   FutureTimeoutErrorset_remote_statusr   UNREACHABLEcancelr;   is_setCHANNEL_RETRY_WAIT_TIMEwaitr9   Pingwarp_pb2
LookupNamer"   utilget_hostnameAWAITING_DUPLEXcheck_duplex_connectionONLINErpc_callupdate_remote_machine_infoupdate_remote_machine_avatarDUPLEX_MAX_FAILURESRpcErrorr1   CONNECTED_PING_TIMEDUPLEX_WAIT_PING_TIMEr@   )certcredschannelfutureduplex_fail_counterone_pingerB   s          rC   run_secure_loopz7RemoteMachine.remote_thread_v1.<locals>.run_secure_loopm   s   MMQ!%!6!6dii PQ R %%'77t||TD006E$$W0H0H$))/T%TV[\ E`g227;!MM!M, - 6 6w ?DI '(# //002yy&a-1-B-BDLLRVR[R[,\'] ^$)	"#MM*H-1-B-BDLLRVR[R[,\+] ^ IINN8+>+>$BRBRMQM^M^M`,b34 + 6
 $, $ 6 6|7S7S T#'#?#?#A$+MM2S9=9N9NPTP\P\^b^g^g8h3i %j %)$:$:<;N;N$O$(MM$2Q2Q$R$(MM$2S2S$T/3H$71$<$7':=P'P(/6y=A=R=RTXT`T`bfbkbk<l7m )n(,(<(<=T(U/3mE Ex OO((|ObOb@b)<h}~O //002X ''0F0F0HEE EJ KE E .. 
!**<+C+CDMMO??113&z-1-B-BDLLRVR[R[]t,u'v w,,-DE#E E  !!E E
!b  $}} "#MM*Y151F1FVZV_V_0`+a b!"oE Esp   S/,OA-S/2F0R,AS/
'S/:S/B9R=S/S/RS/S,(9S'!S/'S,,S//S8z<!! Major problem starting connection loop for %s (%s:%d): %sF)r;   clearemit_machine_info_changedr^   r_   r%   r   rM   rk   r   r0   	Exceptioncriticalr    OFFLINErun_thread_alive)rB   r   r   s   `  rC   rJ   zRemoteMachine.remote_thread_v1d   s    &&(TXTiTikokwkw  lD  lD  E  	F|;;<L	\	X!# $ 	|334 %  	X[$($9$94<<TU#VW X X	Xs   B; ;	D:DDc                      j                   j                           j                           j                  j	                         \  }}t        j                  d j                  dd       |t        j                  k(  rndd j                  t        j                         t        j                         j                   j                    j                        }t#        j$                  |       fd} j                   j'                         s" |         j                   j'                         s" j                  t        j(                         y )NrS   rT   z) - api version 2[]c            	         d} t        j                  d	j                  fz  |       5 }	fd}t        j                  |t	        j
                               }t        j                  |      }	 |j                  d       |j                  |       t        j                  |      	_        	j                  t        j                         	j                         }|j                  d       	j                  t        j                          	j#                  	j$                         	j#                  	j&                         t)        j*                  d	j,                  z         	j.                  j1                         s6	j.                  j3                  d	       	j.                  j1                         s6|jG                  |       	 d d d        y # t4        $ r}	j                  t        j6                         t9        |t         j:                        r)|j=                          t)        j>                  d
|z         njt9        |t         j@                        r8t)        j>                  d|jC                         d|jE                                nt)        j>                  d|z         	j.                  j3                  d       Y d }~d }~ww xY w# |jG                  |       w xY w# 1 sw Y   y xY w)N))zgrpc.keepalive_time_ms'  )zgrpc.keepalive_timeout_ms  )z#grpc.keepalive_permit_without_callsT)z!grpc.http2.max_pings_without_datar   )z$grpc.http2.min_time_between_pings_msr   )z,grpc.http2.min_ping_interval_without_data_msr   rV   )optionsc                 r    | t         j                  j                  k7  r	 j                          y y #  Y y xY wN)rc   ChannelConnectivityREADYshutdown)staterB   s    rC   channel_state_changedzVRemoteMachine.remote_thread_v2.<locals>.run_secure_loop.<locals>.channel_state_changed   s4     8 8 > >>! MMO ?! s   2 6rW   rX   r   zConnected to %sg      ?z5Problem while waiting for channel - api version 2: %sz8Problem while awaiting duplex response - api version 2: z - z@General error with remote channel connection - api version 2: %s)$rc   re   r    intercept_channelinterceptorsChunkDecompressorrf   rg   	subscriberh   ri   r8   rk   r   rv   wait_for_duplexrx   ry   rz   r{   r^   infor%   r<   rn   rp   r   rl   
isinstancerj   rm   r   r}   codedetailsunsubscribe)
optsr   r   intercepted_channelr   duplexr   r   	remote_iprB   s
          rC   r   z7RemoteMachine.remote_thread_v2.<locals>.run_secure_loop   sb   D $$W	499/E%EuVZ[ 1?_f! '+&<&<W=I=[=[=]'_# 223FG"?MM!M,%%&;< - 6 67J KDI**<+G+GH!113FMM"M-**<+>+>?MM$"A"ABMM$"C"CD LL!2T5J5J!JK"44;;=..33B7 #44;;=" ''(=>c1? 1?H ! 4**<+C+CD!!T%<%<=(()`cd)de#At}}5((nontntnvxy  yB  yB  yD  *E  F(()kno)op**//334 ''(=>c1? 1?sD   AK#/EG4K#	K
C'K?KK

KK  K##K,)r<   r   r   r   get_usable_ipr^   r_   r%   socketAF_INETrk   r   r0   r`   ra   rb   r$   rc   rd   rn   r   )rB   _
ip_versionr   r   r   r   s   `    @@rC   rK   zRemoteMachine.remote_thread_v2   s    $$&&&(#'<<#=#=#? 	1jTXTiTiktuv!+v~~!=I!=YCX	|;;<!!#33DMM4<<P,,T2;	?z ((//1 ((//1 	|334rD   c                     | j                   dk(  r| j                  j                          n| j                  j                          	 | j                  j                  d       d | _        y # t        $ r
 Y d | _        y w xY w)NrF   r   )r#   r;   setr<   rN   joinAttributeErrorrB   s    rC   r   zRemoteMachine.shutdown  sq    s"OO!""&&(	##B' "  	!	s   A) )	A<;A<c                     | j                   }t        j                  | j                        | _         || j                   k7  r| j	                          y y r   )r*   r(   r)   r!   r   )rB   pspecdataold_favorites       rC   r?   z$RemoteMachine.update_favorite_status#  s>    }}--djj94==(**, )rD   c                 V    t        j                         | _        | j                          y r   )r   get_monotonic_timer+   r   r   s    rC   stamp_recent_timezRemoteMachine.stamp_recent_time*  s    224&&(rD   c                     | j                   5  | j                  dkD  rt        j                  | j                         t        j                  | j
                  |      | _        d d d        y # 1 sw Y   y xY wNr   )r7   r6   r   source_removeidle_addset_status_cbrB   r1   s     rC   rk   zRemoteMachine.set_remote_status.  s_     	S))A-""4#=#=>)-t7I7I6)RD&		S 	S 	Ss   AA**A3c           	         | j                   5  d| _        || j                  k(  rt        j                  cd d d        S || _        | j                          t        j                  d| j                  dt        | j                        j                  d       | j                  d       d d d        t        j                  S # 1 sw Y   t        j                  S xY w)Nr   zRemote: z is now z ****r   )r7   r6   r1   r   SOURCE_REMOVEcancel_ops_if_offliner^   r_   r$   r   rI   emitr   s     rC   r   zRemoteMachine.set_status_cb5  s     
	/)*D&$))	
	/ 
	/ !DK&&(MMUYU`U`HaHfHfghII-.
	/ !!!
	/ !!!s   &C A+C  Cc                     | j                   5  | j                  dkD  rt        j                  | j                         t        j                  | j
                        | _        d d d        y # 1 sw Y   y xY wr   )r5   r2   r   r   r   emit_machine_info_changed_cbr   s    rC   r   z'RemoteMachine.emit_machine_info_changedD  s]    ++ 	c22Q6""4#F#FG26--@a@a2bD/		c 	c 	cs   AA))A2c                     | j                   5  d| _        | j                  d       d d d        t        j                  S # 1 sw Y   t        j                  S xY w)Nr   r   )r5   r2   r   r   r   r   s    rC   r   z*RemoteMachine.emit_machine_info_changed_cbK  sL    ++ 	.23D/II,-	. !!!		. !!!s	   >Ac                     	 t        j                  j                  |g|i | y # t        $ rD}t	        j
                  d| j                  | j                  | j                  |fz         Y d }~y d }~ww xY w)NzA!! RPC threadpool failure while submitting call to %s (%s:%d): %s)	rt   global_rpc_threadpoolsubmitr   r^   r   r%   r   r    )rB   rP   argskargsr   s        rC   ry   zRemoteMachine.rpc_callR  sq    	X&&--dCTCUC 	X`$($9$94<<TU#VW X X	Xs   #& 	A3:A..A3c                     t        j                  d| j                  z         | j                  j	                  t        j                  | j                  t        j                                     }|j                  S )Nz!Remote: checking duplex with '%s'rZ   )r^   r_   r%   r8   CheckDuplexConnectionrr   rs   r"   rt   ru   response)rB   rets     rC   rw   z%RemoteMachine.check_duplex_connection[  s]    9D<Q<QQRii--h.A.ATEUEUPTPaPaPc/e f ||rD   c                     t        j                  d| j                  z         | j                  j                  j                  t        j                  | j                  t        j                                     }|S )Nz$Remote: waiting for duplex from '%s'rZ   )r^   r_   r%   r8   WaitingForDuplexr   rr   rs   r"   rt   ru   )rB   r   s     rC   r   zRemoteMachine.wait_for_duplexc  s^    <t?T?TTU++2283F3F$JZJZUYUfUfUh4j k rD   c                 "    t        j                  d j                  z          fd} j                  j                  j                  t        j                   j                  t        j                                     }|j                  |       y )Nz0Remote RPC: calling GetRemoteMachineInfo on '%s'c                    | j                         }|j                  _        |j                  _        t        |j                        }t        j
                  |v _        t        j                  j                        _
        t        j                  j                  d      }t        j                  |j                         d      _        j!                          j#                  t$        j&                         y )N)rg   r'   r&   r   feature_flagsTEXT_MESSAGESr,   r(   r)   r!   r*   r   utf8_make_validutf8_collate_keylowerr/   r   rk   r   rx   )r   r   r   validrB   s       rC   get_info_finishedzCRemoteMachine.update_remote_machine_info.<locals>.get_info_finishedn  s    ==?D $ 1 1D!^^DN*4+=+=>M%3%A%A]%RD"!11$**=DM(():):B?E 11%++-DDM**,""<#6#67rD   rZ   )r^   r_   r%   r8   GetRemoteMachineInfor   rr   rs   r"   rt   ru   add_done_callback)rB   r   r   s   `  rC   rz   z(RemoteMachine.update_remote_machine_infol  sp    H4K`K``a	8 //66##"//1
 	  !23rD   c                 *   t        j                  d| j                  z         | j                  j	                  t        j                  | j                  t        j                                     }d }	 |D ]3  }|t        j                         }|j                  |j                         5 	 | j#                  |       y # t        j                  $ rB}t        j                  d|j                         d|j!                         d       Y d }~bd }~ww xY w)Nz2Remote RPC: calling GetRemoteMachineAvatar on '%s'rZ   zARemote RPC: could not fetch remote avatar, using a generic one. (z, ))r^   r_   r%   r8   GetRemoteMachineAvatarrr   rs   r"   rt   ru   CairoSurfaceLoader	add_bytesavatar_chunkrc   r}   r   r   get_avatar_surface)rB   iteratorloaderr   r   s        rC   r{   z*RemoteMachine.update_remote_machine_avatar  s    JTMbMbbc9933##"//1
 	@  4>!446F  !2!234 	' }} 	@MMhihnhnhprsr{r{r}~	@s   28B= =D8DDc                 b    |r|j                         | _        nd | _        | j                          y r   )get_surfacer-   r   )rB   r   s     rC   r   z RemoteMachine.get_avatar_surface  s,     "("4"4"6D"&D&&(rD   c           
         | j                   sy t        j                  d| j                  z         t	        j
                  t	        j                  |j                  |j                  t        j                         t        j                               |j                  | j                  |j                  |j                   |j"                  |j$                  |j&                        }| j                   j)                  |       y )Nz-Remote RPC: calling TransferOpRequest on '%s')r!   	timestampr\   use_compression)r   sender_namereceiversizecountname_if_singlemime_if_singletop_dir_basenames)r8   r^   r_   r%   rr   TransferOpRequestOpInfosender
start_timert   ru   r(   r   r   r!   
total_sizetotal_countdescriptionr   r   ProcessTransferOpRequest)rB   optransfer_ops      rC   send_transfer_op_requestz&RemoteMachine.send_transfer_op_request  s    yyEI^I^_`00ii--"//1 % 5 5 7	 ZZ..>>,, 22
  			**;7rD   c                    t        j                  d| j                  z         |j                  t        j
                  k(  r|j                  }n| j                  }| j                  j                  t        j                  |j                  |t        j                                      |j                  |rt         j"                         y t         j$                         y )Nz3Remote RPC: calling CancelTransferOpRequest on '%s'r   r!   r\   )r^   r_   r%   	directionr   TO_REMOTE_MACHINEr   r"   r8   CancelTransferOpRequestrr   r   r   rt   ru   
set_statusr	   CANCELLED_PERMISSION_BY_SENDER CANCELLED_PERMISSION_BY_RECEIVER)rB   r   	by_senderrI   s       rC   cancel_transfer_op_requestz(RemoteMachine.cancel_transfer_op_request  s    KtOdOdef<<,>>>99D##D		))OO--"//1	
 	h==zPXPyPyzrD   c                 :   t        j                  d| j                  z         t        j                         }t        j                        _        d _        t        j                        j                  t        j                         | j                  j                  t        j                   j"                  | j$                  t'        j(                         j*                  xr t-        j*                                     _        fd}	 j1                          j.                  D ]  }j3                  |        d _        j5                          t        j                  dj6                  dt        j8                  j:                        dt'        j<                  t        j                         |z
               j>                  dkD  r3tA        dj6                  j6                  j>                  z
  fz  d	
      j                  t        jB                         y # tD        jF                  $ rK}|jI                         tD        jJ                  jL                  k(  r	 |d        n ||       Y d }~y Y d }~y d }~wt@        $ rr}|jN                  r	 ||       nSt        jP                  tS        |             jU                  |       j                  t        jV                         Y d }~y Y d }~y d }~wtX        $ r} ||       Y d }~y d }~ww xY w)Nz)Remote RPC: calling StartTransfer on '%s')r   r!   r\   r   c                    d _         j                          | y j                  |        	 j                  j                  j	                          t        j                  dj                  dj                         j                  t        j                         j                          y # t
        j                  $ r Y tw xY w)Nz&An error occurred receiving data from z: )file_iteratorclean_current_top_dir_file	set_errorcurrent_streamcloser   Errorr^   r   r   	error_msgr  r	   FAILEDstop_transfer)errorr   r   s    rC   report_receive_errorz=RemoteMachine.start_transfer_op.<locals>.report_receive_error  s    #B //1}LL **6++113 ryyZ\ZfZfghMM(//* :: s   &B3 3C	C	zRemote: receipt of z files (z) finished in r   zvTransfer completed, but the number of files received is less than the original request size (expected %d, received %d)F)fatal)-r^   r_   r%   r   r   	transfersOpProgressTrackerprogress_trackercurrent_progress_reportFileReceiverr  r	   TRANSFERRINGr8   StartTransferrr   r   r   r"   rt   ru   r   r(   r  clean_existing_filesreceive_datareceive_finishedr   format_sizer   precise_format_time_spanremaining_countr   FINISHEDrc   r}   r   
StatusCode	CANCELLEDr  r   strr  FINISHED_WARNINGr   )rB   r   r   r  r   r   r   s    `    @rC   start_transfer_opzRemoteMachine.start_transfer_op  s[   ATEZEZ[\,,.
'99"=%)"))"-
h++,
  9922OO--&&"//1 " 2 2 Nu7L7L7N	
	2	$))+(( ,%%d+,  $B%%'MM>>4+;+;BMM+J889P9P9RU_9_`b c !!A%"  $\*,.."..2K]K]:])^$_).0 0 MM(++,}} 	(vvx4??444$T*$Q'' +  	9ww$Q'  Q(Qh7788	 (
  	$ ##	$s2   DH* *L=<JLA#K<<LLLc                    t        j                  d| j                  z         |j                  t        j
                  k(  r|j                  }n| j                  }|r|j                  j                          |st        j                  d       |j                  dk(  r |j                  t        j                         n|j                  t        j                         n|j                  r|j                  j!                          |sct        j                  d       |j                  dk(  r |j                  t        j"                         n|j                  t        j                         |srt%        j&                  |j(                  |t+        j,                               }| j.                  j1                  t%        j2                  ||j                  dk7               y y )Nz(Remote RPC: Calling StopTransfer on '%s'z)Remote: stop transfer initiated by senderr   z+Remote: stop transfer initiated by receiverr   )r   r  )r^   r_   r%   r  r   r  r   r"   file_send_cancellabler   r  r  r	   STOPPED_BY_SENDERr  r  rm   STOPPED_BY_RECEIVERrr   r   r   rt   ru   r8   StopTransferStopInfo)rB   r   r  lost_connectionrI   opinfos         rC   stop_transfer_opzRemoteMachine.stop_transfer_op  sH   @DDYDYZ[<<,>>>99D##D$$((* #IJ<<2%MM("<"<=MM(//2  '')"KL<<2%MM(">">?MM(//2 __--"//1F
 II""8#4#4&XZHZ#[\ rD   c                 b      fd}t        j                  |        j                  ||       y )Nc                     t        j                  j                  j                  |       }|_        j                  |       |j                          y r   )r   r"   r!   r'   dbus_opadd_opprepare_send_info)uri_listr   	dbus_sentrB   s     rC   _send_filesz-RemoteMachine.send_files.<locals>._send_filesF  sI      

!!	B #BJKKO  "rD   )rt   "add_to_recents_if_single_selectionry   )rB   r8  r9  r:  s   ` ` rC   
send_fileszRemoteMachine.send_filesE  s&    		# 	//9k8,rD   c                     t        t        j                  | j                        }||_        t
        j                  |_        | j                  |       | j                  | j                  |       y r   )r   r   r  r"   messager	   r$  r1   r6  ry   do_send_text_message)rB   r>  r   s      rC   send_text_messagezRemoteMachine.send_text_messageT  sN    ,>>@P@PQ
%%	Bd//4rD   c                 J   	 | j                   j                  t        j                  | j                  |j
                  |j                               y # t        $ rG}t        j                  d|z         t        j                  |_        |j                          Y d }~y d }~ww xY w)N)r!   r   r>  zSending message failed: %s)r8   SendTextMessagerr   TextMessager"   r   r>  r   r^   r  r	   r  r1   emit_status_changed)rB   r   r   s      rC   r?  z"RemoteMachine.do_send_text_message[  s{    	%II%%h&:&:AQAQ]_]j]jtvt~t~&  A 	%MM6:; BI""$$	%s   AA 	B"=BB"c                     | j                   vrՉ j                   j                  |       |j                  d j                         |j                  d j                         |j                  d j
                         t        |t              r.|j                  d j                          j                  d|       t        |t        t        f      r j                  d|        fd|j                  dfd	        j                          |j                  t        j                  k(  r|j                          y  j!                  |       y )
Nzstatus-changedz
op-commandfocuszinitial-setup-completer   r   c                      d _         y )NT)r9   r   s   rC   set_busyz&RemoteMachine.add_op.<locals>.set_busyp  s
    DIrD   activec                             S r   r   )r   rH  s    rC   <lambda>z&RemoteMachine.add_op.<locals>.<lambda>s  s	    
 rD   )r.   appendr>   emit_ops_changedop_command_issuedop_focusr   r   notify_remote_machine_of_new_opr   r   r   r1   r	   FAILED_UNRECOVERABLEdecline_transfer_requestcheck_for_autostart)rB   r   rH  s   ` @rC   r6  zRemoteMachine.add_opc  s    T&&&$$R(JJ')>)>?JJ|T%;%;<JJw."f%

3T5Y5YZ		+R0"y-89		+R0	 	

823 99555'')  $rD   c                     |j                   t        j                  k(  r;|j                  t        j
                  k(  r| j                  | j                  |       y y y r   )r1   r	   WAITING_PERMISSIONr  r   r  ry   r   rB   r   s     rC   rP  z-RemoteMachine.notify_remote_machine_of_new_op  sF    99333||0BBBd;;R@ C 4rD   c                    |j                   t        j                  k(  ret        |t              rT|j
                  rG|j                  rt        j                         s&t        j                         s|j                          y y y y y y r   )r1   r	   rU  r   r   
have_spaceexistingr(   prevent_overwritingrequire_permission_for_transferaccept_transferrV  s     rC   rS  z!RemoteMachine.check_for_autostart  si    99333"i(mmKKE$=$=$?88:""$ ; %@  ) 4rD   c                 Z    | j                   j                  |       | j                          y r   )r.   removerM  rV  s     rC   	remove_opzRemoteMachine.remove_op  s"      $rD   c                 &    | j                  d       y )Nr   r   rV  s     rC   rM  zRemoteMachine.emit_ops_changed  s    		- rD   c           	      J   | j                   t        j                  t        j                  fv r| j                  D ]  }|j                   t
        j                  k(  r]t        d      |_        | j                  | j                  |t        |t              d       |j                  t
        j                         }|j                   t
        j                  t
        j                   t
        j"                  fv st        d      |_        |j                  t
        j$                          y y )NzConnection has been lostT)r0  )r1   r   r   rl   r.   r	   r  r   r  ry   r2  r   r   r  r  rU  CALCULATINGPAUSEDrQ  rV  s     rC   r   z#RemoteMachine.cancel_ops_if_offline  s    ;;<//1I1IJJ'' A99 5 55#$%?#@BLMM$"7"7ZF=SeiMjMM(//2YY8#>#>@T@TV^VeVe"ff#$%?#@BLMM("?"?@A KrD   c                    |t         j                  k(  r| j                  | j                  |d       y |t         j                  k(  r| j                  | j
                  |d       y |t         j                  k(  rt        |t              rBt        j                  |_        |j                          | j                  | j                  |       y |j                  t        j                         | j                  | j                   |       y |t         j"                  k(  r| j%                  |       y |t         j&                  k(  r| j                  | j(                  |       y |t         j*                  k(  r| j                  | j                  |d       y |t         j,                  k(  r| j                  | j
                  |d       y y )NT)r  F)r
   CANCEL_PERMISSION_BY_SENDERry   r  STOP_TRANSFER_BY_SENDERr2  RETRY_TRANSFERr   r   r	   r$  r1   rD  r?  r  rU  r   REMOVE_TRANSFERr_  START_TRANSFERr)  CANCEL_PERMISSION_BY_RECEIVERSTOP_TRANSFER_BY_RECEIVER)rB   r   commands      rC   rN  zRemoteMachine.op_command_issued  sJ    i;;;MM$992MN 	999MM$//tMD	000"m,$--	&&(d77<h99:d;;R@	111NN2	000MM$00"5	???MM$992MO	;;;MM$//uME <rD   c                 &    | j                  d       y )Nr   ra  rV  s     rC   rO  zRemoteMachine.op_focus  s    		.!rD   c                 L    | j                   D ]  }|j                  |k(  s|c S  y r   )r.   r   )rB   r   r   s      rC   	lookup_opzRemoteMachine.lookup_op  s(    ## 	B}}	)		rD   r   )F)FF)+__name__
__module____qualname__r   SignalFlagsRUN_LASTobject__gsignals__r   rQ   rJ   rK   r   r?   r   rk   r   r   r   ry   rw   r   rz   r{   misc_idler   r   r  r)  r2  r<  r@  r?  r6  rP  rS  r_  rM  r   rN  rO  rp  r   rD   rC   r   r   $   s   !(!4!4!=!=tR H++44dB?#//88$	J#//88$	J ,,55tR@")"5"5">">b!IL&P#_&BN5`"-)S"c"X42(& 
ZZ) )82{"N$b$]N-5% 
ZZ% %6 
ZZA A
 
ZZ% %  
ZZ! !	A 
ZZF F4 
ZZ" "rD   r   )$timegettextr3   r^   r   gi.repositoryr   r   rc   rr   rh   r   r(   rt   rx  r  r`   opsr   r   r   r   r	   r
   r   r   r   r   VoidTypevoidro   r|   r   r~   r   r   r   rD   rC   <module>r     s         '          0 0 c cOO x    _
GNN _
rD   