From 44eefefe67a4a5f514faa4594370346fd1b54996 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Thu, 21 Sep 2023 19:26:40 +0300 Subject: organize packets and classes (#9) --- pkg/classes/stringTables.go | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 pkg/classes/stringTables.go (limited to 'pkg/classes/stringTables.go') diff --git a/pkg/classes/stringTables.go b/pkg/classes/stringTables.go new file mode 100644 index 0000000..01939b2 --- /dev/null +++ b/pkg/classes/stringTables.go @@ -0,0 +1,100 @@ +package classes + +import ( + "github.com/pektezol/bitreader" + "github.com/pektezol/demoparser/pkg/writer" +) + +type StringTables struct { + Size int32 + Data []StringTable +} + +type StringTable struct { + Name string + TableEntries []StringTableEntry + Classes []StringTableClass +} + +type StringTableEntry struct { + Name string + EntryData StringTableEntryData +} + +type StringTableEntryData struct { + // TODO: Parse StringTableEntry +} + +type StringTableClass struct { + Name string + Data string +} + +func (stringTables *StringTables) ParseStringTables(reader *bitreader.Reader) { + stringTables.Size = reader.TryReadSInt32() + stringTableReader := bitreader.NewReaderFromBytes(reader.TryReadBytesToSlice(uint64(stringTables.Size)), true) + tableCount := stringTableReader.TryReadBits(8) + tables := make([]StringTable, tableCount) + for i := 0; i < int(tableCount); i++ { + var table StringTable + table.ParseStream(stringTableReader) + tables[i] = table + } + stringTables.Data = tables +} + +func (stringTable *StringTable) ParseStream(reader *bitreader.Reader) { + stringTable.Name = reader.TryReadString() + entryCount := reader.TryReadBits(16) + writer.AppendLine("\tTable Name: %s", stringTable.Name) + stringTable.TableEntries = make([]StringTableEntry, entryCount) + + for i := 0; i < int(entryCount); i++ { + var entry StringTableEntry + entry.Parse(reader) + stringTable.TableEntries[i] = entry + } + if entryCount != 0 { + writer.AppendLine("\t\t%d Table Entries:", entryCount) + writer.AppendOutputFromTemp() + } else { + writer.AppendLine("\t\tNo Table Entries") + } + if reader.TryReadBool() { + classCount := reader.TryReadBits(16) + stringTable.Classes = make([]StringTableClass, classCount) + + for i := 0; i < int(classCount); i++ { + var class StringTableClass + class.Parse(reader) + stringTable.Classes[i] = class + } + writer.AppendLine("\t\t%d Classes:", classCount) + writer.AppendOutputFromTemp() + } else { + writer.AppendLine("\t\tNo Class Entries") + } +} + +func (stringTableEntry *StringTableEntry) Parse(reader *bitreader.Reader) { + stringTableEntry.Name = reader.TryReadString() + if reader.TryReadBool() { + byteLen, err := reader.ReadBits(16) + if err != nil { + return + } + dataBsr := reader.TryReadBytesToSlice(byteLen) + _ = bitreader.NewReaderFromBytes(dataBsr, true) // TODO: Parse StringTableEntry + // stringTableEntry.EntryData.ParseStream(entryReader) + } +} + +func (stringTableClass *StringTableClass) Parse(reader *bitreader.Reader) { + stringTableClass.Name = reader.TryReadString() + writer.TempAppendLine("\t\t\tName: %s", stringTableClass.Name) + if reader.TryReadBool() { + dataLen := reader.TryReadBits(16) + stringTableClass.Data = reader.TryReadStringLength(dataLen) + writer.TempAppendLine("\t\t\tData: %s", stringTableClass.Data) + } +} -- cgit v1.2.3