package Ġorg . go lem . r ak net . handler . un connected Ċ Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Simple Channel Inbound Handler Ċ import Ġorg . go lem . r ak net . CURRENT _ PROTOCOL _ VERSION Ċ import Ġorg . go lem . r ak net . types . Magic Ċ import Ġorg . go lem . r ak net . Server Ċ import Ġorg . go lem . r ak net . connection . Connection Ċ import Ġorg . go lem . r ak net . handler . Message Envelope Ċ import Ġorg . go lem . r ak net . message . Offline Message Ċ import Ġorg . go lem . r ak net . message . protocol .* Ċ Ċ class ĠUn connected MessageHandler ( private Ġval Ġserver : ĠServer ): ĠSimple Channel Inbound Handler < Message Envelope < Offline Message >>() Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġaccept Inbound Message ( msg : ĠAny ?): ĠBoolean Ġ= Ġ Ġmsg Ġis ĠMessage Envelope < *> Ġ&& Ġmsg . content () Ġis ĠOff line Message ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Read 0 ( ctx : ĠChannel HandlerContext , Ġmsg : ĠMessage Envelope < Offline Message >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠOff line Message Ġ= Ġwhen ( val Ġpacket Ġ= Ġmsg . content ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUn connected Ping Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( server . has Connection ( msg . sender ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUn connected P ong ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġping Id Ġ= Ġpacket . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagic Ġ= ĠMagic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguid Ġ= Ġserver . guid . most Sign ificant Bits , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠServer Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Name Ġ= Ġserver . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOpen Connection Request 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( packet . protocol Version Ġ!= ĠCURRENT _ PROTOCOL _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn compatible Protocol ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Ġ= ĠCURRENT _ PROTOCOL _ VERSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagic Ġ= ĠMagic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Guid Ġ= Ġserver . guid . most Sign ificant Bits , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Connection Reply 1 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagic Ġ= ĠMagic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Guid Ġ= Ġserver . guid . most Sign ificant Bits , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Security Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Size Ġ= Ġ( packet . mt u Size Ġ+ Ġ 2 8 ). to Short (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOpen Connection Request 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmt u Size Ġ= Ġpacket . mt u Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( mt u Size Ġ< ĠConnection . MIN _ MT U ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġattempt Ġto Ġrespond Ġif Ġthe ĠMT U Ġis Ġthis Ġsmall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMT U Ġsize Ġwill Ġnever Ġexceed Ġ` Connection . MAX _ MT U ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Size Ġ= Ġmin Of ( mt u Size , ĠConnection . MAX _ MT U ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . add Connection ( Connection ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġmsg . sender (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Ġ= Ġserver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġctx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Size Ġ= Ġmt u Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġguid Ġ= Ġpacket . client Guid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOpen Connection Reply 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmagic Ġ= ĠMagic , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver Guid Ġ= Ġserver . guid . most Sign ificant Bits , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmt u Size Ġ= Ġmt u Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Address Ġ= Ġpacket . server Address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Enabled Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unsupported Ġpacket : Ġ$ packet ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġctx . write And Flush ( Message Envelope ( response , Ġmsg . sender ())) ĊĠĠĠ Ġ} Ċ Ċ }