pdu_tools 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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.