package Ġio . ktor . network . sockets Ċ Ċ import Ġio . ktor . network . selector .* Ċ import Ġio . ktor . network . util .* Ċ import Ġkotlinx . coroutines . experimental .* Ċ import Ġkotlinx . coroutines . experimental . io .* Ċ import Ġkotlinx . coroutines . experimental . io . Byte Channel Ċ import Ġkotlinx . io . pool .* Ċ import Ġjava . nio . channels .* Ċ Ċ internal Ġfun Ġattach For Writing Impl ( ĊĠĠĠĠĠĠĠ Ġchannel : ĠByte Channel , ĊĠĠĠĠĠĠĠ Ġn io Channel : ĠWrit able Byte Channel , ĊĠĠĠĠĠĠĠ Ġselect able : ĠSelect able , ĊĠĠĠĠĠĠĠ Ġselector : ĠSelector Manager , ĊĠĠĠĠĠĠĠ Ġpool : ĠObject Pool < ByteBuffer >, ĊĠĠĠĠĠĠĠ Ġparent : ĠJob Ċ ): ĠReader Job Ġ{ ĊĠĠĠ Ġval Ġbuffer Ġ= Ġpool . borrow () ĊĊĠĠĠ Ġreturn Ġreader ( io Coroutine Dispatcher , Ġchannel , Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channel . read Available ( buffer ) Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . flip () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( buffer . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġn io Channel . write ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rc Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able . interest Op ( Select Interest . WRITE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector . select ( selectable , ĠSelect Interest . WRITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able . interest Op ( Select Interest . WRITE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . recycle ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nio Channel Ġis ĠSocket Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn io Channel . shutdown Output () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġattach For Writing Direct Impl ( ĊĠĠĠĠĠĠĠ Ġchannel : ĠByte Channel , ĊĠĠĠĠĠĠĠ Ġn io Channel : ĠWrit able Byte Channel , ĊĠĠĠĠĠĠĠ Ġselect able : ĠSelect able , ĊĠĠĠĠĠĠĠ Ġselector : ĠSelector Manager , ĊĠĠĠĠĠĠĠ Ġparent : ĠJob Ċ ): ĠReader Job Ġ{ ĊĠĠĠ Ġreturn Ġreader ( io Coroutine Dispatcher , Ġchannel , Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselect able . interest Op ( Select Interest . WRITE , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . look A head Suspend Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġrequest ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( channel . is Closed For Read ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! await At Least ( 1 )) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( buffer . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġn io Channel . write ( buffer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able . interest Op ( Select Interest . WRITE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector . select ( selectable , ĠSelect Interest . WRITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsumed ( r ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect able . interest Op ( Select Interest . WRITE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nio Channel Ġis ĠSocket Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn io Channel . shutdown Output () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠClosed Channel Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }