package Ġkit to ku . mvc . unit . dhcp Ċ Ċ import Ġkit to ku . mvc . debug . assert Always Ċ import Ġkit to ku . mvc . extension . toInt As U Byte Ċ import Ġkit to ku . mvc . unit . Data Unit Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . reflect . K Mutable Property 1 Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . member Properties ĊĊ Ċ internal Ġclass ĠOption Pack Ġ: ĠData Unit Ġ{ ĊĠĠĠ Ġinternal Ġval Ġunknown Option Tags Ġ= Ġmutable ListOf < Byte >() ĊĊĠĠĠ Ġinternal Ġvar Ġmessage Type : ĠByte Ġ= Ġ 0 ĊĊĠĠĠ Ġinternal Ġvar Ġoption Subnet Mask : ĠD h cp Option Subnet Mask ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġoption Router Address : ĠD h cp Option Router Address ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġoption Dns Server Address : ĠD h cp Option Dns Server Address ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġoption Requested Address : ĠD h cp Option Requested Address ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġoption Dh cp Server Address : ĠD h cp Option Dh cp Server Address ? Ġ= Ġnull ĊĊĠĠĠ Ġinternal Ġvar Ġoption Lease Time : ĠD h cp Option Lease Time ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġoption Parameter List : ĠD h cp Option Parameter List ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval Ġlength : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 4 Ġ+ Ġvalid Properties . map Ġ{ Ġit . length Ġ}. sum () Ġ// Ġ 4 Ġ== ĠMessageType Ġ+ ĠEND ĊĊĠĠĠ Ġprivate Ġval Ġvalid Properties : ĠList < Dh cp Option > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis :: class . member Properties . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . name . startsWith (" option ") ĊĠĠĠĠĠĠĠ Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠK Property 1 < Option Pack , ĠD h cp Option ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwrite ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD h cp Option MessageType (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value Ġ= Ġmessage Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ( buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvalid Properties . forEach Ġ{ Ġit . write ( buffer ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuffer . put ( DH CP _ OPTION _ END ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġunknown Option Tags . clear () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġtag Ġ= Ġbuffer . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ SUB NET _ MASK Ġ-> Ġimport Option ( Dh cp Option Subnet Mask (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ ROUT ER _ ADDRESS Ġ-> Ġimport Option ( Dh cp Option Router Address (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ DNS _ SERVER _ ADDRESS Ġ-> Ġimport Option ( Dh cp Option Dns Server Address (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ REQUEST ED _ ADDRESS Ġ-> Ġimport Option ( Dh cp Option Requested Address (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ DH CP _ SERVER _ ADDRESS Ġ-> Ġimport Option ( Dh cp Option Dh cp Server Address (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ LEASE _ TIME Ġ-> Ġimport Option ( Dh cp Option Lease Time (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ PARAMETER _ LIST Ġ-> Ġimport Option ( Dh cp Option Parameter List (), Ġbuffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ MESSAGE _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD h cp Option MessageType (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Type Ġ= Ġit . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDHCP _ OPTION _ END Ġ-> Ġbreak ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Option Tags . add ( tag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiscard Option ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Always ( message Type . toInt As U Byte () Ġ!= Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġimport Option ( option : ĠD h cp Option , Ġbuffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget PropertyName Ġ= Ġ" option " Ġ+ Ġoption :: class . simple Name !!. substring ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġk Property Ġ= Ġthis :: class . member Properties . first Ġ{ Ġit . name Ġ== Ġtarget PropertyName Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġk Property Ġas ĠK Mutable Property 1 < Option Pack , ĠD h cp Option ?> ĊĊĠĠĠĠĠĠĠ Ġassert Always ( k Property . get ( this ) Ġ== Ġnull ) Ġ// Ġavoid Ġkey Ġduplication ĊĊĠĠĠĠĠĠĠ Ġoption . read ( buffer ) ĊĊĠĠĠĠĠĠĠ Ġk Property . set ( this , Ġoption ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiscard Option ( buffer : ĠByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ ĠD h cp Option (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . read ( buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ