class ĠMc Transport () Ġ: ĠMC Connect Observer < String > Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġwrite Stream : Ġdynamic Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġread Stream : Ġdynamic Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġresult Bytes Ġ= Ġarray ListOf < Byte >() ĊĠĠĠ Ġprivate Ġvar Ġcallback : Ġ( bytes : ĠByteArray ) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠMc Condition Monitor . instance . add Observer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Bytes ( bytes : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Header Ġ= Ġencode Int ( bytes . size ) ĊĠĠĠĠĠĠĠ Ġprintln (" write : Ġ$ bytes Header ") ĊĠĠĠĠĠĠĠ Ġwrite Stream . write ( js (" new ĠBuffer ( bytes Header ) ")) ĊĠĠĠĠĠĠĠ Ġprintln (" write : Ġ$ bytes ") ĊĠĠĠĠĠĠĠ Ġwrite Stream . write ( js (" new ĠBuffer ( bytes ) ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Proto Buf ( message : ĠDebug Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Message Ġ= Ġget Proto Buf Type Message ( TaskRequest . Type . DEBUG ) ĊĠĠĠĠĠĠĠ Ġsend Proto Buf Type ( type Message ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( encode Proto Buf ( message )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Proto Buf ( message : ĠSon ar Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Message Ġ= Ġget Proto Buf Type Message ( TaskRequest . Type . SON AR ) ĊĠĠĠĠĠĠĠ Ġsend Proto Buf Type ( type Message ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( encode Proto Buf ( message )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Proto Buf ( request : ĠSon ar Explore Angle Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Message Ġ= Ġget Proto Buf Type Message ( TaskRequest . Type . SON AR _ EXP LO RE ) ĊĠĠĠĠĠĠĠ Ġsend Proto Buf Type ( type Message ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( encode Proto Buf ( request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Proto Buf ( message : ĠRoute Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Message Ġ= Ġget Proto Buf Type Message ( TaskRequest . Type . ROUTE ) ĊĠĠĠĠĠĠĠ Ġsend Proto Buf Type ( type Message ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( encode Proto Buf ( message )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend Proto Buf ( request : ĠRoute Metric Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Message Ġ= Ġget Proto Buf Type Message ( TaskRequest . Type . ROUTE _ METRIC ) ĊĠĠĠĠĠĠĠ Ġsend Proto Buf Type ( type Message ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( encode Proto Buf ( request )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Proto Buf Type ( message Type : ĠTask Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Bytes Ġ= Ġencode Proto Buf ( message Type ) ĊĠĠĠĠĠĠĠ Ġsend Bytes ( type Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Proto Buf Type Message ( type : ĠTask Request . Type ): ĠTask Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTask Request . Builder TaskRequest ( type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Streams ( path ToFile : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Stream Ġ= Ġfs . create Write Stream ( path ToFile ) ĊĠĠĠĠĠĠĠ Ġread Stream Ġ= Ġfs . create Read Stream ( path ToFile ) ĊĠĠĠĠĠĠĠ Ġread Stream . on (" readable ", Ġfun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġread Stream . read () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage Length Ġ= Ġget Body Length ( result Bytes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. data . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" read Ġbyte Ġ:" Ġ+ Ġdata [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Bytes . add ( data [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Length Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Length Ġ= Ġget Body Length ( result Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Length Ġ!= Ġ- 1 Ġ&& Ġmessage Length Ġ+ Ġproto Header Length Ġ== Ġresult Bytes . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . invoke ( result Bytes . drop ( 4 ). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Bytes . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconnect ( transport FileName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Streams ( transport FileName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose Streams () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset CallBack ( cb : Ġ( bytes : ĠByteArray ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcb ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Streams () Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Stream . end () ĊĠĠĠĠĠĠĠ Ġwrite Stream Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġread Stream Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Body Length ( result Bytes : ĠList < Byte >): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Bytes . size Ġ< Ġproto Header Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// need Ġfirst Ġ${ proto Header Length } Ġbytes Ġ- Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdecode Int ( result Bytes . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġencode Int ( i : ĠInt ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠByteArray ( 4 ) ĊĠĠĠĠĠĠĠ Ġresult [ 0 ] Ġ= Ġi . shr ( 2 4 ). to Byte () ĊĠĠĠĠĠĠĠ Ġresult [ 1 ] Ġ= Ġi . shr ( 1 6 ). to Byte () ĊĠĠĠĠĠĠĠ Ġresult [ 2 ] Ġ= Ġi . shr ( 8 ). to Byte () ĊĠĠĠĠĠĠĠ Ġresult [ 3 ] Ġ= Ġi . to Byte () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdecode Int ( bytes : ĠByteArray ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġbytes [ 3 ] ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġbytes [ 2 ]. toInt (). sh l ( 8 ) ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġbytes [ 1 ]. toInt (). sh l ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġbytes [ 0 ]. toInt (). sh l ( 2 4 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval Ġproto Header Length : ĠInt Ġ= Ġ 4 Ċ val Ġmc Transport Ġ= ĠMc Transport ()