-
Notifications
You must be signed in to change notification settings - Fork 128
/
data_frame.go
121 lines (99 loc) 路 2.81 KB
/
data_frame.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package frame
import (
"github.com/yomorun/y3"
)
// DataFrame defines the data structure carried with user's data
// transferring within YoMo
type DataFrame struct {
metaFrame *MetaFrame
payloadFrame *PayloadFrame
}
// NewDataFrame create `DataFrame` with a transactionID string,
// consider change transactionID to UUID type later
func NewDataFrame() *DataFrame {
data := &DataFrame{
metaFrame: NewMetaFrame(),
}
return data
}
// Type gets the type of Frame.
func (d *DataFrame) Type() Type {
return TagOfDataFrame
}
// Tag return the tag of carriage data.
func (d *DataFrame) Tag() byte {
return d.payloadFrame.Tag
}
// SetCarriage set user's raw data in `DataFrame`
func (d *DataFrame) SetCarriage(tag byte, carriage []byte) {
d.payloadFrame = NewPayloadFrame(tag).SetCarriage(carriage)
}
// GetCarriage return user's raw data in `DataFrame`
func (d *DataFrame) GetCarriage() []byte {
return d.payloadFrame.Carriage
}
// TransactionID return transactionID string
func (d *DataFrame) TransactionID() string {
return d.metaFrame.TransactionID()
}
// SetTransactionID set transactionID string
func (d *DataFrame) SetTransactionID(transactionID string) {
d.metaFrame.SetTransactionID(transactionID)
}
// GetMetaFrame return MetaFrame.
func (d *DataFrame) GetMetaFrame() *MetaFrame {
return d.metaFrame
}
// GetDataTag return the Tag of user's data
func (d *DataFrame) GetDataTag() byte {
return d.payloadFrame.Tag
}
// SetSourceID set the source ID.
func (d *DataFrame) SetSourceID(sourceID string) {
d.metaFrame.SetSourceID(sourceID)
}
// SourceID returns source ID
func (d *DataFrame) SourceID() string {
return d.metaFrame.SourceID()
}
// SetBroadcast set broadcast mode
func (d *DataFrame) SetBroadcast(enabled bool) {
d.metaFrame.SetBroadcast(enabled)
}
// IsBroadcast returns the broadcast mode is enabled
func (d *DataFrame) IsBroadcast() bool {
return d.metaFrame.IsBroadcast()
}
// Encode return Y3 encoded bytes of `DataFrame`
func (d *DataFrame) Encode() []byte {
data := y3.NewNodePacketEncoder(byte(d.Type()))
// MetaFrame
data.AddBytes(d.metaFrame.Encode())
// PayloadFrame
data.AddBytes(d.payloadFrame.Encode())
return data.Encode()
}
// DecodeToDataFrame decode Y3 encoded bytes to `DataFrame`
func DecodeToDataFrame(buf []byte) (*DataFrame, error) {
packet := y3.NodePacket{}
_, err := y3.DecodeToNodePacket(buf, &packet)
if err != nil {
return nil, err
}
data := &DataFrame{}
if metaBlock, ok := packet.NodePackets[byte(TagOfMetaFrame)]; ok {
meta, err := DecodeToMetaFrame(metaBlock.GetRawBytes())
if err != nil {
return nil, err
}
data.metaFrame = meta
}
if payloadBlock, ok := packet.NodePackets[byte(TagOfPayloadFrame)]; ok {
payload, err := DecodeToPayloadFrame(payloadBlock.GetRawBytes())
if err != nil {
return nil, err
}
data.payloadFrame = payload
}
return data, nil
}