/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠB rian ĠNorm an Ċ Ġ* Ċ Ġ* Ġ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 Ġok io x . coroutines Ċ Ċ import Ġok io . Buffer Ċ import Ġok io . ByteString Ċ import Ġok io . EOF Exception Ċ import Ġok io x . coroutines . internal . SEGMENT _ SIZE Ċ Ċ internal Ġclass ĠReal Buffered Async Sink ( ĊĠ Ġprivate Ġval Ġsink : ĠAsync Sink Ċ ) Ġ: ĠBuffered Async Sink Ġ{ ĊĠ Ġprivate Ġvar Ġclosed : ĠBoolean Ġ= Ġfalse ĊĠ Ġoverride Ġval Ġbuffer Ġ= ĠBuffer () ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite ( source : ĠBuffer , Ġbyte Count : ĠLong ) Ġ{ ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write ( source , Ġbyte Count ) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite ( byte String : ĠByte String ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write ( byte String ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Utf 8 ( string : ĠString , Ġbegin Index : ĠInt , Ġend Index : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Utf 8 ( string , Ġbegin Index , Ġend Index ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Utf 8 Code Point ( code Point : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Utf 8 Code Point ( code Point ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite ( source : ĠByteArray , Ġoffset : ĠInt , Ġbyte Count : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write ( source , Ġoffset , Ġbyte Count ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite All ( source : ĠAsync Source ): ĠLong Ġ{ ĊĠĠĠ Ġcheck (! closed ) Ġ{ Ġ" closed " Ġ} ĊĠĠĠ Ġvar Ġtotal Bytes Read Ġ= Ġ 0 L ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠ Ġval Ġread Count : ĠLong Ġ= Ġsource . read ( buffer , ĠSEG MENT _ SIZE ) ĊĠĠĠĠĠ Ġif Ġ( read Count Ġ== Ġ- 1 L ) Ġbreak ĊĠĠĠĠĠ Ġtotal Bytes Read Ġ+= Ġread Count ĊĠĠĠĠĠ Ġemit Complete Segments () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtotal Bytes Read ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite ( source : ĠAsync Source , Ġbyte Count : ĠLong ): ĠBuffered Async Sink Ġ{ ĊĠĠĠ Ġcheck (! closed ) Ġ{ Ġ" closed " Ġ} ĊĠĠĠ Ġvar Ġremaining Ġ= Ġbyte Count ĊĠĠĠ Ġwhile Ġ( remaining Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠ Ġval Ġread Ġ= Ġsource . read ( buffer , Ġremaining ) ĊĠĠĠĠĠ Ġif Ġ( read Ġ== Ġ- 1 L ) Ġthrow ĠEOF Exception () ĊĠĠĠĠĠ Ġremaining Ġ-= Ġread ĊĠĠĠĠĠ Ġemit Complete Segments () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Byte ( b : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Byte ( b ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Short ( s : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Short ( s ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Short Le ( s : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Short Le ( s ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Int ( i : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . writeInt ( i ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Int Le ( i : ĠInt ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . writeInt Le ( i ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Long ( v : ĠLong ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Long ( v ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Long Le ( v : ĠLong ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Long Le ( v ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Decimal Long ( v : ĠLong ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Decimal Long ( v ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġwrite Hex adecimal Unsigned Long ( v : ĠLong ): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{ Ġbuffer . write Hex adecimal Unsigned Long ( v ) Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġemit Complete Segments (): ĠBuffered Async Sink Ġ= ĊĠĠĠ Ġemit Complete Segments Ġ{} ĊĊĠ Ġprivate Ġsuspend Ġinline Ġfun Ġemit Complete Segments ( block : Ġ() Ġ-> ĠUnit ): ĠBuffered Async Sink Ġ{ ĊĠĠĠ Ġcheck (! closed ) Ġ{ Ġ" closed " Ġ} ĊĠĠĠ Ġblock () ĊĠĠĠ Ġval Ġbyte Count Ġ= Ġbuffer . complete Segment Byte Count () ĊĠĠĠ Ġif Ġ( byte Count Ġ> Ġ 0 L ) Ġsink . write ( buffer , Ġbyte Count ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġemit (): ĠBuffered Async Sink Ġ{ ĊĠĠĠ Ġcheck (! closed ) Ġ{ Ġ" closed " Ġ} ĊĠĠĠ Ġval Ġbyte Count Ġ= Ġbuffer . size ĊĠĠĠ Ġif Ġ( byte Count Ġ> Ġ 0 L ) Ġsink . write ( buffer , Ġbyte Count ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġflush () Ġ{ ĊĠĠĠ Ġcheck (! closed ) Ġ{ Ġ" closed " Ġ} ĊĠĠĠ Ġif Ġ( buffer . size Ġ> Ġ 0 L ) Ġ{ ĊĠĠĠĠĠ Ġsink . write ( buffer , Ġbuffer . size ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġsink . flush () ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġif Ġ( closed ) Ġreturn ĊĊĠĠĠ Ġ// ĠEmit Ġbuffered Ġdata Ġto Ġthe Ġunderlying Ġsink . ĠIf Ġthis Ġfails , Ġwe Ġstill Ġneed ĊĠĠĠ Ġ// Ġto Ġclose Ġthe Ġsink ; Ġotherwise Ġwe Ġrisk Ġle aking Ġresources . ĊĠĠĠ Ġvar Ġthrown : ĠThrowable ? Ġ= Ġnull ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġif Ġ( buffer . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsink . write ( buffer , Ġbuffer . size ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġthrown Ġ= Ġe ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġsink . close () ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( throw n Ġ== Ġnull ) Ġthrown Ġ= Ġe ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclosed Ġ= Ġtrue ĊĊĠĠĠ Ġif Ġ( throw n Ġ!= Ġnull ) Ġthrow Ġthrown ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" buffer ($ sink )" Ċ } Ċ