package Ġnz . sc ut tle but t . t rem ola . ss b . pe ering Ċ Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġcom . got erl . l az ys odium . interfaces . Sign Ċ import Ġnz . sc ut tle but t . t rem ola . ss b . T rem ola State Ċ import Ġnz . sc ut tle but t . t rem ola . ss b . core . SS Bid Ċ import Ġnz . sc ut tle but t . t rem ola . ss b . db . entities . Contact Ċ import Ġnz . sc ut tle but t . t rem ola . ss b . db . entities . Pub Ċ import Ġnz . sc ut tle but t . t rem ola . ss b . pe ering . box stream . SH S Client Ċ import Ġnz . sc ut tle but t . t rem ola . utils . Constants Ċ import Ġjava . net . Socket Ċ Ċ /** Ċ Ġ* ĠInit iate Ġa Ġconnection Ġ( handshake ) Ġwith Ġa Ġpeer Ċ Ġ* ĠOnly Ġcalled Ġfor Ġa Ġpeer Ġonce . ĠR CP Responder Ġwill Ġbe Ġcalled Ġfor Ġthe Ġnext Ġconnections Ċ Ġ*/ Ċ class ĠRpc Init iator ( ĊĠĠĠ Ġval Ġt rem ola State : ĠT rem ola State , ĊĠĠĠ Ġval Ġremote Key : ĠByteArray , ĊĠĠĠ Ġval Ġnetwork Identifier : ĠByteArray Ġ= ĠConstants . SS B _ NETWORK IDENTIFIER Ċ ) Ġ: ĠRpc Loop () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpeer F id Ġ= Ġ"@ " Ġ+ ĠBase 6 4 . encode ToString ( remote Key , ĠBase 6 4 . NO _ WRAP ) Ġ+ Ġ". ed 2 5 5 1 9 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Pe ering ( host : ĠString , Ġport : ĠInt , Ġseed : ĠByteArray ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( socket Ġ!= Ġnull Ġ&& Ġsocket !!. isConnected Ġ&& Ġsh s Ġ!= Ġnull Ġ&& Ġsh s !!. completed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( seed Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh s Ġ= ĠSH S Client ( t rem ola State . id Store . identity , Ġremote Key , Ġnetwork Identifier ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" seed Ġlen Ġshould Ġbe ", Ġ"${ Sign . ED 2 5 5 1 9 _ SECRET KEY BYTES }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" seed Ġlen Ġis ", Ġ"${ seed . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsh s Ġ= ĠSH S Client ( SS Bid ( seed ), Ġremote Key , Ġnetwork Identifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhave Ġa Ġseparate Ġwriter Ġthread : Ġwr Exec . execute Ġ{} Ġ? ĊĠĠĠĠĠĠĠ ĠLog . d (" init iate Ġsocket ", Ġ"${ host }:${ port }") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSocket ( host , Ġport ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout str Ġ= Ġthis . get OutputStream () Ġ// Ġsource Ġ= Ġsource (). buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstr Ġ= Ġthis . getInputStream () Ġ// Ġsink Ġ= Ġsink (). buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbox Stream Ġ= Ġ( sh s !! Ġas ĠSH S Client ). perform Handshake ( instr !! , Ġout str !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" init iate Pe ering ", Ġ" work ed Ġfor Ġ${ peer F id }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Mark Ġ= Ġ" net :${ socket !!. remote SocketAddress . toString (). substring ( 1 )} ~ sh s :" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpeer Mark Ġ+= Ġpeer F id !!. substring ( 1 , Ġpeer F id !!. length Ġ- Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" init iate Pe ering ", Ġ" failed Ġfor Ġ${ peer F id }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpeer Mark Ref Ġ= Ġpeer Mark ĊĠĠĠĠĠĠĠ Ġt rem ola State . w ai . eval (" b 2 f _ local _ peer (' ${ peer Mark Ref }', Ġ' connected ') ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( seed Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen E BT stream () Ġ// Ġonly Ġinit iator Ġla unches Ġthe Ġdup lex Ġstream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġt rem ola State . contact DAO . getAll ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Ġ= Ġt rem ola State . log DAO . get Most Recent Event From Log Id ( c . lid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Service ?. send E BT note ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Service !!. eb t Rpc Nr , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . lid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( latest Ġ== Ġnull ) Ġ 0 Ġelse Ġlatest . ls q ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsend W ants Request () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrx _ loop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Invite ( t rem ola State . id Store . identity . to Ref ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrpc Service !!. end Stream ( my Request Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġeverything Ġcame Ġso Ġfar Ġwe Ġassume Ġthat Ġthe Ġpub Ġre dee med Ġthe Ġinvite Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt rem ola State . contact DAO . insert Contact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpeer F id !! , Ġnull , Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġ 0 , Ġ 0 , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt rem ola State . pub DAO . insert ( Pub ( peer F id !! , Ġhost , Ġport )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Init iator ", Ġ" ended ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Init iator ", Ġ" problem Ġwith Ġ${ e }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt rem ola State . w ai . eval (" b 2 f _ local _ peer ('" Ġ+ Ġpeer Mark Ref Ġ+ Ġ"', Ġ' disconnected ') ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ