/* Ċ Ġ* ĠCopyright Ġ 2 0 1 5 - 2 0 2 0 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 . kotlin . frame . io Ċ Ċ import Ġio . ktor . utils . io . core .* Ċ import Ġio . r socket . kotlin . core .* Ċ import Ġio . r socket . kotlin . metadata . security .* Ċ import Ġkotlin . experimental .* Ċ Ċ internal Ġfun ĠByte Packet Builder . write MimeType ( type : ĠMime Type ) Ġ{ ĊĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠMime Type With Id ĠĠ Ġ-> Ġwrite Identifier ( type . identifier ) ĊĠĠĠĠĠĠĠ Ġis ĠMime Type WithName Ġ-> Ġwrite Text With Length ( type . text ) ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġerror (" Unknown Ġmime Ġtype ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠByte Read Packet . read MimeType (): ĠMime Type Ġ= Ġread Type ( ĊĠĠĠ Ġ{ ĠWell Known MimeType ( it ) Ġ?: ĠReserved MimeType ( it ) Ġ}, ĊĠĠĠ Ġ{ ĠWell Known MimeType ( it ) Ġ?: ĠCustom MimeType ( it ) Ġ} Ċ ) Ċ Ċ internal Ġfun ĠByte Packet Builder . write Auth Type ( type : ĠAuth Type ) Ġ{ ĊĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠAuth Type With Id ĠĠ Ġ-> Ġwrite Identifier ( type . identifier ) ĊĠĠĠĠĠĠĠ Ġis ĠAuth Type WithName Ġ-> Ġwrite Text With Length ( type . text ) ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġerror (" Unknown Ġmime Ġtype ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠByte Read Packet . read Auth Type (): ĠAuth Type Ġ= Ġread Type ( ĊĠĠĠ Ġ{ ĠWell K now Auth Type ( it ) Ġ?: ĠReserved Auth Type ( it ) Ġ}, ĊĠĠĠ Ġ{ ĠWell K now Auth Type ( it ) Ġ?: ĠCustom Auth Type ( it ) Ġ} Ċ ) Ċ Ċ private Ġfun ĠByte Packet Builder . write Text With Length ( text : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġtype Bytes Ġ= Ġtext . encode To ByteArray () ĊĠĠĠ Ġwrite Byte ( type Bytes . size . to Byte ()) Ġ// write Ġlength ĊĠĠĠ Ġwrite Fully ( type Bytes ) Ġ// write Ġmime Ġtype Ċ } Ċ Ċ private Ġconst Ġval ĠKnown Type Flag : ĠByte Ġ= ĠByte . MIN _ VALUE Ċ Ċ private Ġfun ĠByte Packet Builder . write Identifier ( identifier : ĠByte ) Ġ{ ĊĠĠĠ Ġwrite Byte ( identifier Ġor ĠKnown Type Flag ) Ċ } Ċ Ċ private Ġinline Ġfun Ġ< T > ĠByte Read Packet . read Type ( ĊĠĠĠ Ġfrom Identifier : Ġ( Byte ) Ġ-> ĠT , ĊĠĠĠ Ġfrom Text : Ġ( String ) Ġ-> ĠT , Ċ ): ĠT Ġ{ ĊĠĠĠ Ġval Ġbyte Ġ= Ġread Byte () ĊĠĠĠ Ġreturn Ġif Ġ( byte Ġcheck ĠKnown Type Flag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentifier Ġ= Ġbyte Ġxor ĠKnown Type Flag ĊĠĠĠĠĠĠĠ Ġfrom Identifier ( identifier ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstring Type Ġ= Ġread Text Exact Bytes ( byte . toInt ()) ĊĠĠĠĠĠĠĠ Ġfrom Text ( string Type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠString . require Ascii () Ġ{ ĊĠĠĠ Ġrequire ( all Ġ{ Ġit . toInt () Ġ<= Ġ 0 x 7 f Ġ}) Ġ{ Ġ" String Ġshould Ġbe Ġan ĠASCII Ġen cod ded Ġstring " Ġ} Ċ } Ċ