package Ġcom . github . k ro pp . message pack Ċ Ċ import Ġkotlinx . serialization . descriptors .* Ċ import Ġkotlinx . serialization . encoding .* Ċ import Ġjava . io .* Ċ Ċ class ĠMessage Pack Encoder ( private Ġval Ġstream : ĠOutputStream ) Ġ: ĠAbstract Encoder () Ġ{ ĊĠ Ġoverride Ġfun Ġbegin Structure ( descriptor : ĠSerial Descriptor ): ĠComposite Encoder Ġ{ ĊĠĠĠ Ġstream . write ( bytes ( 0 x 8 0 Ġ+ Ġdescriptor . elements Count )) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Element ( descriptor : ĠSerial Descriptor , Ġindex : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( descriptor . kind Ġ!= ĠStructure Kind . LIST Ġ&& Ġdescriptor . kind Ġ!= ĠStructure Kind . MAP ) Ġ{ ĊĠĠĠĠĠ Ġencode String ( descriptor . getElement Name ( index )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġend Structure ( descriptor : ĠSerial Descriptor ) Ġ{} ĊĊĠ Ġoverride Ġfun Ġbegin Collection ( descriptor : ĠSerial Descriptor , Ġcollection Size : ĠInt ): ĠComposite Encoder Ġ{ ĊĠĠĠ Ġstream . write ( when Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠ ĠStructure Kind . MAP Ġ-> Ġbytes ( 0 x 8 0 Ġ+ Ġcollection Size ) ĊĠĠĠĠĠ ĠStructure Kind . LIST Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġcollection Size Ġ< Ġ 1 6 ĠĠĠĠĠĠ Ġ-> Ġbytes ( 0 x 9 0 Ġ+ Ġcollection Size ) ĊĠĠĠĠĠĠĠ Ġcollection Size Ġ< Ġ 2 5 6 ĠĠĠĠĠ Ġ-> Ġbytes ( 0 xdc , Ġ 0 , Ġcollection Size ) ĊĠĠĠĠĠĠĠ Ġcollection Size Ġ< Ġ 6 5 5 3 6 ĠĠĠ Ġ-> Ġbytes ( 0 xdc ) Ġ+ Ġcollection Size . toByteArray (). take ( 2 ). toByteArray () ĊĠĠĠĠĠĠĠ Ġcollection Size Ġ< Ġ 1 6 7 7 7 2 1 6 Ġ-> Ġbytes ( 0 xdd , Ġ 0 ) Ġ+ Ġcollection Size . toByteArray (). take ( 3 ). toByteArray () ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġbytes ( 0 xdd ) Ġ+ Ġcollection Size . toByteArray (). take ( 4 ). toByteArray () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġbytes () ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode String ( value : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġutf 8 Bytes Ġ= Ġvalue . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠ Ġstream . write ( when Ġ{ ĊĠĠĠĠĠ Ġutf 8 Bytes . size Ġ< ĠĠĠĠ 3 2 Ġ-> ĠByteArray ( 1 ) Ġ{ Ġ( 0 xa 0 Ġ+ Ġutf 8 Bytes . size ). to Byte () Ġ} ĊĠĠĠĠĠ Ġutf 8 Bytes . size Ġ< ĠĠĠ 2 5 6 Ġ-> Ġbytes ( 0 xd 9 ) Ġ+ Ġutf 8 Bytes . size . to Byte () ĊĠĠĠĠĠ Ġutf 8 Bytes . size Ġ< Ġ 6 5 5 3 6 Ġ-> Ġbytes ( 0 xda ) Ġ+ Ġutf 8 Bytes . size . toByteArray (). take ( 2 ). toByteArray () ĊĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġbytes ( 0 xdb ) Ġ+ Ġutf 8 Bytes . size . toByteArray () ĊĠĠĠ Ġ}) ĊĠĠĠ Ġstream . write ( utf 8 Bytes ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Boolean ( value : ĠBoolean ) Ġ{ ĊĠĠĠ Ġstream . write ( bytes ( if Ġ( value ) Ġ 0 xc 3 Ġelse Ġ 0 xc 2 )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Byte ( value : ĠByte ) Ġ{ ĊĠĠĠ Ġstream . write ( ByteArray ( 1 ) Ġ{ Ġvalue Ġ}) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Short ( value : ĠShort ) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ<= ĠByte . MAX _ VALUE ) Ġreturn Ġencode Byte ( value . to Byte ()) ĊĠĠĠ Ġstream . write ( 0 xd 1 ) ĊĠĠĠ Ġstream . write ( value . toByteArray ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Int ( value : ĠInt ) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ<= ĠByte . MAX _ VALUE ) Ġreturn Ġencode Byte ( value . to Byte ()) ĊĠĠĠ Ġif Ġ( value Ġ<= ĠShort . MAX _ VALUE ) Ġreturn Ġencode Short ( value . to Short ()) ĊĠĠĠ Ġstream . write ( 0 xd 2 ) ĊĠĠĠ Ġstream . write ( value . toByteArray ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Long ( value : ĠLong ) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ<= ĠByte . MAX _ VALUE ) Ġreturn Ġencode Byte ( value . to Byte ()) ĊĠĠĠ Ġif Ġ( value Ġ<= ĠShort . MAX _ VALUE ) Ġreturn Ġencode Short ( value . to Short ()) ĊĠĠĠ Ġif Ġ( value Ġ<= ĠInt . MAX _ VALUE ) Ġreturn Ġencode Int ( value . toInt ()) ĊĠĠĠ Ġstream . write ( 0 xd 3 ) ĊĠĠĠ Ġstream . write ( value . toByteArray ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Float ( value : ĠFloat ) Ġ{ ĊĠĠĠ Ġstream . write ( bytes ( 0 xca ) Ġ+ Ġvalue . to Bits (). toByteArray ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Double ( value : ĠDouble ) Ġ{ ĊĠĠĠ Ġstream . write ( bytes ( 0 xcb ) Ġ+ Ġvalue . to Bits (). toByteArray ()) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Null () Ġ{ ĊĠĠĠ Ġstream . write ( bytes ( 0 xc 0 )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġencode Value ( value : ĠAny ) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġis ĠByteArray ) Ġ{ ĊĠĠĠĠĠ Ġstream . write ( when Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . size Ġ< ĠĠĠ 2 5 6 Ġ-> Ġbytes ( 0 xc 4 ) Ġ+ Ġvalue . size . to Byte () ĊĠĠĠĠĠĠĠ Ġvalue . size Ġ< Ġ 6 5 5 3 6 Ġ-> Ġbytes ( 0 xc 5 ) Ġ+ Ġvalue . size . toByteArray (). take ( 2 ). toByteArray () ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġbytes ( 0 xc 6 ) Ġ+ Ġvalue . size . toByteArray () ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġstream . write ( value ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġsuper . encode Value ( value ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }