/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠAnt on ĠMal in sk iy Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . mal in sk iy . adam . server Ċ Ċ import Ġcom . mal in sk iy . adam . Android Debug Bridge Client Ċ import Ġcom . mal in sk iy . adam . Android Debug Bridge Client Factory Ċ import Ġio . ktor . network . selector . Actor Selector Manager Ċ import Ġio . ktor . network . sockets . a Socket Ċ import Ġio . ktor . network . sockets . open Read Channel Ċ import Ġio . ktor . network . sockets . open Write Channel Ċ import Ġio . ktor . util . network . port Ċ import Ġio . ktor . utils . io . Byte Read Channel Ċ import Ġio . ktor . utils . io . Byte Write Channel Ċ import Ġio . ktor . utils . io . close Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . io . Closeable Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ class ĠEm ulator Console Server Ġ: ĠCor outine Scope , ĠClose able Ġ{ ĊĠĠĠ Ġprivate Ġval Ġexecution Dispatcher Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Fixed ThreadPool Context ( 4 , Ġ" Em ulator Console Server ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġcoroutine Context : ĠCor outine Context ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexecution Dispatcher ĊĊĠĠĠ Ġprivate Ġval Ġjob Ġ= ĠSuper visor Job () ĊĠĠĠ Ġvar Ġport : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġsuspend Ġfun Ġstart And Listen ( block : Ġsuspend Ġ( Console Read Channel , ĠConsole Write Channel ) Ġ-> ĠUnit ): ĠPair < Android Debug Bridge Client , ĠInet SocketAddress > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet SocketAddress (" 1 2 7 . 0 . 0 . 1 ", Ġport ) ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġa Socket ( Actor Selector Manager ( Dispatch ers . IO )). tcp (). bind ( address ) ĊĠĠĠĠĠĠĠ Ġport Ġ= Ġserver . local Address . port ĊĊĠĠĠĠĠĠĠ Ġasync ( context Ġ= Ġjob ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsocket Ġ= Ġserver . accept () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġsocket . open Read Channel (). to Server Read Channel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġsocket . open Write Channel ( auto Flush Ġ= Ġtrue ). to Server Write Channel () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock ( input , Ġoutput ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( Android Debug Bridge Client Factory (). build (), ĠInet SocketAddress ( address . address , Ġport )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġjob . cancel And Join () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠByte Read Channel . to Server Read Channel () Ġ= ĠConsole Read Channel ( this ) Ċ private Ġfun ĠByte Write Channel . to Server Write Channel () Ġ= ĠConsole Write Channel ( this ) Ċ