codec 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/codec/base.rb +13 -0
- data/lib/codec/composed.rb +1 -0
- data/lib/codec/field.rb +12 -16
- data/lib/codec/logger.rb +5 -0
- data/lib/codec/packed.rb +5 -1
- data/lib/codec/prefix.rb +5 -11
- data/lib/codec/tlv.rb +9 -4
- data/lib/codec/version.rb +1 -1
- data/test/lib/codec/pckd_test.rb +1 -1
- data/test/lib/codec/prefix_test.rb +29 -0
- metadata +2 -1
data/lib/codec/base.rb
CHANGED
@@ -21,7 +21,20 @@ module Codec
|
|
21
21
|
l = eval_length(buf,@length)
|
22
22
|
return build_field(buf,l),buf[l,buf.length]
|
23
23
|
end
|
24
|
+
|
25
|
+
def encode(field)
|
26
|
+
return field.get_value
|
27
|
+
end
|
28
|
+
|
29
|
+
def encode_with_length(field)
|
30
|
+
buf = encode(field)
|
31
|
+
return buf.length, buf
|
32
|
+
end
|
24
33
|
|
34
|
+
def get_length(field)
|
35
|
+
field.get_value.length
|
36
|
+
end
|
37
|
+
|
25
38
|
def eval_length(buf,length)
|
26
39
|
length = 0 if length.nil?
|
27
40
|
if(length != 0)
|
data/lib/codec/composed.rb
CHANGED
data/lib/codec/field.rb
CHANGED
@@ -13,6 +13,10 @@ module Codec
|
|
13
13
|
@value = value
|
14
14
|
end
|
15
15
|
|
16
|
+
def empty?
|
17
|
+
return true if @value == ""
|
18
|
+
end
|
19
|
+
|
16
20
|
def self.from_array(id,fields_array)
|
17
21
|
f = Field.new(id,fields_array)
|
18
22
|
return f
|
@@ -38,9 +42,13 @@ module Codec
|
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
def set_value(value)
|
42
|
-
|
43
|
-
|
45
|
+
def set_value(value,path = nil,separator =".")
|
46
|
+
if path.nil?
|
47
|
+
raise "Error can not set value that is instance of Array" if value.kind_of? Array
|
48
|
+
@value = value
|
49
|
+
else
|
50
|
+
@value = set_node(@value,value,path.split(separator))
|
51
|
+
end
|
44
52
|
return self
|
45
53
|
end
|
46
54
|
|
@@ -123,19 +131,7 @@ module Codec
|
|
123
131
|
return sfs
|
124
132
|
end
|
125
133
|
end
|
126
|
-
|
127
|
-
def to_yaml(tab="")
|
128
|
-
if @value.kind_of? Array
|
129
|
-
s = tab + @id +": \n"
|
130
|
-
tab += " "
|
131
|
-
@value.each{|v|
|
132
|
-
s += v.last.to_yaml(tab)
|
133
|
-
}
|
134
|
-
return s
|
135
|
-
else
|
136
|
-
tab + @id + ": " + @value.to_s + "\n"
|
137
|
-
end
|
138
|
-
end
|
134
|
+
|
139
135
|
attr_reader :id,:value
|
140
136
|
end
|
141
137
|
end
|
data/lib/codec/logger.rb
ADDED
data/lib/codec/packed.rb
CHANGED
@@ -4,7 +4,7 @@ module Codec
|
|
4
4
|
((length + 1) / 2)
|
5
5
|
end
|
6
6
|
|
7
|
-
def
|
7
|
+
def get_length(field)
|
8
8
|
if @length > 0
|
9
9
|
return @length
|
10
10
|
else
|
@@ -12,6 +12,10 @@ module Codec
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
def encode_with_length(field)
|
16
|
+
return get_length(field),encode(field)
|
17
|
+
end
|
18
|
+
|
15
19
|
def decode_with_length(buf,length)
|
16
20
|
l = eval_length(buf,get_pck_length(length))
|
17
21
|
return build_field(buf,l),buf[l,buf.length]
|
data/lib/codec/prefix.rb
CHANGED
@@ -43,8 +43,8 @@ module Codec
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def encode(field)
|
46
|
-
val = @value_codec.
|
47
|
-
length = @length_codec.encode(Field.new.set_value(
|
46
|
+
l, val = @value_codec.encode_with_length(field)
|
47
|
+
length = @length_codec.encode(Field.new.set_value(l))
|
48
48
|
out = length + val
|
49
49
|
return out
|
50
50
|
end
|
@@ -87,18 +87,12 @@ module Codec
|
|
87
87
|
|
88
88
|
def encode(field)
|
89
89
|
# encode content
|
90
|
-
|
90
|
+
content_field = field.get_sub_field(@value_codec.id)
|
91
|
+
length, content = @value_codec.encode_with_length(content_field)
|
91
92
|
head_field = field.get_sub_field(@length_codec.id)
|
92
93
|
length_field = head_field.get_deep_field(@path,@separator)
|
93
|
-
if length_field.nil?
|
94
|
-
raise EncodingException,"Length field #{@path} is not present in
|
95
|
-
header for encoding #{@id} => #{field.to_yaml}"
|
96
|
-
end
|
97
94
|
# update length field in header
|
98
|
-
|
99
|
-
# => need to implement set_deep_field
|
100
|
-
length_field.set_value(content.length)
|
101
|
-
head_field.set_deep_field(length_field,@path,@separator)
|
95
|
+
head_field.set_value(length,@path,@separator)
|
102
96
|
# encode header
|
103
97
|
header = @length_codec.encode(head_field)
|
104
98
|
return header + content
|
data/lib/codec/tlv.rb
CHANGED
@@ -2,6 +2,9 @@ module Codec
|
|
2
2
|
class Tlv < Prefixedlength
|
3
3
|
def initialize(id,length,header,content)
|
4
4
|
super(id,length,content)
|
5
|
+
unless header.kind_of?(Codec::Base)
|
6
|
+
raise InitializeException," Invalid tag codec for Tlv class"
|
7
|
+
end
|
5
8
|
@tag_codec = header
|
6
9
|
@subCodecs = {}
|
7
10
|
end
|
@@ -9,7 +12,7 @@ module Codec
|
|
9
12
|
def decode_with_length(buf,length)
|
10
13
|
l = eval_length(buf,length)
|
11
14
|
f,r = decode(buf[0,l])
|
12
|
-
Logger.warn("Remain data in a tlv buffer :[#{r.unpack("H*").first}]") if r.length > 0
|
15
|
+
Logger.warn("Remain data in a tlv buffer :[#{r.unpack("H*").first}]") if r.nil? || r.length > 0
|
13
16
|
return f,buf[l,buf.length]
|
14
17
|
end
|
15
18
|
|
@@ -34,11 +37,13 @@ module Codec
|
|
34
37
|
while(buffer.length > 0)
|
35
38
|
begin
|
36
39
|
tag,buffer = @tag_codec.decode(buffer)
|
37
|
-
rescue
|
40
|
+
rescue => e
|
38
41
|
val = Field.new("ERR")
|
39
|
-
val.set_value("
|
42
|
+
val.set_value("[#{buffer.unpack("H*").first}]")
|
40
43
|
msg.add_sub_field(val)
|
41
|
-
|
44
|
+
Logger.error("in #{@id} tlv codec: #{e.message}\n #{e.backtrace.join(10.chr)}")
|
45
|
+
Logger.error("Decoding failed for #{id} : #{msg.to_yaml}")
|
46
|
+
return msg,""
|
42
47
|
end
|
43
48
|
begin
|
44
49
|
if @subCodecs[tag.get_value.to_s].nil?
|
data/lib/codec/version.rb
CHANGED
data/test/lib/codec/pckd_test.rb
CHANGED
@@ -28,6 +28,35 @@ describe Codec::Prefixedlength do
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
describe Codec::Prefixedlength do
|
32
|
+
before do
|
33
|
+
@length = Codec::Numasc.new('length',3)
|
34
|
+
@content = Codec::Strpck.new('content',0)
|
35
|
+
@field = Codec::Field.new
|
36
|
+
@field.set_value("0012AB")
|
37
|
+
@buffer = "006" +["0012AB"].pack("H*")
|
38
|
+
end
|
39
|
+
|
40
|
+
subject { Codec::Prefixedlength.new('Test_lvar',@length,@content) }
|
41
|
+
|
42
|
+
it "must be a Prefixedlength codec" do
|
43
|
+
subject.must_be_instance_of(Codec::Prefixedlength)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "must generate a field with computed value" do
|
47
|
+
subject.decode(@buffer).first.get_value.upcase.must_equal("0012AB")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "must also return remaining data" do
|
51
|
+
subject.decode(@buffer).last.must_equal("")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "must encode value prefixed with length" do
|
55
|
+
subject.encode(@field).must_equal(@buffer)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
31
60
|
describe Codec::Headerlength do
|
32
61
|
before do
|
33
62
|
tag = Codec::Binary.new('T',1)
|
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.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- lib/codec/factory.rb
|
82
82
|
- lib/codec/field.rb
|
83
83
|
- lib/codec/fix.rb
|
84
|
+
- lib/codec/logger.rb
|
84
85
|
- lib/codec/packed.rb
|
85
86
|
- lib/codec/prefix.rb
|
86
87
|
- lib/codec/tlv.rb
|