// GateConLev0Stats.bcpl
// Last modified July 2, 1983  10:06 PM by Boggs

get "Pup0.decl"
get "Pup1.decl"
get "GateConMenu.decl"

external
[
// outgoing procedures
Level0Stats

// incoming procedures
PrintSLAStats; PrintEtherStats; PrintPRStats
OpenLevel1Socket; CloseLevel1Socket
GetBuf; ReleasePBI; SendCommand; TopLevel
ResetCmdMenu; CreateCmdBox; ReturnFrom; BoxProc
Wss; Ws; PutTemplate; Resets; GetNetTable
]

manifest
[
psStatistics = 22b

ptSendStats = 200b
ptStatsAck = 201b
ptStatsNak = 202b
]

structure NetBox [ @CmdBox; netNumber word ]

//----------------------------------------------------------------------------
let Level0Stats() be
//----------------------------------------------------------------------------
[
let v = vec 1; unless GetNetTable(v) return
let numNets, netTable = v!0, v!1
ResetCmdMenu()
CreateCmdBox(TopLevel, "TopLevel")
for i = 0 to numNets -1 do
   [
   if netTable!i eq 0 loop
   let box = CreateCmdBox(GetStats, "    ", 1)
   box>>Box.bs>>BS.centerX = true
   Resets(box>>Box.bs)
   PutTemplate(box>>Box.bs, "$UO", netTable!i)
   box>>NetBox.netNumber = netTable!i
   ]
// ResetCmdMenu destroyed the BoxQ which BoxProc is following.
// If we just return now, BoxProc will get horribly confused.
// So don't let it continue: force a return from BoxProc.
ReturnFrom(BoxProc)
]

//----------------------------------------------------------------------------
and GetStats(box) be
//----------------------------------------------------------------------------
[
let soc = vec lenPupSoc; OpenLevel1Socket(soc)
let pbi = GetBuf(soc)
pbi>>PBI.pup.dPort.socket↑2 = psStatistics
pbi>>PBI.pup.words↑1 = box>>NetBox.netNumber
pbi = SendCommand(pbi, ptSendStats, pupOvBytes+2)
test pbi ne 0
   ifso
      [
      switchon pbi>>PBI.pup.type into
         [
         case ptStatsNak:
            [
            Ws(" - stats not available")
            endcase
            ]
         case ptStatsAck:
            [
            switchon pbi>>PBI.pup.words↑1 into
               [
               case netTypeEther:
                  [ PrintEtherStats(pbi); endcase ]
               case netTypeSLA:
                  [ PrintSLAStats(pbi); endcase ]
               case netTypePR:
                  [ PrintPRStats(pbi); endcase ]
               ]
            endcase
            ]
         ]
      ReleasePBI(pbi)
      ]
   ifnot Ws(" - the Level 0 Stats Server doesn't answer")
CloseLevel1Socket(soc)
]