This repository has been archived by the owner on Apr 16, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathpacket.go
88 lines (75 loc) · 1.47 KB
/
packet.go
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
package secretun
import (
"bytes"
"encoding/gob"
)
const (
// Packet Types
PT_P2P = iota
PT_AUTH
PT_SHUTDOWN
PT_UNKNOWN
)
type Packet struct {
Type uint8
Data []byte
}
var encoders Encoders
func (p *Packet) Decode(e interface{}) error {
buf := bytes.NewBuffer(p.Data)
de := gob.NewDecoder(buf)
return de.Decode(e)
}
func (p *Packet) Encode(e interface{}) error {
buf := new(bytes.Buffer)
en := gob.NewEncoder(buf)
if err := en.Encode(e); err != nil {
return err
}
p.Data = buf.Bytes()
return nil
}
func (p *Packet) Serialize() ([]byte, error) {
buf := new(bytes.Buffer)
if err := buf.WriteByte(p.Type); err != nil {
return nil, err
}
if _, err := buf.Write(p.Data); err != nil {
return nil, err
}
return encoders.Encode(buf.Bytes())
}
func DeserializePacket(data []byte) (*Packet, error) {
if decoded_data, err := encoders.Decode(data); err != nil {
return nil, err
} else {
p := new(Packet)
p.Type = decoded_data[0]
p.Data = decoded_data[1:]
return p, nil
}
return nil, nil
}
func NewPacket(t uint8, e interface{}) (pack *Packet) {
pack = new(Packet)
pack.Type = t
switch v := e.(type) {
case []byte:
pack.Data = v
default:
if err := pack.Encode(e); err != nil {
panic(err)
}
}
return pack
}
func InitPacket(cfg Config) (err error) {
var encoders_cfg []Config
if err := cfg.Get("encoders", &encoders_cfg); err != nil {
return err
}
if encoders, err = GetEncoders(encoders_cfg); err != nil {
return err
}
return nil
}