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