forked from qaz9877/go-smpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmessage.go
97 lines (89 loc) · 2.25 KB
/
message.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
package pdu
import (
"bufio"
"bytes"
"encoding/hex"
"io"
"reflect"
. "github.com/M2MGateway/go-smpp/coding"
)
type ShortMessage struct {
DefaultMessageID byte // see SMPP v5, section 4.7.27 (134p)
DataCoding DataCoding
UDHeader UserDataHeader
Message []byte
}
func (p *ShortMessage) ReadFrom(r io.Reader) (n int64, err error) {
buf := bufio.NewReader(r)
if p.DataCoding != NoCoding {
coding, _ := buf.ReadByte()
p.DataCoding = DataCoding(coding)
}
p.DefaultMessageID, err = buf.ReadByte()
if err == nil {
var length byte
if length, err = buf.ReadByte(); err == nil && p.UDHeader != nil {
_, err = p.UDHeader.ReadFrom(buf)
}
if err == nil {
p.Message = make([]byte, length-byte(p.UDHeader.Len()))
_, err = buf.Read(p.Message)
}
}
return
}
func (p ShortMessage) WriteTo(w io.Writer) (n int64, err error) {
if len(p.Message) > MaxShortMessageLength {
err = ErrShortMessageTooLarge
return
}
var buf bytes.Buffer
if p.DataCoding != NoCoding {
buf.WriteByte(byte(p.DataCoding))
}
buf.WriteByte(p.DefaultMessageID)
start := buf.Len()
buf.WriteByte(0)
_, err = p.UDHeader.WriteTo(&buf)
if err != nil {
return
}
buf.Write(p.Message)
data := buf.Bytes()
data[start] = byte(len(data) - 1 - start)
return buf.WriteTo(w)
}
func (p *ShortMessage) Prepare(pdu any) {
if _, ok := pdu.(*ReplaceSM); ok {
p.DataCoding = NoCoding
} else if p.UDHeader == nil {
t := reflect.ValueOf(pdu).Elem()
target := reflect.TypeOf(ESMClass{})
v := t.FieldByNameFunc(func(name string) bool { return t.FieldByName(name).Type() == target })
if v.IsValid() && v.Interface().(ESMClass).UDHIndicator {
p.UDHeader = UserDataHeader{}
}
}
}
func (p *ShortMessage) Parse() (message string, err error) {
encoder := p.DataCoding.Encoding()
if encoder == nil {
message = hex.EncodeToString(p.Message)
return
}
decoded, err := encoder.NewDecoder().Bytes(p.Message)
message = string(decoded)
return
}
func (p *ShortMessage) Compose(input string) (err error) {
coding := BestCoding(input)
if coding.Splitter().Len(input) > MaxShortMessageLength {
return ErrShortMessageTooLarge
}
message, err := coding.Encoding().NewEncoder().Bytes([]byte(input))
if err == nil {
p.DataCoding = coding
p.Message = message
}
return
}