codec 0.0.4 → 0.0.5
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.
- data/lib/codec/bitmap.rb +11 -11
- data/lib/codec/composed.rb +3 -3
- data/lib/codec/field.rb +57 -16
- data/lib/codec/fix.rb +2 -1
- data/lib/codec/prefix.rb +6 -3
- data/lib/codec/tlv.rb +7 -7
- data/lib/codec/version.rb +1 -1
- data/lib/codec.rb +2 -16
- data/test/lib/codec/bitmap_test.rb +9 -16
- data/test/lib/codec/tlv_test.rb +21 -0
- metadata +2 -2
data/lib/codec/bitmap.rb
CHANGED
@@ -44,28 +44,28 @@ module Codec
|
|
44
44
|
def encode(field)
|
45
45
|
fields = field.get_value
|
46
46
|
encoded_fields = []
|
47
|
-
fields_list = fields.collect{|
|
47
|
+
fields_list = fields.collect{|sf| sf.get_id.to_i}
|
48
48
|
# Add field for bitmaps
|
49
49
|
bitmap_fields = @num_extended_bitmaps[0,(fields_list.last - 1) / bitmap_length]
|
50
50
|
fields_list += bitmap_fields
|
51
|
-
fields += bitmap_fields.collect {|id|
|
52
|
-
fields.sort!{|a,b| a.
|
51
|
+
fields += bitmap_fields.collect {|id| Field.new(id)}
|
52
|
+
fields.sort!{|a,b| a.get_id.to_i <=> b.get_id.to_i}
|
53
53
|
# Encode first bitmap
|
54
54
|
out = encode_bitmap(fields_list,0)
|
55
55
|
bitmap_index = 1
|
56
|
-
fields.each do |
|
57
|
-
codec = @subCodecs[
|
58
|
-
if @num_extended_bitmaps.include?(
|
56
|
+
fields.each do |sf|
|
57
|
+
codec = @subCodecs[sf.get_id]
|
58
|
+
if @num_extended_bitmaps.include?(sf.get_id)
|
59
59
|
out += encode_bitmap(fields_list,bitmap_index)
|
60
60
|
bitmap_index += 1
|
61
61
|
elsif codec.nil?
|
62
|
-
raise EncodingException, "unknown codec for subfield #{
|
63
|
-
elsif encoded_fields.include?(
|
64
|
-
raise EncodingException, "Multiple subfield #{
|
62
|
+
raise EncodingException, "unknown codec for subfield #{sf.get_id}"
|
63
|
+
elsif encoded_fields.include?(sf.get_id.to_i)
|
64
|
+
raise EncodingException, "Multiple subfield #{sf.get_id} is invalid for Codec::Bitmap"
|
65
65
|
else
|
66
66
|
out += codec.encode(sf)
|
67
67
|
end
|
68
|
-
encoded_fields <<
|
68
|
+
encoded_fields << sf.get_id.to_i
|
69
69
|
end
|
70
70
|
return out
|
71
71
|
end
|
@@ -99,4 +99,4 @@ module Codec
|
|
99
99
|
return msg,buf
|
100
100
|
end
|
101
101
|
end
|
102
|
-
end
|
102
|
+
end
|
data/lib/codec/composed.rb
CHANGED
@@ -12,10 +12,10 @@ module Codec
|
|
12
12
|
def encode(field)
|
13
13
|
subfields = field.get_value
|
14
14
|
composed_encoder = subfields.zip(@subCodecs).collect {|sf,sc|
|
15
|
-
if sf.
|
15
|
+
if sf.get_id != sc.first
|
16
16
|
raise EncodingException, "subfield #{sf.first} not correspond to subcodec #{sc.first}"
|
17
17
|
end
|
18
|
-
[sc.last,sf
|
18
|
+
[sc.last,sf]
|
19
19
|
}
|
20
20
|
out = ""
|
21
21
|
composed_encoder.each do |subcodec,subfield|
|
@@ -80,4 +80,4 @@ module Codec
|
|
80
80
|
super(field)
|
81
81
|
end
|
82
82
|
end
|
83
|
-
end
|
83
|
+
end
|
data/lib/codec/field.rb
CHANGED
@@ -14,27 +14,29 @@ module Codec
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.from_array(id,fields_array)
|
17
|
-
f = Field.new(id)
|
18
|
-
fields_array.each do |id,value|
|
19
|
-
if value.kind_of?(Array)
|
20
|
-
sf = Field.from_array(id,value)
|
21
|
-
else
|
22
|
-
sf = Field.new(id,value)
|
23
|
-
end
|
24
|
-
f.add_sub_field(sf)
|
25
|
-
end
|
17
|
+
f = Field.new(id,fields_array)
|
26
18
|
return f
|
27
19
|
end
|
28
20
|
|
29
21
|
def ==(other)
|
30
|
-
(@id == other.
|
22
|
+
(@id == other.id && @value == other.value)
|
31
23
|
end
|
32
24
|
|
33
25
|
def get_id ; @id; end
|
34
26
|
|
35
27
|
def set_id id ; @id = id ; end
|
36
28
|
|
37
|
-
def get_value
|
29
|
+
def get_value
|
30
|
+
if @value.kind_of?(Array)
|
31
|
+
v = []
|
32
|
+
@value.each{|id,value|
|
33
|
+
v << Field.new(id,value)
|
34
|
+
}
|
35
|
+
return v
|
36
|
+
else
|
37
|
+
return @value
|
38
|
+
end
|
39
|
+
end
|
38
40
|
|
39
41
|
def set_value(value)
|
40
42
|
raise "Error can not set value that is instance of Array" if value.kind_of? Array
|
@@ -45,7 +47,7 @@ module Codec
|
|
45
47
|
def add_sub_field(sf)
|
46
48
|
@value = [] if @value == ""
|
47
49
|
raise "Add impossible on not Array valued field" unless @value.kind_of? Array
|
48
|
-
@value << [sf.
|
50
|
+
@value << [sf.id,sf.value]
|
49
51
|
end
|
50
52
|
|
51
53
|
def get_sf_recursivly(ids)
|
@@ -59,11 +61,45 @@ module Codec
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
|
64
|
+
def search(path,separator='.')
|
65
|
+
get_sf_recursivly(path.split(separator))
|
66
|
+
end
|
67
|
+
|
62
68
|
def get_deep_field(path,separator='.')
|
63
69
|
get_sf_recursivly(path.split(separator))
|
64
70
|
end
|
65
71
|
|
66
|
-
|
72
|
+
def set_node(value,new_value,path_ids)
|
73
|
+
is_set = false
|
74
|
+
value = value.collect{|id,val|
|
75
|
+
if id != path_ids.first
|
76
|
+
[id,val]
|
77
|
+
else
|
78
|
+
is_set = true
|
79
|
+
if path_ids.size == 1
|
80
|
+
[id,new_value]
|
81
|
+
else
|
82
|
+
[id,set_node(val,new_value,path_ids.slice(1,path_ids.size))]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
}
|
86
|
+
unless is_set
|
87
|
+
if path_ids.size == 1
|
88
|
+
value << [path_ids.first,new_value]
|
89
|
+
else
|
90
|
+
value << [path_ids.first,set_node_rec([],new_value,
|
91
|
+
path_ids.slice(1,path_ids.size))]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
return value
|
95
|
+
end
|
96
|
+
|
97
|
+
def set_deep_field(sf,path,separator='.')
|
98
|
+
@value = set_node(@value,sf.value,path.split(separator))
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
def get_sub_field(id)
|
67
103
|
sf_rec = get_sub_fields(id)
|
68
104
|
if sf_rec.nil?
|
69
105
|
return NilField.new
|
@@ -79,8 +115,12 @@ module Codec
|
|
79
115
|
sf_rec = @value.select{|v| v.first == id}.collect{|v| v.last}
|
80
116
|
if sf_rec == []
|
81
117
|
return NilField.new
|
82
|
-
|
83
|
-
return sf_rec
|
118
|
+
elsif sf_rec.size == 1
|
119
|
+
return [Field.new(id,sf_rec.first)]
|
120
|
+
else
|
121
|
+
sfs = []
|
122
|
+
sf_rec.each{|v| sfs << Field.new(id,v)}
|
123
|
+
return sfs
|
84
124
|
end
|
85
125
|
end
|
86
126
|
|
@@ -95,6 +135,7 @@ module Codec
|
|
95
135
|
else
|
96
136
|
tab + @id + ": " + @value.to_s + "\n"
|
97
137
|
end
|
98
|
-
end
|
138
|
+
end
|
139
|
+
attr_reader :id,:value
|
99
140
|
end
|
100
141
|
end
|
data/lib/codec/fix.rb
CHANGED
data/lib/codec/prefix.rb
CHANGED
@@ -91,11 +91,14 @@ module Codec
|
|
91
91
|
head_field = field.get_sub_field(@length_codec.id)
|
92
92
|
length_field = head_field.get_deep_field(@path,@separator)
|
93
93
|
if length_field.nil?
|
94
|
-
raise EncodingException,"Length field #{@path} is not present in
|
95
|
-
|
94
|
+
raise EncodingException,"Length field #{@path} is not present in
|
95
|
+
header for encoding #{@id} => #{field.to_yaml}"
|
96
96
|
end
|
97
97
|
# update length field in header
|
98
|
+
# TOFIX: No more working after field refactoring due
|
99
|
+
# => need to implement set_deep_field
|
98
100
|
length_field.set_value(content.length)
|
101
|
+
head_field.set_deep_field(length_field,@path,@separator)
|
99
102
|
# encode header
|
100
103
|
header = @length_codec.encode(head_field)
|
101
104
|
return header + content
|
@@ -133,4 +136,4 @@ module Codec
|
|
133
136
|
return out
|
134
137
|
end
|
135
138
|
end
|
136
|
-
end
|
139
|
+
end
|
data/lib/codec/tlv.rb
CHANGED
@@ -16,10 +16,10 @@ module Codec
|
|
16
16
|
def encode(field)
|
17
17
|
out = ""
|
18
18
|
fields = field.get_value
|
19
|
-
fields.each do |
|
20
|
-
out += @tag_codec.encode(Field.new(
|
21
|
-
if @subCodecs[
|
22
|
-
content = @subCodecs[
|
19
|
+
fields.each do |sf|
|
20
|
+
out += @tag_codec.encode(Field.new('*',sf.get_id))
|
21
|
+
if @subCodecs[sf.get_id]
|
22
|
+
content = @subCodecs[sf.get_id].encode(sf)
|
23
23
|
length_buffer = @length_codec.encode(Field.new('*',content.length))
|
24
24
|
out += length_buffer + content
|
25
25
|
else
|
@@ -164,13 +164,13 @@ module Codec
|
|
164
164
|
|
165
165
|
while subfields.size > 0
|
166
166
|
subfield = subfields.shift
|
167
|
-
out += tag_encode(subfield.
|
167
|
+
out += tag_encode(subfield.get_id)
|
168
168
|
# TODO : Handle value that is not String
|
169
|
-
value = value_encode(subfield.
|
169
|
+
value = value_encode(subfield.get_value)
|
170
170
|
out += length_encode(value.length)
|
171
171
|
out += value
|
172
172
|
end
|
173
173
|
return out
|
174
174
|
end
|
175
175
|
end
|
176
|
-
end
|
176
|
+
end
|
data/lib/codec/version.rb
CHANGED
data/lib/codec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'log4r'
|
2
2
|
require 'codec/version'
|
3
|
+
require 'codec/logger'
|
3
4
|
require 'codec/field'
|
4
5
|
require 'codec/exceptions'
|
5
6
|
require 'codec/base'
|
@@ -11,20 +12,5 @@ require 'codec/bitmap'
|
|
11
12
|
require 'codec/tlv'
|
12
13
|
|
13
14
|
module Codec
|
14
|
-
|
15
|
-
Logger = Log4r::Logger.new 'parserLog'
|
16
|
-
Logger.outputters = Log4r::Outputter.stderr
|
17
|
-
Logger.level=Log4r::INFO
|
18
|
-
protocols = []
|
19
|
-
|
20
|
-
if defined?(CODEC_CONST).nil?
|
21
|
-
CODEC_CONST = true
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
def self.register_protocol(protocol)
|
26
|
-
protocols << protocol
|
27
|
-
return protocols
|
28
|
-
end
|
29
|
-
|
15
|
+
# TODO : here implements Module constants and methods
|
30
16
|
end
|
@@ -10,6 +10,7 @@ describe Codec::Bitmap do
|
|
10
10
|
subject.add_sub_codec('3', Codec::String.new('*',3))
|
11
11
|
subject.add_sub_codec('15', Codec::Numbin.new('*',2))
|
12
12
|
@buffer = ["1100000000000010","012ABCDE","0012"].pack("B*A*H*")
|
13
|
+
@field = Codec::Field.from_array('Bitmap',[['1',12],['2','ABCDE'],['15',18]])
|
13
14
|
end
|
14
15
|
|
15
16
|
it "must be a BaseComposed codec" do
|
@@ -17,10 +18,7 @@ describe Codec::Bitmap do
|
|
17
18
|
end
|
18
19
|
|
19
20
|
it "must generate composed field from buffer" do
|
20
|
-
subject.decode(@buffer).first.
|
21
|
-
get_value.collect{ |id,f|
|
22
|
-
[id,f.get_value]
|
23
|
-
}.must_equal([['1',12],['2',"ABCDE"],['15',18]])
|
21
|
+
subject.decode(@buffer).first.must_equal(@field)
|
24
22
|
end
|
25
23
|
|
26
24
|
end
|
@@ -37,9 +35,10 @@ describe Codec::Bitmap do
|
|
37
35
|
subject.add_sub_codec('18', Codec::Numbin.new('*',2))
|
38
36
|
subject.add_sub_codec('21', Codec::String.new('*',5))
|
39
37
|
@buffer_1 = ["11000000000000000100100000000000","012","0012","ABCDE"].pack("B*A*H*A*")
|
40
|
-
@
|
38
|
+
@buffer_2 = ["0110000000000000","012","ABCDE"].pack("B*A3A5")
|
41
39
|
@field_1 = Codec::Field.from_array('MultipleBitmap',[['2',12],['18',18],['21',"ABCDE"]])
|
42
|
-
@field_2 = Codec::Field.from_array('MultipleBitmap',[['2',12],['
|
40
|
+
@field_2 = Codec::Field.from_array('MultipleBitmap',[['2',12],['3','ABCDE']])
|
41
|
+
@field_3 = Codec::Field.from_array('MultipleBitmap',[['2',12],['41',18],['21',"ABCDE"]])
|
43
42
|
end
|
44
43
|
|
45
44
|
it "must be a Bitmap codec" do
|
@@ -47,17 +46,11 @@ describe Codec::Bitmap do
|
|
47
46
|
end
|
48
47
|
|
49
48
|
it "must generate composed field from buffer with extended bitmap" do
|
50
|
-
subject.decode(@buffer_1).first.
|
51
|
-
get_value.collect{ |id,f|
|
52
|
-
[id,f.get_value]
|
53
|
-
}.must_equal([['2',12],['18',18],['21',"ABCDE"]])
|
49
|
+
subject.decode(@buffer_1).first.must_equal(@field_1)
|
54
50
|
end
|
55
51
|
|
56
52
|
it "must generate composed field from buffer without extended bitmap" do
|
57
|
-
subject.decode(@
|
58
|
-
get_value.collect{ |id,f|
|
59
|
-
[id,f.get_value]
|
60
|
-
}.must_equal([['2',12],['3',"ABCDE"]])
|
53
|
+
subject.decode(@buffer_2).first.must_equal(@field_2)
|
61
54
|
end
|
62
55
|
|
63
56
|
it "must generate buffer from composed field" do
|
@@ -65,7 +58,7 @@ describe Codec::Bitmap do
|
|
65
58
|
end
|
66
59
|
|
67
60
|
it "must raise Encoding exception if subfield is unknown" do
|
68
|
-
proc { subject.encode(@
|
61
|
+
proc { subject.encode(@field_3) }.must_raise(Codec::EncodingException)
|
69
62
|
end
|
70
63
|
|
71
|
-
end
|
64
|
+
end
|
data/test/lib/codec/tlv_test.rb
CHANGED
@@ -56,7 +56,28 @@ describe Codec::Tlv do
|
|
56
56
|
subject.encode(@field).must_equal(@buffer)
|
57
57
|
end
|
58
58
|
end
|
59
|
+
|
60
|
+
|
61
|
+
describe Codec::Tlv do
|
62
|
+
subject {
|
63
|
+
tag = Codec::Binary.new('T',1)
|
64
|
+
length = Codec::Numbin.new('L',1)
|
65
|
+
value = Codec::Numbin.new('V',0)
|
66
|
+
Codec::Tlv.new('TAG',length,tag,value) }
|
67
|
+
before do
|
68
|
+
@buffer = ["9501009C010181020200"].pack("H*")
|
69
|
+
@field = Codec::Field.from_array('TAG',
|
70
|
+
[['95',0],['9C',1],['81',512]])
|
71
|
+
end
|
59
72
|
|
73
|
+
it "must decode TLV buffer to field" do
|
74
|
+
subject.decode(@buffer).first.must_equal(@field)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "must encode TLV field to buffer" do
|
78
|
+
subject.encode(@field).must_equal(@buffer)
|
79
|
+
end
|
80
|
+
end
|
60
81
|
|
61
82
|
describe Codec::Bertlv do
|
62
83
|
subject { Codec::Bertlv.new('Bertlv') }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|