codec 0.0.5 → 0.0.7
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/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
|