/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 1 9 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . network . sockets Ċ Ċ import Ġio . ktor . network . selector .* Ċ import Ġio . ktor . network . sockets . Socket Impl Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . net .* Ċ import Ġjava . nio . channels .* Ċ Ċ @ Suppress (" Blocking Method In Non Blocking Context ") Ċ internal Ġclass ĠServer Socket Impl ( ĊĠĠĠ Ġoverride Ġval Ġchannel : ĠServer SocketChannel , ĊĠĠĠ Ġval Ġselector : ĠSelector Manager Ċ ) Ġ: ĠServer Socket , ĠSelect able Ġby ĠSelect able Base ( channel ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire (! channel . is Blocking ) Ġ{ Ġ" Channel Ġneed Ġto Ġbe Ġconfigured Ġas Ġnon - blocking ." Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġsocket Context : ĠComp letable Job Ġ= ĠJob () ĊĊĠĠĠ Ġoverride Ġval Ġlocal Address : ĠSocket Address ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġchannel . local Address . to SocketAddress () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġaccept (): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel . accept ()?. let Ġ{ Ġreturn Ġaccepted ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġaccept Suspend () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġaccept Suspend (): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterest Op ( Select Interest . ACCEPT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselector . select ( this , ĠSelect Interest . ACCEPT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . accept ()?. let Ġ{ Ġreturn Ġaccepted ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaccepted ( nio Channel : ĠSocket Channel ): ĠSocket Ġ{ ĊĠĠĠĠĠĠĠ Ġinterest Op ( Select Interest . ACCEPT , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġn io Channel . configure Blocking ( false ) ĊĠĠĠĠĠĠĠ Ġif Ġ( local Address Ġis ĠInet SocketAddress ) Ġn io Channel . set Option ( Standard Socket Options . TCP _ NODE LAY , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSocket Impl ( nio Channel , Ġselector ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector . notify Closed ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Context . complete () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Context . complete Exception ally ( cause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . dispose () ĊĠĠĠ Ġ} Ċ } Ċ