Skip to content

Commit 3a25074

Browse files
cornyxlab
authored andcommitted
Fix user data encoding for SMS
Use utf8.RuneCountInString to count characters
1 parent 45b38e5 commit 3a25074

File tree

3 files changed

+33
-46
lines changed

3 files changed

+33
-46
lines changed

at.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -424,13 +424,11 @@ func (d *Device) SendSMS(text string, address sms.PhoneNumber) (err error) {
424424
VPFormat: sms.ValidityPeriodFormats.Relative,
425425
VP: sms.ValidityPeriod(24 * time.Hour * 4),
426426
}
427-
for _, w := range text {
428-
// detected a double-width char
429-
if w > 1 {
430-
msg.Encoding = sms.Encodings.UCS2
431-
break
432-
}
427+
428+
if !pdu.Is7BitEncodable(text) {
429+
msg.Encoding = sms.Encodings.UCS2
433430
}
431+
434432
n, octets, err := msg.PDU()
435433
if err != nil {
436434
return

sms/sms.go

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"bytes"
66
"errors"
77
"io"
8+
"unicode/utf8"
89

910
"github.com/xlab/at/pdu"
1011
)
@@ -119,20 +120,11 @@ func (s *Message) encodeDeliver(buf *bytes.Buffer) (n int, err error) {
119120
sms.ProtocolIdentifier = 0x00 // Short Message Type 0
120121
sms.DataCodingScheme = byte(s.Encoding)
121122
sms.ServiceCentreTimestamp = s.ServiceCenterTime.PDU()
122-
123-
var userData []byte
124-
switch s.Encoding {
125-
case Encodings.Gsm7Bit, Encodings.Gsm7Bit_2:
126-
userData = pdu.Encode7Bit(s.Text)
127-
sms.UserDataLength = byte(len(s.Text))
128-
case Encodings.UCS2:
129-
userData = pdu.EncodeUcs2(s.Text)
130-
sms.UserDataLength = byte(len(userData))
131-
default:
132-
return 0, ErrUnknownEncoding
123+
sms.UserData, sms.UserDataLength, err = s.encodedUserData()
124+
if err != nil {
125+
return 0, err
133126
}
134127

135-
sms.UserData = userData
136128
return buf.Write(sms.Bytes())
137129
}
138130

@@ -165,19 +157,10 @@ func (s *Message) encodeSubmit(buf *bytes.Buffer) (n int, err error) {
165157
return 0, ErrNonRelative
166158
}
167159

168-
var userData []byte
169-
switch s.Encoding {
170-
case Encodings.Gsm7Bit, Encodings.Gsm7Bit_2:
171-
userData = pdu.Encode7Bit(s.Text)
172-
sms.UserDataLength = byte(len(s.Text))
173-
case Encodings.UCS2:
174-
userData = pdu.EncodeUcs2(s.Text)
175-
sms.UserDataLength = byte(len(userData))
176-
default:
177-
return 0, ErrUnknownEncoding
160+
sms.UserData, sms.UserDataLength, err = s.encodedUserData()
161+
if err != nil {
162+
return 0, err
178163
}
179-
180-
sms.UserData = userData
181164
return buf.Write(sms.Bytes())
182165
}
183166

@@ -202,20 +185,11 @@ func (s *Message) encodeStatusReport(buf *bytes.Buffer) (n int, err error) {
202185
sms.ServiceCentreTimestamp = s.ServiceCenterTime.PDU()
203186
sms.DischargeTimestamp = s.DischargeTime.PDU()
204187
sms.Status = byte(s.Status)
205-
206-
var userData []byte
207-
switch s.Encoding {
208-
case Encodings.Gsm7Bit, Encodings.Gsm7Bit_2:
209-
userData = pdu.Encode7Bit(s.Text)
210-
sms.UserDataLength = byte(len(s.Text))
211-
case Encodings.UCS2:
212-
userData = pdu.EncodeUcs2(s.Text)
213-
sms.UserDataLength = byte(len(userData))
214-
default:
215-
return 0, ErrUnknownEncoding
188+
sms.UserData, sms.UserDataLength, err = s.encodedUserData()
189+
if err != nil {
190+
return 0, err
216191
}
217192

218-
sms.UserData = userData
219193
return buf.Write(sms.Bytes())
220194
}
221195

@@ -345,6 +319,21 @@ func (s *Message) decodeStatusReport(data []byte) (n int, err error) {
345319
return n, err
346320
}
347321

322+
func (s *Message) encodedUserData() (userData []byte, length byte, err error) {
323+
switch s.Encoding {
324+
case Encodings.Gsm7Bit, Encodings.Gsm7Bit_2:
325+
userData = pdu.Encode7Bit(s.Text)
326+
length = byte(utf8.RuneCountInString(s.Text))
327+
case Encodings.UCS2:
328+
userData = pdu.EncodeUcs2(s.Text)
329+
length = byte(len(userData))
330+
default:
331+
err = ErrUnknownEncoding
332+
}
333+
334+
return
335+
}
336+
348337
func (s *Message) decodeUserData(data []byte, dataLen byte) (err error) {
349338
switch s.Encoding {
350339
case Encodings.Gsm7Bit, Encodings.Gsm7Bit_2:

sms/sms_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ var (
2020
"003200200440043004370430002E0020041F043E0441043B04350434043D043804390020002D" +
2121
"002000200032003600200438044E043D044F00200432002000320031003A00330035"
2222

23-
pduDeliverGsm7 = "07919762020033F1040B919762995696F0000041606291401561046379180E"
24-
pduSubmitGsm7 = "07919762020033F111000B919762995696F00000AA046379180E"
23+
pduDeliverGsm7 = "07919762020033F1040B919762995696F0000041606291401561066379180E8200"
24+
pduSubmitGsm7 = "07919762020033F111000B919762995696F00000AA066379180E8200"
2525
pduDeliverGsm7_2 = "0791551010010201040D91551699296568F80011719022124215293DD4B71C5E26BF" +
2626
"41D3E6145476D3E5E573BD0C82BF40B59A2D96CBE564351BCE8603A164319D8CA6ABD540E432482673C172AED82DE502"
2727

@@ -38,7 +38,7 @@ var (
3838
ServiceCenterTime: parseTimestamp("2014-06-26T21:36:30+04:00"),
3939
}
4040
smsDeliverGsm7 = Message{
41-
Text: "crap",
41+
Text: "crap Δ",
4242
Encoding: Encodings.Gsm7Bit,
4343
Type: MessageTypes.Deliver,
4444
Address: "+79269965690",
@@ -63,7 +63,7 @@ var (
6363
VPFormat: ValidityPeriodFormats.Relative,
6464
}
6565
smsSubmitGsm7 = Message{
66-
Text: "crap",
66+
Text: "crap Δ",
6767
Encoding: Encodings.Gsm7Bit,
6868
Type: MessageTypes.Submit,
6969
Address: "+79269965690",

0 commit comments

Comments
 (0)