
    l
jk~                        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 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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Zd dlmZmZ d dlmZm Z m!Z!m"Z" d dl#Z#d dl#m$Z$m%Z%m&Z&m'Z' ej                  Z( ejR                         Z*dZ+e"jX                  Z- G d	 d
ej\                  ej^                  ej`                        Z1y)    N)futures)GObjectGLib)protobuf)	ReceiveOpTextMessageOp)TransferDirectionOpStatusRemoteStatusRemoteFeatures)ServiceInfoZeroconfServiceBrowser	IPVersionz_warpinator._tcp.local.c                       e Zd Zej                  j
                  deffej                  j
                  def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ej                  j
                  deeeffdZ	 fdZ
d Zd Zd Zd Zej                   d	efd
       Zd dZd Zd Zd Zd Zd Zej0                  d        Zd Zd dZd Zej0                  d        Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z' xZ(S )!ServerN )remote-machine-addedremote-machine-removedremote-machine-ops-changedzlocal-info-changedserver-startedshutdown-completemanual-connect-resultc                 H   t         j                  j                  | d       t        t        |           t
        j                  j                  |        d | _        d | _        || _	        || _
        || _        i | _        i | _        d | _        t        j                         | _        t#        j$                         | _        d | _        d | _        d | _        d | _        d | _        t        j2                         | _        t7        j8                         | _        | j=                          y )Nzserver-thread)name)	threadingThread__init__superr   r   Objectservice_nameservice_identip_infoport	auth_portuntrusted_remote_machinesremote_machinesremote_registrarEventserver_thread_keepalivenetworkmonitorget_network_monitornetmonserverbrowser4browser6zeroconfinfoLockbrowser_mutexr   get_real_namedisplay_namestart)selfr#   r$   r%   	__class__s       !/usr/libexec/warpinator/server.pyr   zServer.__init__9   s    !!$_!=fd$&% !	")+&! $'0'8$$88:	&^^- ..0

    c                    t        j                  dt        j                  dt        j
                  rdnd       g }| j                  j                  %|j                  | j                  j                         | j                  j                  %|j                  | j                  j                         t        |      | _        t        j                         | _        | j                  dt        | _        t!        t        | j                  | j"                  | j                  j%                         t'        j(                         dd	      }| j                  j+                  |       t-        j.                  d
       | j                  j1                  |       t-        j.                  d
       t!        t        | j                  | j"                  | j                  j%                         t'        j(                         t        j2                  t5        t        j6                               dd	      | _        | j                  j+                  | j                         | j                  j                  6t9        | j                  t        | | j                  j                        | _        | j                  j                  6t9        | j                  t        | | j                  j                        | _        y)NzUsing zeroconf version  	(bundled) )
interfaces.flush)hostnametype)r$   	addresses
properties   real)rC   zapi-versionz	auth-portrD   )addrF)loggingr2   r1   __version__configbundle_zeroconfr#   ip4_addressappendip6_addressr   prefsget_connect_idr"   SERVICE_TYPEr!   r   r$   as_binary_listutilget_hostnameregister_servicetimesleepunregister_serviceRPC_API_VERSIONstrget_auth_portr   r/   r0   )r8   ip_addresses	init_infos      r:   start_zeroconfzServer.start_zeroconfW   s	   x7K7K\b\r\r[xzMz{|<<##/ 8 89<<##/ 8 89 L9"113'+'9'9<H   $ 1 1%)YY*.,,*E*E*G9=9J9J9L5<,?	@	 	&&y1

1((3

1 $ 1 1%)YY*.,,*E*E*G9=9J9J9L<B<R<R:=e>Q>Q>S:T5;,>	?	 	&&tyy1<<##/*4==,SWS_S_SkSklDM<<##/*4==,SWS_S_SkSklDMr;   c                      y Nr   )r8   r1   _typer   s       r:   update_servicezServer.update_service   s    r;   c                 H   || j                   k(  ry |j                  dt        z        d   }	 | j                  |   }t        j                  d|j                  |j                  |j                  fz         d|_
        y # t        $ r t        j                  d|z         Y y w xY w)N.%sr   zA>>> Discovery: unknown service ident (%s) reported as gone by zc.z2>>> Discovery: service %s (%s:%d) has disappeared.F)r!   	partitionrS   r'   KeyErrorrJ   debugdisplay_hostnamer#   r$   has_zc_presence)r8   r1   rc   r   identremotes         r:   remove_servicezServer.remove_service   s    4$$$u|34Q7	))%0F
 	J#44fnnfkkRS 	T "'  	MM]`eef	s   A= =!B! B!c                    | j                   5   |j                  ||      }|r|j                  dt        z        d   }	 |j                  d   j                         }t        j                  |j                  t        j                              }|| j                  k(  r
	 d d d        y 	 |j                  d   j                         dk(  r/t        j                  d|||j                   fz         	 d d d        y 	 || j$                  k(  r
	 d d d        y 	 |j                  d	   j                         }t'        |j                  d
   j                               }	| j(                  j+                  |      s&t        j                  d|d|d       	 d d d        y t        j,                  j.                  }
d}	 | j0                  |   }d|_        t        j4                  d|j6                  ||j                   fz         |j8                  t:        j<                  t:        j>                  fvr4tA        j@                         }||jB                  z
  dkD  r| jD                  jG                  ||||j                   |	|      }
|
t        j,                  j.                  k(  s| jH                  jK                         r0t        j"                  d|||j                   |	fz         	 d d d        y |j8                  t:        jL                  k(  r9t        j                  d|j6                  ||j                   fz         	 d d d        y ||_'        ||_        |j                   |_        ||_(        d|_        |
t        j,                  j`                  t        j,                  jb                  fv s<|
t        j,                  jd                  k(  r?|s|j8                  t:        jf                  k(  r |ji                          |jk                          d d d        y # t        $ r  t        j                  d       Y d d d        y w xY w# t        $ r t        j"                  d       Y Pw xY w# t        $ r d}d}	Y w xY w# t        $ rn d}| jS                  |      }t        j4                  d|||j                   fz         tU        jV                  |||||j                   | j$                  |      }tA        j@                         |_!        | jD                  jG                  ||||j                   |	|      }
|
t        j,                  j.                  k(  s| jH                  jK                         r0t        j                  d|||j                   |	fz         Y d d d        y || j0                  |<   |jY                  d| jZ                         |jY                  d| j\                         | j_                  d|       Y ~w xY w# 1 sw Y   y xY w)Nrf   r   s   hostnamezO>>> Discovery: no hostname in service info properties.  Is this an old version?s   typerB   zA>>> Discovery: received flush service info (ignoring): %s (%s:%d)zKNo type in service info properties, assuming this is a real connect attempts   api-versions	   auth-port1z8>>> Discovery: service is not on this subnet, ignoring:  ()FTz*>>> Discovery: existing remote: %s (%s:%d)   znRegister failed, or the server was shutting down during registration, ignoring remote %s (%s:%d) auth port: %dz9>>> Discovery: rejoining existing connect with %s (%s:%d)z%>>> Discovery: new remote: %s (%s:%d)ops-changedremote-status-changedr   )6r4   get_service_inforg   rS   rF   decoderh   rJ   criticalrU   RemoteInterfaceInfoaddresses_by_versionr   Allr#   ri   r$   warningr"   intr-   same_subnetCertProcessingResultFAILUREr'   rk   r2   rj   statusr   INIT_CONNECTINGAWAITING_DUPLEXrX   last_registerr(   registerr*   is_setONLINErC   api_versionensure_unique_hostnamerm   RemoteMachineconnectremote_ops_changedremote_status_changed	idle_emitCERT_INSERTEDCERT_UPDATEDCERT_UP_TO_DATEOFFLINEshutdownstart_remote_thread)r8   r1   rc   r   r2   rl   remote_hostnameremote_ip_infor   r%   cert_resultnewly_discoveredmachinenowrj   s                  r:   add_servicezServer.add_service   s    t	2,8,,UD9Du|';<Q?&*ook&B&I&I&KO
 "&!9!9$:S:ST]TaTa:b!c!T\\1t	2 t	2"sw/668GC&i+:NDII*V'W X-t	2 t	2& D D...7t	2 t	2:""&//."A"H"H"JK #DOOL$A$H$H$J KI {{..~>MMgv  yG  #H  IQt	2 t	2T #77??#( <D"2259G.2G+LL!M'.'?'?QUQZQZ&["\ ] #>>l.J.JLLhLh-ii"iik!6!66;*.*?*?*H*HP_aoquqzqz  }F  HS  +TK*d.G.G.O.OOSWSoSoSvSvSx '  1a3BNTXT]T]_h2i1j !k &Et	2 t	2H  '~~1D1DD '.i/6/G/GY]YbYb.c/d !e &Ot	2 t	2T 0?G,.<GO+/99GL2=G/: +/'4#<#<#J#JDLeLeLrLr"ss$(A(A(Q(QQWgkrkyky  ~J  ~R  ~R  lR$$& //1it	2 t	2   $$%vwt	2 t	2   sOO$qrs   ""%K !I"\   D'+$'+'B'B?'S$LL!H'7&S"T U %2250?0@0>04		040B0B0;=G -1IIKG)"&"7"7"@"@Ygimirirt}  @K  #LK"d&?&?&G&GG4KgKgKnKnKp  'W+:NDIIW`*a'b cGt	2 t	2J 3:D((/OOM43J3JKOO$;T=W=WXNN#97C5D]t	2 t	2s   2W O<AW)AP(8WAQ8WW4D Q!AQ!4&Q!BW<P%W$P%%W(Q
W	Q

WQWQW!DW2W<AWWWWW%hostc                 N   	 |j                  d      sd|z  }t        j                  j                  |      }t	        j
                  |j                         |j                  }t        j                  d|z          t        j                  |      5 }t        j                  |      }	 |j                  d	
       t!        j"                  |      }|j%                  t'        j(                  | j*                  | j,                  j.                  | j0                  t3        j4                         t7        t8        j:                        | j<                  | j,                  j>                        d	
      }| jA                  |d       d d d        y # t        $ r6}t        j                  d|z         | j                  dddd       Y d }~y d }~ww xY w# tB        $ rI}|jE                          t        jF                  d|d|       | j                  dddd       Y d }~d }~ww xY w# 1 sw Y   y xY w)Nzwarpinator://zwarpinator://%sz+User tried to connect to invalid address %sr   TFzInvalid addresszRegistering with    )timeout)
service_idipr$   rC   r   r%   ipv6zCould not register with z, err zCould not connect to remote)$
startswithurllibparseurlparse	ipaddress
ip_addressrC   
ValueErrorrJ   r2   r   netlocgrpcinsecure_channelchannel_ready_futureresultwarp_pb2_grpcWarpRegistrationStubRegisterServicewarp_pb2ServiceRegistrationr"   r#   rN   r$   rU   rV   r}   rL   r[   r%   rP   "handle_manual_service_registration	Exceptioncancelrx   )r8   r   urlechannelfuturestubregs           r:   register_with_hostzServer.register_with_host  s   	???3(4/,,''-C  . zz(4/0""4( 	dG..w7Fda($99'B**8+G+GSWSeSe/3||/G/Gdii595F5F5HVYZ`ZpZpVq6:nn4<<KcKc,e 56	 + 7
 77TB	d 	d  	LLFMNNN2D%ARS	$  d  q!QR6eEbccd	d 	dsI   AF H&CG	G,F>>G	H?HHHHH$c                 @
   d }d }	 t        j                  |j                        }	 t        j                  |j                        }|j
                  | j                  j                         v r)| j                  |j
                     }|j                  t        j                  k(  rCt        j                  d|j                  |j                  fz         | j                  d|dd       y | j                   j#                  |j$                  |j&                  |j                  |j(                  |j                  |j*                        t,        j.                  j0                  k(  s| j2                  j5                         rYt        j                  d|j&                  |j                  |j(                  |j                  fz         | j                  d|dd       y |j&                  |_        t7        |t         j8                        rt;        |      |j                  _        t7        |t         j>                        rt;        |      |j                  _         |j(                  |_        t;        |j*                        |_        |jC                          |jE                          nVt        j                  d       | jG                  |j&                        }t-        jH                  g       }t7        |t         j8                        rt;        |      |_        t7        |t         j>                        rt;        |      |_         tK        jL                  |j
                  |j&                  |||j(                  | jN                  t;        |j*                              }| j                   j#                  |j$                  |j&                  |j                  |j(                  |j                  |j*                        t,        j.                  j0                  k(  s| j2                  j5                         rct        j                  d|j&                  |j                  j<                  |j(                  |j                  fz         | j                  d|dd       y || j                  |j$                  <   |jQ                  d	| jR                         |jQ                  d
| jT                         | j                  d|       |jE                          | j                  d|dd       y # t        $ r Y w xY w# t        $ r Y w xY w)Nz Host %s:%d was already connectedr   TzAlready connectedzIRegistration of static machine failed, ignoring remote %s (%s:%d) auth %dFzAuthentication failedz-Adding new static machine (manual connection)rt   ru   r   	Connected)+r   r   r   r   r   r   r'   keysr   r   r   rJ   ri   r#   r%   r   r(   r   rl   rC   r$   r   rU   r   r   r*   r   
isinstanceIPv4Addressr\   rN   IPv6AddressrP   r   r   r   ry   rm   r   r"   r   r   r   )r8   r   initiated_hereip4_addrip6_addrr   rj   r#   s           r:   r   z)Server.handle_manual_service_registration6  s   	 ++CFF3H	 ++CHH5H >>T116688**3>>:G~~!4!44@GOOUXUbUbCccd6Nab$$--gmmW=M=Mw`g`l`lnqn{n{  ~E  ~Q  ~Q  R  VZ  Vo  Vo  Vw  Vw  w  {  {W  {W  {^  {^  {`impmymy  |C  |K  |K  MP  MU  MU  WZ  Wd  Wd  me  e  f6Ofg"||G(I$9$9:.1(m+(I$9$9:.1(m+88GL"%coo"6G'')MMIJ#::3<<H..r2G(I$9$9:&)(m#(I$9$9:&)(m#**3>>3<<IY[bdgdldlnr  oA  oA  CF  GJ  GV  GV  CW  XG$$--gmmW=M=Mw`g`l`lnqn{n{  ~E  ~Q  ~Q  R  VZ  Vo  Vo  Vw  Vw  w  {  {W  {W  {^  {^  {`i'.'7'79T9TV]VbVbdgdqdq&rs t6Ofg29D  /OOM4+B+BCOO3T5O5OPNN17;'').kR]  		  		s"   T  T  	TT	TTc                     |}d}	 d}| j                   j                         D ]+  }| j                   |   }|j                  |k(  s"d||fz  }d} n |dz  }|s	 |S U)N   TFz%s[%d])r'   r   rj   )r8   rC   rj   ifoundkeyremote_machines          r:   r   zServer.ensure_unique_hostnamek  s    #E++002 !%!5!5c!:!226FF'/8Q-'?$ E FA r;   c                 
   t        j                  dt        j                  dt        j
                  rdnd       t        j                  dt        j                  dt        j
                  rdnd       t        j                  d| j                  d| j                  j                  d       t        j                  d	t        j                  z         t        j                  d
t        j                         z         t        j                  | j                  | j                  | j                         | _        | j$                  | j"                  j&                  _        t+        j,                          d}t        j.                  t1        j2                  t        j4                               |t7        j8                         g      | _        t;        j<                  | | j.                         t?        j@                         jC                         }t        jD                  |f      }| j                  jF                  r?| j.                  jI                  d| j                  jF                  | j                  fz  |       | j                  jJ                  r?| j.                  jI                  d| j                  jJ                  | j                  fz  |       | j.                  jM                          | jN                  jQ                          	 | jS                          | j[                  d       t        j                  d       | jN                  j]                         s6| jN                  j_                  d       | jN                  j]                         s6| j"                  ja                          d | _        t        j                  d       	 | jb                  je                          tg        | jh                  jk                               }|D ]h  }| j[                  d|       t        j                  d|jl                  |j                  jF                  |j                  fz          |jn                          j d }t        j                  d       | j.                  jq                  d      j_                          | j[                  d       d | _        t*        jr                  jo                  d       t        j                  d       y # tT        $ r=}t        jV                  d|z         | jN                  jY                          Y d }~'d }~ww xY w#  t        jV                  d       Y xY w)NzUsing grpc version r=   r>   r?   zUsing protobuf version zServer: starting server on rq   rr   zUsing api version %szOur uuid: %s))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   )max_workers)optionsinterceptorsz%s:%dz[%s]:%dz3Zeroconf failed to start, server will terminate: %sr   zServer: ACTIVE
   z,Server: stopping discovery and advertisementz/Can't close Zeroconf - maybe it failed to startr   z7Server: Closing connection to remote machine %s (%s:%d)zServer: terminating server   )gracer   T)waitzServer: server stopped):rJ   r2   r   rK   rL   bundle_grpcr   ri   r#   ifacer[   rQ   rR   remote_registration	Registrarr$   r%   r(   r   reg_server_v2service_registration_handlerrU   initialize_rpc_threadpoolr.   r   ThreadPoolExecutorget_server_pool_max_threadsr   ChunkCompressorr   add_WarpServicer_to_serverauthget_singletonget_server_credsssl_server_credentialsrN   add_secure_portrP   r7   r*   clearr`   r   rx   setr   r   r   shutdown_registration_serversr1   closelistr'   valuesrj   r   stopglobal_rpc_threadpool)r8   r   pairserver_credentialsr   r'   rm   s          r:   runz
Server.run  s   43C3CTZTfTf[lnEnopx7K7K\b\n\n[tvMvwxdllDLLL^L^_`+f.D.DDE^e&:&:&<<= !4 = =dllDIIW[WeWe fKOKrKr++H&&(
 kk'"<"<IjIjIl"m*10<0L0L0N/OQ 	00t{{C!!#446!88$A<<##KK''4<<3K3KTYY2W(W(:<<<##KK''	T\\5M5Mtyy4Y(Y(:<$$**,	/!
 	'(%& ..557((--b1 ..557 	;;= $DE	MM!
 t33::<=% 	FNN3V<MMS!'!8!8&..:T:TV\VaVa bc d FOO	 23q!&&(*+""+++6./W  	/RUVVW((,,..	/,	NOs$   S9  U 9	T?2T::T?Uc                 8    | j                   j                          y rb   )r*   r   r8   s    r:   r   zServer.shutdown  s    $$((*r;   c                 d    |j                   t        j                  k(  r| j                  d|       y y )Nr   )r   r   r   emit)r8   rm   s     r:   r   zServer.remote_status_changed  s(    ==L000II.7 1r;   c                 T    | j                   |j                     j                  |       y rb   )r'   senderadd_op)r8   ops     r:    add_receive_op_to_remote_machinez'Server.add_receive_op_to_remote_machine  s    RYY'..r2r;   c                 <    | j                  d|j                         y )Nr   )r   rl   )r8   r   s     r:   r   zServer.remote_ops_changed  s    		.0D0DEr;   c                 6    | j                   j                         S rb   )r'   r   r   s    r:   list_remote_machineszServer.list_remote_machines  s    ##**,,r;   c                    d}| j                   j                         D ]g  }|j                  t        j                  k7  r!|j
                  D ]8  }|rt        |t              s|j                  t        j                  k(  s4|dz  }: i |S )Nr   r   )
r'   r   r   r   r   transfer_opsr   r   r
   TRANSFERRING)r8   incoming_onlycountr   r   s        r:   get_active_op_countzServer.get_active_op_count  s    ++224 	G~~!4!44**  B	)B99 5 55QJE		 r;   c                     | j                   j                         D ]_  }|j                  t        j                  k7  r!|j
                  D ]0  }|j                  t        j                  k(  s!|j                          2 a y rb   )	r'   r   r   r   r   r   r
   r   stop_transfer)r8   r   r   s      r:   cancel_all_opszServer.cancel_all_ops  sh    ++224 	'G~~!4!44** '99 5 55$$&'	'r;   c                 *     | j                   |g|  y rb   )r   )r8   signalcallback_datas      r:   r   zServer.idle_emit  s    		&)=)r;   c                     t        j                  d|j                  z         	 | j                  |j                     }t        S # t
        $ r$}t        j                  d       Y d }~t        S d }~ww xY w)NzServer Ping: from %szBServer Ping: ping is from unknown remote (or not fully online yet))rJ   ri   readable_namer'   idrh   void)r8   requestcontextrm   r   s        r:   PingzServer.Ping   sd    ,w/D/DDE	`))'**5F   	`MM^__	`s   A 	A0A++A0c                     t        j                  d|j                  z         d}	 | j                  |j                     }|j
                  t        j                  t        j                  fv }t        j                  |      S # t        $ r Y !w xY w)Nz+Server RPC: CheckDuplexConnection from '%s'Fresponse)rJ   ri   r  r'   r  r   r   r   r   rh   r   
HaveDuplex)r8   r  r  r  rm   s        r:   CheckDuplexConnectionzServer.CheckDuplexConnection
  s~    CgF[F[[\	))'**5F,*F*FH[H[)\\H ""H55  		s   AB 	BBc                    t        j                  d|j                  z         d}d}||k  rd}	 | j                  |j                     }|j
                  t        j                  t        j                  fv }|rnQ|dz  }||k(  r,|j                  t        j                  j                  d       y t        j                  d       ||k  rt!        j"                  	      S # t        $ r Y uw xY w)
Nz/Server RPC: WaitingForDuplex from '%s' (api v2)   r   Fr   zSServer timed out while waiting for his corresponding remote to connect back to you.codedetailsg      ?r  )rJ   ri   r  r'   r  r   r   r   r   rh   abortr   
StatusCodeDEADLINE_EXCEEDEDrX   rY   r   r  )r8   r  r  	max_triesr   r  rm   s          r:   WaitingForDuplexzServer.WaitingForDuplex  s    G'J_J__`	 )mH--gjj9"MMl.J.JLL_L_-`` Q	>MMt'H'H* " A

3# )m& ""H55  s   AC 	C*)C*c                     t        j                  d|j                  z         t        j                  t        j                         t        j                         t              S )Nz*Server RPC: GetRemoteMachineInfo from '%s')r6   	user_namefeature_flags)	rJ   ri   r  r   RemoteMachineInfor   r5   get_user_nameSERVER_FEATURES)r8   r  r  s      r:   GetRemoteMachineInfozServer.GetRemoteMachineInfo2  sI    BWEZEZZ[))t7I7I7K484F4F4H8GI 	Ir;   c                 j   t        j                  d|j                  z         t        j                  j                  t        j                         d      }t        j                  j                  |      rt        j                  |      S |j                  t        j                  j                  d       y )Nz,Server RPC: GetRemoteMachineAvatar from '%s'z.facez.face file not found!r  )rJ   ri   r  ospathjoinr   get_home_direxists	transfersload_file_in_chunksr  r   r  	NOT_FOUND)r8   r  r  r)  s       r:   GetRemoteMachineAvatarzServer.GetRemoteMachineAvatar9  ss    DwG\G\\]ww||D--/977>>$0066MMt88BYMZr;   c                    t        j                  d|j                  j                  z         	 | j                  |j                  j
                     }|j                  D ]y  }|j                  |j                  j                  k(  s'	 |j                  j                  |_        |j                  t        j                         | j!                  |       t"        c S  t%        |j                  j
                        }|j                  j                  |_	        |j&                  |_        |j(                  |_        |j*                  |_        t        j                  |_        |j.                  |_        |j2                  x|_        |_        |j8                  |_        |j:                  |_        |j<                  |_        	 |j                  j                  |_        |j?                  d| j                          |jA                          t"        S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w# t        $ r d|_        Y w xY w# t        $ r
 d|_        Y w xY w)Nz.Server RPC: ProcessTransferOpRequest from '%s'z3Received transfer op request for unknown remote: %sFzinitial-setup-complete)!rJ   ri   r2   r  r'   rl   rh   r|   r   
start_time	timestampuse_compressionAttributeError
set_statusr
   WAITING_PERMISSIONr   r  r   sender_namereceiverreceiver_namer   size
total_sizer  total_countremaining_countmime_if_singlename_if_singletop_dir_basenamesr   prepare_receive_info)r8   r  r  r   r   existing_opr   s          r:   ProcessTransferOpRequestzServer.ProcessTransferOpRequestB  s   FIcIccd	!11',,2D2DEN
 *66 		K%%)?)??829,,2N2NK/ &&x'B'BC55kB		 w||))*.. ,,&&"00//	.5mm;+#22#22&88	'!(!=!=B 	

+T-R-RS
!O  	OOQTUUV	 & 827K/80  	'!&B	's;   #H H38I
 	H0H++H03II
IIc                    t        j                  d|j                  z         	 | j                  |j                     j                  |j                        }|j                  t        j                  k(  r%|j                  t        j                         t         S |j                  t        j                         t         S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz-Server RPC: CancelTransferOpRequest from '%s'z6Received cancel transfer op request for unknown op: %s)rJ   ri   r  r'   rl   	lookup_opr3  rh   r|   	directionr	   TO_REMOTE_MACHINEr6  r
    CANCELLED_PERMISSION_BY_RECEIVERCANCELLED_PERMISSION_BY_SENDERr  r8   r  r  r   r   s        r:   CancelTransferOpRequestzServer.CancelTransferOpRequestp  s    EH]H]]^	%%gmm4>>w?P?PQB <<,>>>MM(CCD  MM(AAB  	OOTWXXY	s   2B= =	C(C##C(c                   	 t        j                  d|j                  z         t        j                         		 | j
                  |j                     }	 | j
                  |j                     j                  |j                        t        j                         }|_        j                  t        j                          t#        j$                        _        d _        t#        j*                  |j                  |      	fd}|j-                  |       j/                         S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w# t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz#Server RPC: StartTransfer from '%s'z1Server: start transfer is from unknown remote: %sz*Server: start transfer for unknowns op: %sc                     j                   ; j                  j                           j                  t        j                         y  j
                  j                         rt        j                  d       y t        j                  d j                  dt        j                   j                        dt        j                  t        j                         z
               y )NzServer: file send cancelledzServer: transfer of z files (z) finished in )error	set_errorr6  r
   FAILED_UNRECOVERABLEfile_send_cancellabler   rJ   ri   r=  r   format_sizer<  rU   precise_format_time_spanget_monotonic_time)r   r   r2  s   r:   transfer_donez+Server.StartTransfer.<locals>.transfer_done  s    ||'V\\*h;;<))002;<^^T%5%5bmm%D2243J3J3Lz3YZ\ ]r;   )rJ   ri   r  r   rU  r'   rl   rh   r|   rF  r3  r   r)   rR  r6  r
   r   r-  OpProgressTrackerprogress_trackercurrent_progress_report
FileSenderadd_callbackread_chunks)
r8   r  r  rm   r   cancellablerV  r   r   r2  s
          @@@r:   StartTransferzServer.StartTransfer  s<   ;g>S>SST,,.
	))'--8F
	%%gmm4>>w?P?PQB
  oo'#. 
h++,'99"=%)"%%b'*;*;[I		] 	]+!!##?  	OOORSST	  	OOH1LM	s/   D+ 2E +	E4EE	F"E??Fc                 B   t        j                  d|j                  j                  z         	 | j                  |j                  j
                     j                  |j                  j                        }|j                  rt        d      |_        |j                  t        j                  k(  r|j                   |j                   j#                          t        j                  d|j                  z         |j                  dk(  r%|j%                  t&        j(                         t4        S |j%                  t&        j*                         t4        S 	 |j,                  j/                          t        j                  d|j                  z         |j                  dk(  r%|j%                  t&        j2                         t4        S |j%                  t&        j*                         t4        S # t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w# t0        $ r Y w xY w)Nz"Server RPC: StopTransfer from '%s'z,Server: stop transfer was for unknown op: %sz'An error occurred on the remote machinez5Server: sender received stop transfer by receiver: %sr?   z5Server: receiver received stop transfer by sender: %s)rJ   ri   r2   r  r'   rl   rF  r3  rh   r|   rO  _	error_msgrG  r	   rH  rR  r   r6  r
   STOPPED_BY_RECEIVERFAILEDfile_iteratorr   r5  STOPPED_BY_SENDERr  rK  s        r:   StopTransferzServer.StopTransfer  s   :W\\=W=WWX	%%gll&8&89CCGLLDZDZ[B ==FGBL<<,>>>''3((,,.MMQTVT`T``a||r!h::;   hoo.   '')
 MMQTVT`T``a||r!h889  hoo.?  	OOJQNO	* "  s*   AG$ H $	H-H

H	HHc                    t        j                  d|j                  z         	 | j                  |j                     }t        t        j                  |j                        }|j                  |_
        |j                  |_        t        j                  |_        |j                  |       |j!                          t"        S # t        $ r"}t        j
                  d|z         Y d }~y d }~ww xY w)Nz%Server RPC: SendTextMessage from '%s'z-Received text message from unknown remote: %s)rJ   ri   rl   r'   rh   r|   r   r	   FROM_REMOTE_MACHINEr6   r8  messager
   FINISHEDr   r   send_notificationr  )r8   r  r  r   r   r   s         r:   SendTextMessagezServer.SendTextMessage  s    =MN	262F2Fw}}2UN
 ,@@'--P'44__
%%	b!
  	OOKaOP	s   B? ?	C*C%%C*)F))__name__
__module____qualname__r   SignalFlagsRUN_LASTobjectr\   bool__gsignals__r   r`   rd   rn   r   misc_asyncr   r   r   r   r   r   r   _idler   r   r  r  r   r  r  r  r&  r0  rD  rL  r^  rf  rl  __classcell__)r9   s   @r:   r   r   /   s   !(!4!4!=!=tfY O#*#6#6#?#?y"Q'.':':'C'CTC6&R&22;;TC6J"..77rB%11::D"E")"5"5">">tTSVFW!XL<0f'$u2n 
[[dc d d<3Sj (T0l+83 
ZZF F-' 
ZZ* *
668I[,\&&$P$Lr;   r   )2r(  r   gettextrJ   rX   re
concurrentr   r   r   gi.repositoryr   r   r   r   r   googler   rL   r   r   r+   rm   r   rQ   rU   ru  r-  opsr   r   r	   r
   r   r   r1   r   r   r   r   r`  VoidTyper  rS   TEXT_MESSAGESr%  r   WarpServicerr    r   r   r;   r:   <module>r     s    
     	     '               ( J J  E EOOx( ..q
Y}997>> q
r;   