Class: Codec::BaseComposed
- Inherits:
-
Base
- Object
- Base
- Codec::BaseComposed
show all
- Defined in:
- lib/codec/composed.rb
Instance Method Summary
collapse
Methods inherited from Base
#add_sub_codec, #get_sub_codecs
Constructor Details
#initialize(isComplete = false) ⇒ BaseComposed
3
4
5
6
|
# File 'lib/codec/composed.rb', line 3
def initialize(isComplete = false)
@is_complete = isComplete
@subCodecs = {}
end
|
Instance Method Details
#decode(buf, msg, length = nil) ⇒ Object
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# File 'lib/codec/composed.rb', line 8
def decode(buf,msg, length = nil)
unless length.nil?
Logger.debug {"build composed for [#{buf.unpack("H*").first}] on #{length} bytes for #{msg.get_id} field"}
buf = buf.slice!(0...length)
end
@subCodecs.each{|id,codec|
Logger.debug "Parsing struct field #{msg.get_id} - #{id} with [#{buf.unpack("H*").first}]"
if buf.empty?
Logger.debug "Not enough data to decode #{msg.get_id} : #{id}"
else
f = Field.new(id)
codec.decode(buf,f)
msg.add_sub_field(f)
end
}
unless buf.empty? || length.nil?
f = Field.new("PADDING")
f.set_value(buf.unpack("H*").first)
msg.add_sub_field(f)
end
if @is_complete && msg.get_value.size < @subCodecs.size
raise BufferUnderflow, "Not enough data for parsing Struct #{msg.get_id}"
end
end
|
#encode(buf, field) ⇒ Object
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/codec/composed.rb', line 36
def encode(buf, field)
if @is_complete && @subCodecs.size != field.get_value.size
raise EncodingException, "Not enough subfields to encode #{field.get_id}"
end
return if field.empty?
initial_length = buf.length
subfields = field.get_value
composed_encoder = subfields.zip(@subCodecs).collect {|sf,sc|
if sf.get_id != sc.first
raise EncodingException, "subfield #{sf.first} not correspond to subcodec #{sc.first}"
end
[sc.last,sf]
}
composed_encoder.each do |subcodec,subfield|
subcodec.encode(buf,subfield)
end
return buf.length - initial_length
end
|