package protocolctl import ( "encoding/json" "fmt" "io/fs" "os" "gitea.mmo.to/ppForge/ppforge/protocol" ) func NewProtocolStructure() *protocol.ProtocolStructure { p := protocol.ProtocolStructure{} return &p } func UpdateMetaData( prot *protocol.ProtocolStructure, name string, version string, tcpiplayer uint, osilayer uint, extensionTo string, desc string, ) { prot.Metadata.Name = name prot.Metadata.Description = desc prot.Metadata.ExtensionTo = extensionTo prot.Metadata.Version = version prot.Metadata.OSILayer = osilayer prot.Metadata.TCPIPLayer = tcpiplayer } func NewEmptyField() *protocol.Field { f := protocol.Field{} return &f } func NewField( name string, desc string, regex string, size int, subfields []protocol.Field, optional bool, payload bool, ) *protocol.Field { f := protocol.Field{ Name: name, Desc: desc, Regex: regex, Size: size, SubFields: subfields, Optional: optional, Payload: payload, } return &f } func AppendField(prot *protocol.ProtocolStructure, field protocol.Field) int { i := len(prot.Structure) prot.Structure = append(prot.Structure, &field) return i + 1 } func AddField(prot *protocol.ProtocolStructure, index int, field *protocol.Field) { if len(prot.Structure) == index { AppendField(prot, *field) return } ret := make([]*protocol.Field, 0) ret = append(ret, prot.Structure[:index]...) ret = append(ret, field) ret = append(ret, prot.Structure[index:]...) prot.Structure = ret } func UpdateFieldByName(prot *protocol.ProtocolStructure, name string, field *protocol.Field) { var fnd int = -1 for i, f := range prot.Structure { if f.Name == name { fnd = i } } if fnd != -1 { prot.Structure[fnd] = field } } func UpdateFieldByElement(prot *protocol.ProtocolStructure, element int, field *protocol.Field) { prot.Structure[element] = field } func RemoveFieldByName(prot *protocol.ProtocolStructure, name string) { element := -1 for i, f := range prot.Structure { if f.Name == name { element = i } } if element == -1 { return } RemoveFieldByElement(prot, element) } func RemoveFieldByElement(prot *protocol.ProtocolStructure, field int) { ret := make([]*protocol.Field, 0) for i, f := range prot.Structure { if i != field { fmt.Printf("appending %d, %s\n", i, f.ToJson()) ret = append(ret, f) } } prot.Structure = ret } func Load(prot *protocol.ProtocolStructure, path string) error { data, err := os.ReadFile(path) if err != nil { return err } err = json.Unmarshal(data, prot) return err } func LoadNew(path string) (*protocol.ProtocolStructure, error) { prot := NewProtocolStructure() err := Load(prot, path) return prot, err } func ToJson(prot *protocol.ProtocolStructure) string { data, err := json.MarshalIndent(*prot, "", " ") if err != nil { return "" } return string(data) } func Save(prot *protocol.ProtocolStructure, path string) error { data, err := json.MarshalIndent(*prot, "", " ") if err != nil { return err } err = os.WriteFile(path, data, fs.ModeAppend) return err }