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 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{|id,sf| id.to_i}
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| [id,nil]}
52
- fields.sort!{|a,b| a.first.to_i <=> b.first.to_i}
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 |id,sf|
57
- codec = @subCodecs[id]
58
- if @num_extended_bitmaps.include?(id)
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 #{id}"
63
- elsif encoded_fields.include?(id.to_i)
64
- raise EncodingException, "Multiple subfield #{id} is invalid for Codec::Bitmap"
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 << id.to_i
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
@@ -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.first != sc.first
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.last]
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.get_id && @value == other.get_value)
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 ; @value; end
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.get_id,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
- def get_sub_field(id)
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
- else
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
@@ -31,6 +31,7 @@ module Codec
31
31
  end
32
32
  out = out[0,maxlength]
33
33
  end
34
+ out = 0.chr if out == ""
34
35
  return out.reverse
35
36
  end
36
37
  end
@@ -85,4 +86,4 @@ module Codec
85
86
  return out
86
87
  end
87
88
  end
88
- end
89
+ end
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 header for encoding #{@id} =>
95
- #{field.to_yaml}"
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 |id,sf|
20
- out += @tag_codec.encode(Field.new(id,id))
21
- if @subCodecs[id]
22
- content = @subCodecs[id].encode(sf)
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.first)
167
+ out += tag_encode(subfield.get_id)
168
168
  # TODO : Handle value that is not String
169
- value = value_encode(subfield.last.get_value)
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
@@ -1,3 +1,3 @@
1
1
  module Codec
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
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
- @buffer2 = ["0110000000000000","012","ABCDE"].pack("B*A3A5")
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],['41',18],['21',"ABCDE"]])
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(@buffer2).first.
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(@field_2) }.must_raise(Codec::EncodingException)
61
+ proc { subject.encode(@field_3) }.must_raise(Codec::EncodingException)
69
62
  end
70
63
 
71
- end
64
+ end
@@ -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
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-14 00:00:00.000000000 Z
12
+ date: 2013-08-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler