package Ġkotlinx . coroutines . experimental . io . packet Ċ Ċ import Ġkotlinx . coroutines . experimental . io . ByteBuffer Ċ import Ġkotlinx . coroutines . experimental . io . buffers .* Ċ import Ġkotlinx . coroutines . experimental . io . internal .* Ċ import Ġjava . io .* Ċ import Ġjava . nio . charset .* Ċ Ċ internal Ġclass ĠByte Read Packet View Based ( private Ġvar Ġhead : ĠBuffer View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġval Ġpool : ĠObject Pool < Buffer View >) Ġ: ĠByte Read Packet Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġremaining : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhead . remaining All (). toInt () Ġ// ĠTODO ĠLong Ġor ĠInt ? ĊĊĠĠĠ Ġoverride Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġhead . isEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġcopy (): ĠByte Read Packet Ġ= ĠByte Read Packet View Based ( head . copy All (), Ġpool ) ĊĊĠĠĠ Ġoverride Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ!== ĠBuffer View . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . release All ( pool ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead Ġ= ĠBuffer View . Empty ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġste al (): ĠBuffer View ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġval Ġempty Ġ= ĠBuffer View . Empty ĊĠĠĠĠĠĠĠ Ġif Ġ( head Ġ=== Ġempty ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġthis . head Ġ= Ġnext Ġ?: Ġempty ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhead ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Byte () Ġ= Ġread N ( 1 ) Ġ{ Ġread Byte () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġread Short () Ġ= Ġread N ( 2 ) Ġ{ Ġread Short () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġread Int () Ġ= Ġread N ( 4 ) Ġ{ Ġread Int () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġread Long () Ġ= Ġread N ( 8 ) Ġ{ Ġread Long () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġread Float () Ġ= Ġread N ( 4 ) Ġ{ Ġread Float () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġread Double () Ġ= Ġread N ( 8 ) Ġ{ Ġread Double () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Available ( dst : ĠByteBuffer ) Ġ= Ġread As M uch As Possible ( dst , Ġ 0 ) ĊĠĠĠ Ġoverride Ġfun Ġread Fully ( dst : ĠByteBuffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġread As M uch As Possible ( dst , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( dst . has Remaining ()) Ġthrow ĠEOF Exception (" Not Ġenough Ġdata Ġin Ġpacket Ġto Ġfill Ġbuffer : Ġ${ dst . remaining ()} Ġmore Ġbytes Ġrequired ") ĊĠĠĠĠĠĠĠ Ġreturn Ġrc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Available ( dst : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( offset Ġ>= Ġ 0 ) Ġ{ Ġ" offset Ġshouldn 't Ġbe Ġnegative : Ġ$ offset " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( length Ġ>= Ġ 0 ) Ġ{ Ġ" length Ġshouldn 't Ġbe Ġnegative : Ġ$ length " Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( offset Ġ+ Ġlength Ġ<= Ġdst . size ) Ġ{ Ġthrow ĠArray Index OutOfBoundsException () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġread As M uch As Possible ( dst , Ġoffset , Ġlength , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Fully ( dst : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġread Available ( dst , Ġoffset , Ġlength ) ĊĠĠĠĠĠĠĠ Ġif Ġ( rc Ġ!= Ġlength ) Ġthrow ĠEOF Exception (" Not Ġenough Ġdata Ġin Ġpacket Ġto Ġfill Ġbuffer : Ġ${ length Ġ- Ġrc } Ġmore Ġbytes Ġrequired ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġskip ( n : ĠInt ) Ġ= Ġdiscard As M uch As Possible ( n , Ġ 0 ) ĊĊĠĠĠ Ġoverride Ġfun Ġread UTF 8 Line To ( out : ĠAppend able , Ġlimit : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdecoded Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġcr Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġend Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ(! end ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġprepare Read ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMal formed Input Exception ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbuffer . decode UTF 8 Ġ{ Ġch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ r ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ decode UTF 8 Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\ n ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ decode UTF 8 Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( decoded Ġ== Ġlimit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuffer Limit Exceeded Exception (" Too Ġmany Ġcharacters Ġin Ġline : Ġlimit Ġ$ limit Ġexceeded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecoded ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . append ( ch ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 Ġ|| Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdecoded Ġ> Ġ 0 Ġ|| Ġ! isEmpty ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Text (): ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild String ( remaining ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbb Ġ= Ġprepare Read ( 1 ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! bb . decode ASCII Ġ{ Ġappend ( it ); Ġtrue Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Text Utf 8 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStringBuilder . read Text Utf 8 () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbb Ġ= Ġprepare Read ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bb Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMal formed Input Exception ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbb . decode UTF 8 Ġ{ Ġappend ( it ); Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreader UTF 8 (): ĠReader Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠReader () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġskip ( n : ĠLong ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġskipped Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠSkip Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbufferSize Ġ= Ġbuffer . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( skipped Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( buffer Size . to Long (), Ġn Ġ- Ġskipped ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġread ( buffer , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rc Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġskipped Ġ+= Ġrc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġskipped ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( c buf : ĠChar Array , Ġoff : ĠInt , Ġlen : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrem Ġ= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġoff ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rem Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbb Ġ= Ġprepare Read ( 1 ) Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġbb . decode ASCII Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rem Ġ== Ġ 0 ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc buf [ idx ++] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrem -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rc ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( rem Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Utf 8 ( c buf , Ġidx , Ġrem , Ġidx Ġ- Ġoff ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Ġ= Ġidx Ġ- Ġoff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ> Ġ 0 Ġ-> Ġcopied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . isEmpty () Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġread Utf 8 ( c buf : ĠChar Array , Ġoff : ĠInt , Ġlen : ĠInt , Ġcopied 0 : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrem Ġ= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Ġ= Ġoff ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( rem Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġprepare Read ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMal formed Input Exception ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġbuffer . decode UTF 8 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rem Ġ== Ġ 0 ) Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc buf [ idx ++] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrem -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcopied Ġ= Ġidx Ġ- Ġoff Ġ+ Ġcopied 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ> Ġ 0 Ġ-> Ġcopied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhead . isEmpty () Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠinputStream (): ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠInputStream () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( head . isEmpty ()) Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread Byte (). toInt () Ġand Ġ 0 xff ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġavailable () Ġ= Ġremaining ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġdiscard As M uch As Possible ( n : ĠInt , Ġskipped : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( n Ġ== Ġ 0 ) Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġskipped ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( current . read Remaining , Ġn ) ĊĠĠĠĠĠĠĠ Ġif Ġ( current . discard Exact ( size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdiscard As M uch As Possible ( n Ġ- Ġsize , Ġskipped Ġ+ Ġsize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġread As M uch As Possible ( bb : ĠByteBuffer , Ġcopied : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! bb . has Remaining ()) Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġdestination Capacity Ġ= Ġbb . remaining () ĊĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġcurrent . read Remaining ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( destination Capacity Ġ>= Ġavailable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . read ( bb , Ġavailable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Head ( current ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġread As M uch As Possible ( bb , Ġcopied Ġ+ Ġavailable ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent . read ( bb , Ġdestination Capacity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ+ Ġdestination Capacity ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġread As M uch As Possible ( array : ĠByteArray , Ġoffset : ĠInt , Ġlength : ĠInt , Ġcopied : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( length Ġ== Ġ 0 ) Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġprepare Read ( 1 ) Ġ?: Ġreturn Ġcopied ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġmin Of ( length , Ġcurrent . read Remaining ) ĊĊĠĠĠĠĠĠĠ Ġcurrent . read ( array , Ġoffset , Ġsize ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( size Ġ!= Ġlength Ġ|| Ġcurrent . read Remaining Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread As M uch As Possible ( array , Ġoffset Ġ+ Ġsize , Ġlength Ġ- Ġsize , Ġcopied Ġ+ Ġsize ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopied Ġ+ Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< R > Ġread N ( n : ĠInt , Ġblock : ĠBuffer View . () Ġ-> ĠR ): ĠR Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbb Ġ= Ġprepare Read ( n ) Ġ?: Ġthrow ĠEOF Exception (" Not Ġenough Ġdata Ġin Ġpacket Ġto Ġread Ġ$ n Ġbyte ( s )") ĊĠĠĠĠĠĠĠ Ġval Ġrc Ġ= Ġblock ( bb ) ĊĠĠĠĠĠĠĠ Ġafter Read () ĊĠĠĠĠĠĠĠ Ġreturn Ġrc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġprepare Read ( min Size : ĠInt ): ĠBuffer View ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĊĠĠĠĠĠĠĠ Ġval Ġhead Size Ġ= Ġhead . read Remaining ĊĠĠĠĠĠĠĠ Ġif Ġ( head Size Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . next Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġhead . write Buffer Append ( next , Ġmin Size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next . read Remaining Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhead . next Ġ= Ġnext . next ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext . release ( pool ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( head . read Remaining Ġ>= Ġmin Size ) Ġreturn Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( min Size Ġ> ĠReserved Size ) Ġthrow ĠIllegalStateException (" min Size Ġof Ġ$ min Size Ġis Ġtoo Ġbig Ġ( should Ġbe Ġless Ġthan Ġ$ Reserved Size ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprepare Read ( min Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġafter Read () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhead Ġ= Ġhead ĊĠĠĠĠĠĠĠ Ġif Ġ( head . read Remaining Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Head ( head ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Head ( head : ĠBuffer View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġhead . next ĊĠĠĠĠĠĠĠ Ġthis . head Ġ= Ġnext Ġ?: ĠBuffer View . Empty ĊĠĠĠĠĠĠĠ Ġhead . release ( pool ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEmpty Ġ= ĠByte Read Packet View Based ( Buffer View . Empty , Ġobject : ĠNo Pool Impl < Buffer View >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġborrow () Ġ= ĠBuffer View . Empty ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval ĠReserved Size Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSkip Buffer Ġ= ĠChar Array ( 8 1 9 2 ) ĊĠĠĠ Ġ} Ċ } ĊĊ