-
Notifications
You must be signed in to change notification settings - Fork 0
/
secoap.go
116 lines (97 loc) · 2.67 KB
/
secoap.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
// Copyright 2024 tobyzxj
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package secoap
import (
"context"
"github.com/GiterLab/go-secoap/coder/coderv0"
"github.com/GiterLab/go-secoap/coder/coderv1"
"github.com/GiterLab/go-secoap/coder/coderv2"
"github.com/GiterLab/go-secoap/message"
"github.com/GiterLab/go-secoap/secoapcore"
)
const (
Version0 secoapcore.Ver = 0 // Version0 版本0,私有SECOAP协议
Version1 secoapcore.Ver = 1 // Version1 版本1,标准COAP协议
Version2 secoapcore.Ver = 2 // Version2 版本2,私有SECOAP协议, 默认使用此协议
)
// Secoap Secoap协议实例
type Secoap struct {
Version secoapcore.Ver
Message *message.Message
ctx *context.Context
}
// NewSecoap 创建一个Secoap协议实例
func NewSecoap(ver secoapcore.Ver) *Secoap {
if ver > 2 {
ver = Version2
}
ctx := context.Background()
return &Secoap{
Version: ver,
Message: message.NewMessage(ctx),
ctx: &ctx,
}
}
func (s *Secoap) SetContext(ctx context.Context) {
s.ctx = &ctx
}
func (s *Secoap) GetContext() context.Context {
return *s.ctx
}
func (s *Secoap) SetVersion(ver secoapcore.Ver) {
s.Version = ver
}
func (s *Secoap) GetVersion() secoapcore.Ver {
return s.Version
}
func (s *Secoap) SetMessage(msg *message.Message) {
s.Message = msg
}
func (s *Secoap) GetMessage() *message.Message {
return s.Message
}
func (s *Secoap) Marshal() ([]byte, error) {
var encoder message.Encoder
if s.Message == nil {
return nil, secoapcore.ErrMessageNil
}
switch s.Version {
case Version0:
encoder = coderv0.DefaultCoder
case Version1:
encoder = coderv1.DefaultCoder
case Version2:
encoder = coderv2.DefaultCoder
default:
return nil, secoapcore.ErrMessageInvalidVersion
}
return s.Message.MarshalWithEncoder(encoder)
}
func (s *Secoap) Unmarshal(data []byte) (int, error) {
var decoder message.Decoder
if s.Message == nil {
return 0, secoapcore.ErrMessageNil
}
switch s.Version {
case Version0:
decoder = coderv0.DefaultCoder
case Version1:
decoder = coderv1.DefaultCoder
case Version2:
decoder = coderv2.DefaultCoder
default:
return 0, secoapcore.ErrMessageInvalidVersion
}
return s.Message.UnmarshalWithDecoder(decoder, data)
}