pdu_tools 0.0.3 → 0.0.4

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
2
  SHA1:
3
- metadata.gz: 06ded51dcb3fdfb9d87daaef9a8c02ef5e19de63
4
- data.tar.gz: 3efee7cc8d604557a5fa21a1d4df903d91a4d530
3
+ metadata.gz: 564211a12edbbb42d58ae7a4967ac4c25878de32
4
+ data.tar.gz: b545e9753a5fa9b8a6202438871bec369eda7e78
5
5
  SHA512:
6
- metadata.gz: fb25dcbe8ac3bdb520903503e76b2fe6737e1440cc3ba4b9db71afed3047c3307ba7aa84b8cbba4155d12a01c142d673fc7156a8977416183d761105a725b0db
7
- data.tar.gz: ed46a7682758a220c4b26ce19611b2f93327f7b4d04768faabeea086b38b51d7c4380abd36d785bc96a2168755ddbe10d6100558d0536a7831a016863efcc469
6
+ metadata.gz: a6513a79545ecb47ca44a96c4674df0c31bbef3f7892709e3ad32f4b0f7e9989a2563ee8989212e535cf758bbbf16152c3f6ff87bba58e1fca0dd337703a2907
7
+ data.tar.gz: fd22e56c43f68f9b5e190542242aa1fe27e6d31fd8777d5d794551f1f26d19c6020bf0d0b41a23167a0555139f6b390c635a3ca93003eb694fb98f4c3cc9b433
@@ -4,7 +4,7 @@ module PDUTools
4
4
  include Helpers
5
5
  # http://read.pudn.com/downloads150/sourcecode/embed/646395/Short%20Message%20in%20PDU%20Encoding.pdf
6
6
  def initialize pdu_hex, direction=:sc_to_ms
7
- @pdu_hex = pdu_hex
7
+ @pdu_hex = pdu_hex.dup
8
8
  @direction = direction
9
9
  end
10
10
 
@@ -18,6 +18,9 @@ module PDUTools
18
18
  @message_reference = take(2) if @pdu_type[:mti] == :sms_submit
19
19
  @address_length = take(2, :integer)
20
20
  @address_type = parse_address_type take(2)
21
+ if [:national, :international].include? @address_type
22
+ @address_length = @address_length.odd? ? @address_length + 1 : @address_length # Always take byte aligned - hexdecimal F is added when odd number
23
+ end
21
24
  @address = parse_address take(@address_length), @address_type, @address_length
22
25
  @pid = take(2)
23
26
  @data_coding_scheme = parse_data_coding_scheme take(2, :binary)
@@ -78,7 +81,7 @@ module PDUTools
78
81
 
79
82
  def parse_address address, type, length
80
83
  if type == :a7bit
81
- address = decode7bit address, length
84
+ address = decode7bit address
82
85
  else
83
86
  address = swapped2normal address
84
87
  if type == :international
@@ -149,6 +152,8 @@ module PDUTools
149
152
  year, month, day, hour, minute, second, zone = swapped2normal(timestamp).split('').in_groups_of(2).collect(&:join)
150
153
  d = "#{year}-#{month}-#{day} #{hour}:#{minute}:#{second} +%02d:00" % (zone.to_i / 4)
151
154
  Time.parse(d)
155
+ rescue
156
+ binding.pry
152
157
  end
153
158
 
154
159
  def parse_validity_period period
@@ -165,6 +170,7 @@ module PDUTools
165
170
  end
166
171
 
167
172
  def parse_user_data data_length
173
+ @offset_7bit = 1
168
174
  if @pdu_type[:udhi]
169
175
  @udh_length = take(2, :integer) * 2
170
176
  udh = take(@udh_length)
@@ -172,11 +178,11 @@ module PDUTools
172
178
  end
173
179
  case @data_coding_scheme[:alphabet]
174
180
  when :a7bit
175
- @message = decode7bit @pdu_hex, data_length
181
+ @message = gsm0338_to_utf8 decode7bit(@pdu_hex, @offset_7bit)
176
182
  when :a8bit
177
- @message = decode8bit @pdu_hex, data_length
183
+ @message = gsm0338_to_utf8 decode8bit(@pdu_hex, data_length)
178
184
  when :a16bit
179
- @message = decode16bit @pdu_hex, data_length
185
+ @message = gsm0338_to_utf8 decode16bit(@pdu_hex, data_length)
180
186
  end
181
187
  end
182
188
 
@@ -186,8 +192,10 @@ module PDUTools
186
192
  case iei
187
193
  when "00"
188
194
  reference = take 2, :integer, header
195
+ @offset_7bit = 0
189
196
  when "08"
190
197
  reference = take 4, :integer, header
198
+ @offset_7bit = 1
191
199
  else
192
200
  binding.pry
193
201
  raise StandardError, "unsupported Information Element Identifier in User Data Header: #{iei}"
@@ -22,6 +22,14 @@ module PDUTools
22
22
  string
23
23
  end
24
24
 
25
+ def gsm0338_to_utf8 string
26
+ GSM_03_38_ESCAPES.each do |replace, find|
27
+ string.gsub! find, replace
28
+ end
29
+ string
30
+ end
31
+
32
+
25
33
  def dec2hexbyte dec
26
34
  "%02X" % dec
27
35
  end
@@ -65,33 +73,34 @@ module PDUTools
65
73
  string.scan(/../).collect(&:reverse).join.gsub(/F$/,'')
66
74
  end
67
75
 
68
- # def decode7bit data, length
69
- # septets = data.to_i(16).to_s(2).split('').in_groups_of(7).collect(&:join)[0,length]
70
- # septets.collect do |s|
71
- # s.to_i(2).chr
72
- # end.join
73
- # end
74
-
75
- def decode7bit textdata, length
76
+ def decode7bit textdata, offset=1
77
+ ret = ""
76
78
  bytes = []
77
79
  textdata.split('').each_slice(2) do |s|
78
80
  bytes << "%08b" % s.join.to_i(16)
79
81
  end
80
- bit = (bytes.size % 7)
81
- bytes.reverse!
82
+
83
+ cur_septet = ""
84
+ next_septet = ""
85
+ last_char = ""
86
+
82
87
  bytes.each_with_index do |byte, index|
83
- if bit == 0 or index == 0
84
- bytes.insert(index, "")
85
- bit = 7 if bit == 0
86
- next
88
+ to_take = ([0,1].include? offset) ? 7 : 8-offset
89
+ cur_septet.prepend byte[offset, to_take]
90
+ next_septet = byte[0,offset] if offset > 0
91
+ ret << cur_septet.to_i(2).chr
92
+
93
+ if offset == 7
94
+ offset = 1
95
+ ret << next_septet.to_i(2).chr
96
+ cur_septet = ""
87
97
  else
88
- bytes[index-1] = "#{bytes[index-1]}#{(bytes[index]||"")[0,bit]}"
89
- bytes[index] = bytes[index][bit..-1] if bytes[index]
90
- bit -= 1
98
+ offset += 1
99
+ cur_septet = next_septet
91
100
  end
101
+ next_septet = nil
92
102
  end
93
- bytes = bytes.reverse.collect{|b| "0#{b}".to_i(2) }.collect{|b| b.zero? ? nil : b }.compact
94
- bytes.collect{|b| b.chr }.join
103
+ ret
95
104
  end
96
105
 
97
106
  def decode8bit data, length
@@ -1,6 +1,9 @@
1
1
  module PDUTools
2
2
  class MessagePart
3
3
  attr_reader :address, :body, :timestamp, :validity_period, :user_data_header
4
+ attr_writer :body
5
+ attr_accessor :metadata
6
+
4
7
  def initialize address, body, timestamp, validity_period, user_data_header
5
8
  @address = address
6
9
  @body = body
data/spec/decoder_spec.rb CHANGED
@@ -42,4 +42,13 @@ describe PDUTools::Decoder do
42
42
  end
43
43
  end
44
44
 
45
+ context "Odd length of address" do
46
+ let(:pdu) { "079124915000303904038109F5000041019022257580A0A8D84B960259C3FAB23B0FD287D761BD3BBD6681DC6190353C07955BED709A0D2AAFDFEE771BE02ED3E7F0F0B8EC9AAF41D6701B247EB3C3207D78CE0EBBC3A032BBBCA6CBDFEEF4781D0699C36B7A5D1E06CDE1EC30DD1D06C966AE18CC2583C5682E1008040281402010080402814020100804028140201008040281402010080402814020100804028140" }
47
+
48
+ it do
49
+ message_part = decoder.decode
50
+ expect(message_part.address).to eq "905"
51
+ end
52
+ end
53
+
45
54
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pdu_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Filip Zachar
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2014-10-06 00:00:00 Z
12
+ date: 2014-10-13 00:00:00 Z
13
13
  dependencies: []
14
14
 
15
15
  description: Tools for encoding and decoding GSM SMS PDUs.