/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 ĠNet flix , ĠInc . Ċ Ġ* Ċ Ġ* Ġ Ġ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 Ġio . r socket . android . fragment ation Ċ Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Un p ooled Ċ import Ġio . reactivex . Emitter Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . r socket . android . Frame Ċ import Ġio . r socket . android . frame . Frame Header Fly weight .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ internal Ġclass ĠFrame Fragment er ( private Ġval Ġmt u : ĠInt ) Ġ{ ĊĊĠĠĠ Ġfun Ġshould Fragment ( frame : ĠFrame ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Ġ> Ġ 0 Ġ&& Ġframe . is Fragment able ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġpayload Length ( frame . content ()) Ġ> Ġmt u ĊĊĠĠĠ Ġfun Ġfragment ( frame : ĠFrame ): ĠFlow able < Frame > Ġ= ĠFlow able ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. generate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠState ( frame ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFragment Generator (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġit . dispose () Ġ}) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠFragment Generator Ġ: Ġ( State , ĠEmit ter < Frame >) Ġ-> ĠUnit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinvoke ( state : ĠState , Ġsink : ĠEmit ter < Frame >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Length Ġ= Ġstate . data Readable Bytes () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . metadata Present ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetadata Length Ġ= Ġstate . metadata Readable Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metadata Length Ġ> Ġmt u ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onNext ( state . slice Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFLAGS _ F )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data Length Ġ> Ġmt u Ġ- Ġmetadata Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onNext ( state . slice Data And Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Ġ- Ġmetadata Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFLAGS _ F )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onNext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . slice Data And Metadata ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data Length Ġ> Ġmt u ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onNext ( state . slice Data ( mt u , ĠFLAGS _ F )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onNext ( state . slice Data ( data Length , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsink . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠState ( frame : ĠFrame ) Ġ: ĠDis posable Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdisposed Ġ= ĠAtomic Boolean () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġframe : ĠFrame Ġ= Ġframe . retain () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdata : ĠByte Buf Ġ= Ġslice Frame Data ( frame . content ()) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmetadata : ĠByte Buf ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frame . has Metadata ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġslice Frame Metadata ( frame . content ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Disposed (): ĠBoolean Ġ= Ġdisposed . get () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dis posed . compare AndSet ( false , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe . release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmetadata Present (): ĠBoolean Ġ= Ġmetadata Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġmetadata Readable Bytes (): ĠInt Ġ= Ġmetadata !!. readable Bytes () ĊĊĠĠĠĠĠĠĠ Ġfun Ġdata Readable Bytes (): ĠInt Ġ= Ġdata . readable Bytes () ĊĊĠĠĠĠĠĠĠ Ġfun Ġslice Metadata ( metadata Length : ĠInt , Ġadditional Flags : ĠInt ): ĠFrame Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame . Fragment ation . slice Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata !!. read Slice ( metadata Length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn p ooled . EMPTY _ BUFFER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Flags ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġslice Data And Metadata ( metadata Length : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Length : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Flags : ĠInt ): ĠFrame Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame . Fragment ation . slice Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata !!. read Slice ( metadata Length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read Slice ( data Length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Flags ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġslice Data ( data Length : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Flags : ĠInt ): ĠFrame Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFrame . Fragment ation . slice Frame ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read Slice ( data Length ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Flags ) ĊĠĠĠ Ġ} Ċ } Ċ