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 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)
@@ -10,6 +10,7 @@ module Codec
10
10
  end
11
11
 
12
12
  def encode(field)
13
+ return "" if field.empty?
13
14
  subfields = field.get_value
14
15
  composed_encoder = subfields.zip(@subCodecs).collect {|sf,sc|
15
16
  if sf.get_id != sc.first
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
- raise "Error can not set value that is instance of Array" if value.kind_of? Array
43
- @value = value
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
@@ -0,0 +1,5 @@
1
+ module Codec
2
+ Logger = Log4r::Logger.new 'codec_logger'
3
+ Logger.outputters = Log4r::Outputter.stderr
4
+ Logger.level=Log4r::INFO
5
+ end
data/lib/codec/packed.rb CHANGED
@@ -4,7 +4,7 @@ module Codec
4
4
  ((length + 1) / 2)
5
5
  end
6
6
 
7
- def eval_pck_length(field)
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.encode(field)
47
- length = @length_codec.encode(Field.new.set_value(val.length))
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
- content = @value_codec.encode(field.get_sub_field(@value_codec.id))
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
- # TOFIX: No more working after field refactoring due
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("Error on parsing tag for TLV with following data [#{buffer.unpack("H*").first}]")
42
+ val.set_value("[#{buffer.unpack("H*").first}]")
40
43
  msg.add_sub_field(val)
41
- return msg
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
@@ -1,3 +1,3 @@
1
1
  module Codec
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -13,7 +13,7 @@ describe Codec::Packed do
13
13
  end
14
14
 
15
15
  it "must retrieve field length" do
16
- subject.eval_pck_length(@f_pck).must_equal(6)
16
+ subject.get_length(@f_pck).must_equal(6)
17
17
  end
18
18
 
19
19
  end
@@ -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.5
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