ref: 62e0c1d69f4e7d1d4557870d82cf5fc18af85534
app/src/main/java/ml/adamsprogs/bimba/api/Structs.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
package ml.adamsprogs.bimba.api import android.util.Log import xyz.apiote.fruchtfleisch.Reader import java.io.InputStream interface Item data class Stop( val code: String, val zone: String, val position: String, val changeOptions: List<ChangeOption>, val name: String ) : Item { override fun toString(): String { var result = "$name ($code) [$zone] $position\n" for (chOpt in changeOptions) result += "${chOpt.line} → ${chOpt.headsign}\n" return result } companion object { fun unmarshall(stream: InputStream): Stop { val reader = Reader(stream) val code = reader.readString() val zone = reader.readString() val position = reader.readString() val chOptionsNum = reader.readUInt() val changeOptions = mutableListOf<ChangeOption>() for (i in 0UL until chOptionsNum) { changeOptions.add(ChangeOption.unmarshall(stream)) } val name = reader.readString() return Stop( name = name, code = code, zone = zone, position = position, changeOptions = changeOptions ) } } } data class Line( val textColour: Int, val colour: Int, val type: LineType, val headsignsThere: List<String>, val headsignsBack: List<String>, val graphThere: LineGraph, val graphBack: LineGraph, val name: String ) : Item { override fun toString(): String { return "$name ($type) [$textColour/$colour]\n→ [${headsignsThere.joinToString()}]\n→ [${headsignsBack.joinToString()}]\n" } companion object { fun unmarshall(stream: InputStream): Line { val reader = Reader(stream) val textColour = reader.readInt().toInt() val colour = reader.readInt().toInt() val type = reader.readUInt() val headsignsThereNum = reader.readUInt() val headsignsThere = mutableListOf<String>() for (i in 0UL until headsignsThereNum) { headsignsThere.add(reader.readString()) } val headsignsBackNum = reader.readUInt() val headsignsBack = mutableListOf<String>() for (i in 0UL until headsignsBackNum) { headsignsBack.add(reader.readString()) } val graphThere = LineGraph.unmarshall(stream) val graphBack = LineGraph.unmarshall(stream) val name = reader.readString() return Line( name = name, textColour = textColour, colour = colour, type = LineType(type.toUInt()), headsignsThere = headsignsThere, headsignsBack = headsignsBack, graphThere = graphThere, graphBack = graphBack ) } } } enum class LineType { TRAM, BUS, UNKNOWN } fun LineType(type: UInt): LineType { Log.d("LineType", "$type") return when (type) { 0U -> LineType.valueOf("TRAM") 3U -> LineType.valueOf("BUS") else -> LineType.valueOf("UNKNOWN") } } data class ChangeOption(val line: String, val headsign: String) { companion object { fun unmarshall(stream: InputStream): ChangeOption { val reader = Reader(stream) return ChangeOption(line = reader.readString(), headsign = reader.readString()) } } } data class LineGraph( val stops: List<StopStub>, val nextNodes: Map<Long, List<Long>>, val prevNodes: Map<Long, List<Long>> ) { companion object { fun unmarshall(stream: InputStream): LineGraph { val reader = Reader(stream) val stopsNum = reader.readUInt() val stops = mutableListOf<StopStub>() for (i in 0UL until stopsNum) { stops.add(StopStub.unmarshall(stream)) } val nextNodesNum = reader.readUInt() val nextNodes = mutableMapOf<Long, List<Long>>() for (i in 0UL until nextNodesNum) { val from = reader.readInt() val toNum = reader.readUInt() val to = mutableListOf<Long>() for (j in 0UL until toNum) { to.add(reader.readInt()) } nextNodes[from] = to } val prevNodesNum = reader.readUInt() val prevNodes = mutableMapOf<Long, List<Long>>() for (i in 0UL until prevNodesNum) { val from = reader.readInt() val toNum = reader.readUInt() val to = mutableListOf<Long>() for (j in 0UL until toNum) { to.add(reader.readInt()) } prevNodes[from] = to } return LineGraph(stops = stops, nextNodes = nextNodes, prevNodes = prevNodes) } } } data class StopStub(val name: String, val code: String, val zone: String, val onDemand: Boolean) { companion object { fun unmarshall(stream: InputStream): StopStub { val reader = Reader(stream) return StopStub( code = reader.readString(), name = reader.readString(), zone = reader.readString(), onDemand = reader.readBoolean() ) } } } |