pdu_sms 1.0.4 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ded42593826dc1cbc98a727b805f371c2b9e93c1
4
- data.tar.gz: d56f79ae6822211b218d1f663c1b80c45c82efbd
2
+ SHA256:
3
+ metadata.gz: 0b004f0aac97f63ae4f480ede59c3bb19f963f64f22676615e75aedd389e9415
4
+ data.tar.gz: 3a870a2ba498b2388e41ad6d99341da77d76a32510b234ca567f16fcb5f71f3b
5
5
  SHA512:
6
- metadata.gz: b59ac288164c2506df1fa4921c9f8c14154d17d042bd0ea00c36e9fa8c7c2792cf28232b0e86d808067c6abbbb21dfb72e1297f2d26a32e3f4c8b9dce74d60e6
7
- data.tar.gz: 78503d67c94631edfcd13110c80c82b908571b4f2da247323f76b29d9c51405ebce03362af85404857b935c3fce80dc7c88d8d273f5a69454bceb7e6a2a43af2
6
+ metadata.gz: '086a47442278f7511e434626227b2533e1d5a5f18b2d96bad89f193aaada6be63b23aa4458a8654a2baf3f3a39d43280f1c744ad35e7580c72f989b33ef219fc'
7
+ data.tar.gz: bd7755153864fb6d814a8ed073f6c303f774d3831395330e635ec63b0f464bf7f3266c8af4f8ae6035bf0eacc4a560a11f2c01b46ab03964c8140b36ae73d4e6
@@ -36,7 +36,7 @@ module PduSms
36
36
 
37
37
  def DataCodingScheme.decode_sc(pdu_str)
38
38
  pdu = '%08b' % DataCodingScheme.cut_off_pdu(pdu_str, :current, :sc).to_i(16)
39
- message_class = (pdu[1].to_i == MESSAGE_CLASS_ON) ? pdu[6..7].to_i(2) : false
39
+ message_class = (pdu[3].to_i == MESSAGE_CLASS_ON) ? pdu[6..7].to_i(2) : false
40
40
  new(:decode_sc, compressed:pdu[2].to_i(2), message_class:message_class, alphabet:pdu[4..5].to_i(2)).freeze
41
41
  end
42
42
 
@@ -55,6 +55,28 @@ module PduSms
55
55
  text
56
56
  end
57
57
 
58
+ def self.decode_7bit_fill_bits(string, udhl)
59
+ message = ''
60
+ if udhl.to_i(16) == UDHL_SIZE_5
61
+ message << ("0%08b" % string[0..1].to_i(16))[0..-2].to_i(2).chr
62
+ message << self.decode_7bit(string[2..-1])
63
+ else
64
+ message << self.decode_7bit(string)
65
+ end
66
+ message
67
+ end
68
+
69
+ def self.encode_7bit_fill_bits(string, udhl)
70
+ message = ''
71
+ if udhl.to_i(16) == UDHL_SIZE_5
72
+ message << '%02X' % ('%07b0' % string[0].ord).to_i(2)
73
+ message << self.encode_7bit(string[1..-1])
74
+ else
75
+ message << self.encode_7bit(string)
76
+ end
77
+ message
78
+ end
79
+
58
80
  def self.encode_8bit(string)
59
81
  string.chars.to_a.collect {|char| '%02X' % char.ord }.join
60
82
  end
@@ -66,3 +88,4 @@ module PduSms
66
88
  end
67
89
  end
68
90
 
91
+
@@ -3,13 +3,13 @@ module PduSms
3
3
 
4
4
  def initialize(message, coding, ied1: false, ied2: false, ied3: false, udhl: false, iei: false, iedl: false)
5
5
  @coding = _check_coding coding
6
- @message = _check_message message, coding, ied1
7
- @ied1 = _check_ied1 ied1, coding
6
+ @ied1 = _check_ied1 ied1
8
7
  @ied2 = _check_ied2 ied2
9
8
  @ied3 = _check_ied3 ied3
10
- @udhl = udhl ? udhl : _check_udhl(coding, ied1)
11
- @iei = iei ? iei : _check_iei(coding, ied1)
12
- @iedl = iedl ? iedl : _check_iedl(coding, ied1)
9
+ @udhl = udhl ? udhl : _check_udhl(ied1)
10
+ @iei = iei ? iei : _check_iei(ied1)
11
+ @iedl = iedl ? iedl : _check_iedl(ied1)
12
+ @message = _check_message message, coding, ied1
13
13
  end
14
14
 
15
15
  def UserData.encode_ms(message, coding=:auto)
@@ -18,21 +18,19 @@ module PduSms
18
18
  if coding == ALPHABET_7BIT
19
19
  if message.length > 160
20
20
  message_array = message.scan(/.{1,152}/)
21
- ied1 = rand(65536)
22
21
  end
23
22
  elsif coding == ALPHABET_8BIT
24
23
  if message.length > 140
25
24
  message_array = message.scan(/.{1,133}/)
26
- ied1 = rand(65536)
27
25
  end
28
26
  elsif coding == ALPHABET_16BIT
29
27
  if message.length > 70
30
28
  message_array = message.scan(/.{1,67}/)
31
- ied1 = rand(256)
32
29
  end
33
30
  else
34
31
  raise ArgumentError, 'The "coding" is incorrect'
35
32
  end
33
+ ied1 = '%02X' % rand(255)
36
34
  message_array.collect.each_with_index do |mess, current_message|
37
35
  if message_array.length > 1
38
36
  new(mess, coding, ied1:ied1, ied2:message_array.length, ied3:current_message+1).freeze
@@ -47,7 +45,11 @@ module PduSms
47
45
  dcs = DataCodingScheme.decode_ms(pdu_str)
48
46
  if dcs.alphabet_7bit?
49
47
  coding = dcs.get_alphabet.to_i(2)
50
- message = Helpers.decode_7bit(message)
48
+ if header.empty?
49
+ message = Helpers.decode_7bit(message)
50
+ else
51
+ message = Helpers.decode_7bit_fill_bits(message, header[0..1])
52
+ end
51
53
  elsif dcs.alphabet_8bit?
52
54
  coding = dcs.get_alphabet.to_i(2)
53
55
  message = Helpers.decode_8bit(message)
@@ -60,10 +62,12 @@ module PduSms
60
62
  if header.empty?
61
63
  new(message, coding).freeze
62
64
  else
63
- if header[4..5].to_i(16) == 4
64
- new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9].to_i(16), ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
65
- elsif header[4..5].to_i(16) == 3
66
- new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7].to_i(16), ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
65
+ if header[0..1].to_i(16) == UDHL_SIZE_6
66
+ new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
67
+ elsif header[0..1].to_i(16) == UDHL_SIZE_5
68
+ new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
69
+ else
70
+ new(message, coding).freeze
67
71
  end
68
72
  end
69
73
  end
@@ -77,7 +81,11 @@ module PduSms
77
81
  dcs = DataCodingScheme.decode_sc(pdu_str)
78
82
  if dcs.alphabet_7bit?
79
83
  coding = dcs.get_alphabet.to_i(2)
80
- message = Helpers.decode_7bit(message)
84
+ if header.empty?
85
+ message = Helpers.decode_7bit(message)
86
+ else
87
+ message = Helpers.decode_7bit_fill_bits(message, header[0..1])
88
+ end
81
89
  elsif dcs.alphabet_8bit?
82
90
  coding = dcs.get_alphabet.to_i(2)
83
91
  message = Helpers.decode_8bit(message)
@@ -90,10 +98,12 @@ module PduSms
90
98
  if header.empty?
91
99
  new(message, coding).freeze
92
100
  else
93
- if header[4..5].to_i(16) == 4
94
- new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9].to_i(16), ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
95
- elsif header[4..5].to_i(16) == 3
96
- new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7].to_i(16), ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
101
+ if header[0..1].to_i(16) == UDHL_SIZE_6
102
+ new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..9], ied2: header[10..11].to_i(16), ied3: header[12..13].to_i(16)).freeze
103
+ elsif header[0..1].to_i(16) == UDHL_SIZE_5
104
+ new(message, coding, udhl: header[0..1].to_i(16), iei: header[2..3].to_i(16), iedl: header[4..5].to_i(16), ied1: header[6..7], ied2: header[8..9].to_i(16), ied3: header[10..11].to_i(16)).freeze
105
+ else
106
+ new(message, coding).freeze
97
107
  end
98
108
  end
99
109
  end
@@ -138,12 +148,7 @@ module PduSms
138
148
 
139
149
  def get_ied1
140
150
  return '' unless @ied1
141
- case @coding
142
- when ALPHABET_7BIT then '%04X' % @ied1
143
- when ALPHABET_8BIT then '%04X' % @ied1
144
- when ALPHABET_16BIT then '%02X' % @ied1
145
- else raise 'unknown encoding'
146
- end
151
+ @ied1
147
152
  end
148
153
 
149
154
  def get_ied2
@@ -172,13 +177,12 @@ module PduSms
172
177
  end
173
178
 
174
179
  def get_hex
175
- message = case @coding
176
- when ALPHABET_7BIT
177
- Helpers.encode_7bit(@message)
178
- when ALPHABET_8BIT
179
- Helpers.encode_8bit(@message)
180
- when ALPHABET_16BIT
181
- Helpers.encode_ucs2(@message)
180
+ if @coding == ALPHABET_7BIT
181
+ message =Helpers.encode_7bit_fill_bits(@message, get_udhl)
182
+ elsif @coding == ALPHABET_8BIT
183
+ message =Helpers.encode_8bit(@message)
184
+ else
185
+ message =Helpers.encode_ucs2(@message)
182
186
  end
183
187
  '%s%s%s%s%s%s%s' % [get_udhl, get_iei, get_iedl, get_ied1, get_ied2, get_ied3, message]
184
188
  end
@@ -205,18 +209,9 @@ module PduSms
205
209
  coding
206
210
  end
207
211
 
208
- def _check_ied1(ied1, coding)
212
+ def _check_ied1(ied1)
209
213
  return false unless ied1
210
- case coding
211
- when ALPHABET_7BIT
212
- raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1)
213
- when ALPHABET_8BIT
214
- raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1)
215
- when ALPHABET_16BIT
216
- raise ArgumentError, 'The message is too long' unless (0..255).include?(ied1)
217
- else
218
- false
219
- end
214
+ raise ArgumentError, 'The message is too long' unless (0..65535).include?(ied1.to_i(16))
220
215
  ied1
221
216
  end
222
217
 
@@ -230,47 +225,38 @@ module PduSms
230
225
  ied3
231
226
  end
232
227
 
233
- def _check_udhl(coding, ied1)
228
+ def _check_udhl(ied1)
234
229
  return false unless ied1
235
- case coding
236
- when ALPHABET_7BIT
237
- 0x06
238
- when ALPHABET_8BIT
239
- 0x06
240
- when ALPHABET_16BIT
241
- 0x05
242
- else
243
- false
230
+ if ied1.length == 2
231
+ UDHL_SIZE_5
232
+ elsif ied1.length == 4
233
+ UDHL_SIZE_6
234
+ else
235
+ false
244
236
  end
245
237
  end
246
238
 
247
- def _check_iei(coding, ied1)
239
+ def _check_iei(ied1)
248
240
  return false unless ied1
249
- case coding
250
- when ALPHABET_7BIT
251
- 0x08
252
- when ALPHABET_8BIT
253
- 0x08
254
- when ALPHABET_16BIT
255
- 0x00
256
- else
257
- false
241
+ if ied1.length == 2
242
+ 0x00
243
+ elsif ied1.length == 4
244
+ 0x08
245
+ else
246
+ false
258
247
  end
259
248
  end
260
249
 
261
- def _check_iedl(coding, ied1)
250
+ def _check_iedl(ied1)
262
251
  return false unless ied1
263
- case coding
264
- when ALPHABET_7BIT
265
- 0x04
266
- when ALPHABET_8BIT
267
- 0x04
268
- when ALPHABET_16BIT
269
- 0x03
270
- else
271
- false
252
+ if ied1.length == 2
253
+ 0x03
254
+ elsif ied1.length == 4
255
+ 0x04
256
+ else
257
+ false
272
258
  end
273
259
  end
274
260
 
275
261
  end
276
- end
262
+ end
@@ -1,3 +1,3 @@
1
1
  module PduSms
2
- VERSION = "1.0.4"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/pdu_sms.rb CHANGED
@@ -93,6 +93,9 @@ module PduSms
93
93
  STATUS_REPORT_INDICATION_0 = 0b0 # A status report will not be returned to the SME
94
94
  STATUS_REPORT_INDICATION_1 = 0b1 # A status report will be returned to the SME
95
95
 
96
+ UDHL_SIZE_5 = 0b0000101
97
+ UDHL_SIZE_6 = 0b0000110
98
+
96
99
  end
97
100
 
98
101
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdu_sms
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikhail Stolyarov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-08-15 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  requirements: []
107
107
  rubyforge_project:
108
- rubygems_version: 2.5.1
108
+ rubygems_version: 2.7.6
109
109
  signing_key:
110
110
  specification_version: 4
111
111
  summary: PDU SMS coding and decoding library