aboutsummaryrefslogtreecommitdiff
path: root/packets/messages/types/SvcClassInfo.go
blob: df17bfc5a970adc0b730f7aa379fffa4828e54f8 (plain) (blame)
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
package types

import (
	"github.com/pektezol/bitreader"
)

type SvcClassInfo struct {
	CreateOnClient bool
	ServerClasses  []ServerClass
}

type ServerClass struct {
	ClassId       int32
	ClassName     string
	DataTableName string
}

func ParseSvcClassInfo(reader *bitreader.ReaderType) SvcClassInfo {
	length := reader.TryReadInt16()
	createonclient := reader.TryReadBool()
	var serverclasses []ServerClass
	if !createonclient {
		serverclasses := make([]ServerClass, length)
		for i := 0; i < int(length); i++ {
			id, err := reader.ReadBits(HighestBitIndex(uint(length)) + 1)
			if err != nil {
				panic(err)
			}
			serverclasses[i] = ServerClass{
				ClassId:       int32(id),
				ClassName:     reader.TryReadString(),
				DataTableName: reader.TryReadString(),
			}
		}
	}
	return SvcClassInfo{
		CreateOnClient: createonclient,
		ServerClasses:  serverclasses,
	}
}

func HighestBitIndex(i uint) int {
	var j int
	for j = 31; j >= 0 && (i&(1<<j)) == 0; j-- {
	}
	return j
}