/* Ċ Ġ* ĠThis Ġfile Ġis Ġpart Ġof Ġthe Ġflutter _ p 2 p Ġpackage . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 Ġby ĠJul ian ĠF ink ler Ġ< jul ian @ mint ware . de > Ċ Ġ* Ċ Ġ* ĠFor Ġthe Ġfull Ġcopyright Ġand Ġlicense Ġinformation , Ġplease Ġread Ġthe ĠLICENSE Ċ Ġ* Ġfile Ġthat Ġwas Ġdistributed Ġwith Ġthis Ġsource Ġcode . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġde . mint ware . flutter _ p 2 p Ċ Ċ import Ġandroid . Manifest Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġandroid . content . Content Values . TAG Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . net . wifi . p 2 p . Wifi P 2 p Manager Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util . HashMap Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . wifi . p 2 p . Wifi P 2 p Config Ċ import Ġandroidx . annotation . Keep Ċ import Ġde . mint ware . flutter _ p 2 p . utility . Event Channel Pool Ċ import Ġde . mint ware . flutter _ p 2 p . wifi _ direct . Result ActionListener Ċ import Ġde . mint ware . flutter _ p 2 p . wifi _ direct . Socket Pool Ċ import Ġde . mint ware . flutter _ p 2 p . wifi _ direct . WiFi Direct Broadcast Receiver ĊĊ Ċ class ĠFlutter P 2 p Plugin ( private Ġval Ġregist rar : ĠRegist rar Ċ ) Ġ: ĠMethod Call Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġintent Filter Ġ= ĠIntent Filter () ĊĠĠĠ Ġprivate Ġvar Ġreceiver : ĠWiFi Direct Broadcast Receiver ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġevent Pool : ĠEvent Channel Pool Ġ= ĠEvent Channel Pool ( regist rar . messenger ()) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsocket Pool : ĠSocket Pool ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchannel : ĠW ifi P 2 p Manager . Channel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmanager : ĠW ifi P 2 p Manager ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ ENABLE _ LOCATION Ġ= Ġ 6 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ STATE _ CHANGE Ġ= Ġ" bc / state - change " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ PE ERS _ CHANGE Ġ= Ġ" bc / peers - change " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ CON _ CHANGE Ġ= Ġ" bc / connection - change " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ DEVICE _ CHANGE Ġ= Ġ" bc / this - device - change " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ DIS COVERY _ CHANGE Ġ= Ġ" bc / discovery - change " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH _ SOCKET _ READ Ġ= Ġ" socket / read " ĊĠĠĠĠĠĠĠ Ġval Ġconfig : ĠConfig Ġ= ĠConfig () ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( regist rar . messenger (), Ġ" de . mint ware . flutter _ p 2 p / flutter _ p 2 p ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Ġ= ĠFlutter P 2 p Plugin ( regist rar ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplugin . setup Event Pool () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( plugin ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Intent Filters () ĊĠĠĠĠĠĠĠ Ġsetup Wifi P 2 p Manager () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Event Pool () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ STATE _ CHANGE ) ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ PE ERS _ CHANGE ) ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ CON _ CHANGE ) ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ DEVICE _ CHANGE ) ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ SOCKET _ READ ) ĊĠĠĠĠĠĠĠ Ġevent Pool . register ( CH _ DIS COVERY _ CHANGE ) ĊĊĠĠĠĠĠĠĠ Ġsocket Pool Ġ= ĠSocket Pool ( event Pool . get Handler ( CH _ SOCKET _ READ )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Intent Filters () Ġ{ ĊĠĠĠĠĠĠĠ Ġintent Filter . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndicates Ġa Ġchange Ġin Ġthe ĠWi - Fi ĠP 2 P Ġstatus . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Wifi P 2 p Manager . WIFI _ P 2 P _ STATE _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndicates Ġa Ġchange Ġin Ġthe Ġlist Ġof Ġavailable Ġpeers . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Wifi P 2 p Manager . WIFI _ P 2 P _ PE ERS _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndicates Ġthe Ġstate Ġof ĠWi - Fi ĠP 2 P Ġconnectivity Ġhas Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Wifi P 2 p Manager . WIFI _ P 2 P _ CONNECTION _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndicates Ġthis Ġdevice ' base Ġdetails Ġhave Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Wifi P 2 p Manager . WIFI _ P 2 P _ THIS _ DEVICE _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIndicates Ġthe Ġstate Ġof Ġpeer Ġdiscovery Ġhas Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Action ( Wifi P 2 p Manager . WIFI _ P 2 P _ DIS COVERY _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Wifi P 2 p Manager () Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager Ġ= Ġregist rar . context (). getSystem Service ( Context . WIFI _ P 2 P _ SERVICE ) Ġas ĠW ifi P 2 p Manager ĊĠĠĠĠĠĠĠ Ġchannel Ġ= Ġmanager . initialize ( regist rar . context (), ĠL ooper . get Main Looper (), Ġnull ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// region ĠPlatform Ġchannel Ġmethods ĊĊĊĠĠĠ Ġ// region ĠPermissions ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġprivate Ġfun Ġrequest Location Permission ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperm Ġ= ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠ Ġregist rar . activity (). request Permissions ( perm , ĠREQUEST _ ENABLE _ LOCATION ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġprivate Ġfun Ġis Location Permission Granted ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠ Ġresult . success ( PackageManager . PERMISSION _ GRAN TED Ġ== Ġregist rar . context (). check Self Permission ( permission )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠWiFi ĠEvent ĠSubscription ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSubscribe Ġto ĠWiFi ĠEvents ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcall ĠThe ĠMethod Ġcall ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĠThe ĠMethod Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġregister ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreceiver Ġ= ĠWiFi Direct Broadcast Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Pool . get Handler ( CH _ STATE _ CHANGE ). sink , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Pool . get Handler ( CH _ PE ERS _ CHANGE ). sink , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Pool . get Handler ( CH _ CON _ CHANGE ). sink , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Pool . get Handler ( CH _ DEVICE _ CHANGE ). sink , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Pool . get Handler ( CH _ DIS COVERY _ CHANGE ). sink ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġregist rar . context (). register Receiver ( receiver , Ġintent Filter ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUn subscribe Ġfrom ĠWiFi ĠEvents ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcall ĠThe ĠMethod Ġcall ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĠThe ĠMethod Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġunregister ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( receiver Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġregist rar . context (). unregister Receiver ( receiver ) ĊĠĠĠĠĠĠĠ Ġreceiver Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠDis cover ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġdiscover ing ĠWiFi Ġdevices ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcall ĠThe ĠMethod Ġcall ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĠThe ĠMethod Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġdiscover ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . discover Peers ( channel , ĠResult ActionListener ( result )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġdiscover ing ĠWiFi Ġdevices ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcall ĠThe ĠMethod Ġcall ĊĠĠĠĠ Ġ* Ġ@ param Ġresult ĠThe ĠMethod Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġstop Discover ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . stop Peer Discovery ( channel , ĠResult ActionListener ( result )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠConnection ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġconnect ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= ĠProto s . Wifi P 2 p Device . parseFrom ( call . argument < ByteArray >(" payload ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠW ifi P 2 p Config (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Address Ġ= Ġdevice . device Address ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmanager . connect ( channel , Ġconfig , ĠResult ActionListener ( result )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġcancel Connect ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . cancel Connect ( channel , ĠResult ActionListener ( result )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġremove Group ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmanager . request Group Info ( channel ) Ġ{ Ġgroup Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( group Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . remove Group ( channel , ĠResult ActionListener ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// signal Ġsuccess Ġas Ġthe Ġdevice Ġis Ġnot Ġcurrently Ġa Ġmember Ġof Ġa Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠHost ĠAd vertising ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġopen Host Port ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġcall . argument < Int >(" port ") ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error (" Invalid Ġport Ġgiven ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket Pool . open Socket ( port ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġclose Host Port ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġcall . argument < Int >(" port ") ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error (" Invalid Ġport Ġgiven ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket Pool . close Socket ( port ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġaccept Port ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġcall . argument < Int >(" port ") ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error (" Invalid Ġport Ġgiven ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket Pool . accept Client Connection ( port ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠClient ĠConnection ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġconnect To Host ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġcall . argument < String >(" address ") ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġcall . argument < Int >(" port ") ĊĠĠĠĠĠĠĠ Ġval Ġtimeout Ġ= Ġcall . argument < Int >(" timeout ") Ġ?: Ġconfig . timeout ĊĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ== Ġnull Ġ|| Ġaddress Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error (" Invalid Ġaddress Ġor Ġport Ġgiven ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsocket Pool . connect To Host ( address , Ġport , Ġtimeout ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġdisconnect From Host ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġcall . argument < Int >(" port ") ĊĠĠĠĠĠĠĠ Ġif Ġ( port Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error (" Invalid Ġport Ġgiven ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . socket Pool . disconnect From Host ( port ) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠData ĠTransfer ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġsend DataTo Host ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Message Ġ= ĠProto s . Socket Message . parseFrom ( call . argument < ByteArray >(" payload ")) ĊĊĠĠĠĠĠĠĠ Ġthis . socket Pool . send DataTo Host ( socket Message . port , Ġsocket Message . data . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġ@ Suppress (" unused ", Ġ" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġsend DataTo Client ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsocket Message Ġ= ĠProto s . Socket Message . parseFrom ( call . argument < ByteArray >(" payload ")) ĊĊĠĠĠĠĠĠĠ Ġthis . socket Pool . send DataTo Client ( socket Message . port , Ġsocket Message . data . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġresult . success ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġend region ĊĊĠĠĠ Ġ// Ġregion ĠMethod Call Handler ĊĠĠĠ Ġprivate Ġval Ġmethod Map Ġ= ĠHashMap < String , ĠMethod >() ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method Map . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Methods () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġmethod Map [ call . method ] ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġmethod ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Method : Ġ" Ġ+ Ġcall . method ) ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠarrayOf Null s < Any >( 2 ) ĊĠĠĠĠĠĠĠ Ġargs [ 0 ] Ġ= Ġcall ĊĠĠĠĠĠĠĠ Ġargs [ 1 ] Ġ= Ġresult ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod . invoke ( this , Ġ* args ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( call . method , Ġe . message , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Methods () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġthis :: class . java ĊĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġc . declared Methods ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Map [ method . name ] Ġ= Ġmethod ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ } Ċ