mirror of
https://github.com/renorris/openfsd
synced 2026-03-22 23:05:36 +08:00
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
package protocol
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type ClientQueryPDU struct {
|
|
From string `validate:"required,alphanum,max=7"`
|
|
To string `validate:"required,max=7"`
|
|
QueryType string `validate:"required,ascii,min=2,max=7"`
|
|
Payload string `validate:""`
|
|
}
|
|
|
|
func (p *ClientQueryPDU) Serialize() string {
|
|
if p.Payload == "" {
|
|
return fmt.Sprintf("$CQ%s:%s:%s%s", p.From, p.To, p.QueryType, PacketDelimeter)
|
|
} else {
|
|
return fmt.Sprintf("$CQ%s:%s:%s:%s%s", p.From, p.To, p.QueryType, p.Payload, PacketDelimeter)
|
|
}
|
|
}
|
|
|
|
func ParseClientQueryPDU(rawPacket string) (*ClientQueryPDU, error) {
|
|
rawPacket = strings.TrimSuffix(rawPacket, PacketDelimeter)
|
|
rawPacket = strings.TrimPrefix(rawPacket, "$CQ")
|
|
fields := strings.SplitN(rawPacket, Delimeter, 4)
|
|
if len(fields) < 3 {
|
|
return nil, NewGenericFSDError(SyntaxError)
|
|
}
|
|
|
|
payload := ""
|
|
if len(fields) == 4 {
|
|
payload = fields[3]
|
|
}
|
|
|
|
pdu := ClientQueryPDU{
|
|
From: fields[0],
|
|
To: fields[1],
|
|
QueryType: fields[2],
|
|
Payload: payload,
|
|
}
|
|
|
|
err := V.Struct(pdu)
|
|
if err != nil {
|
|
return nil, NewGenericFSDError(SyntaxError)
|
|
}
|
|
|
|
switch pdu.QueryType {
|
|
case "ATC", "CAPS", "C?",
|
|
"RN", "SV", "ATIS",
|
|
"IP", "INF", "FP",
|
|
"IPC", "BY", "HI",
|
|
"HLP", "NOHLP", "WH",
|
|
"IT", "HT", "DR",
|
|
"FA", "TA", "BC",
|
|
"SC", "VT", "ACC",
|
|
"NEWINFO", "NEWATIS", "EST",
|
|
"GD":
|
|
default:
|
|
return nil, NewGenericFSDError(SyntaxError)
|
|
}
|
|
|
|
return &pdu, nil
|
|
}
|