Module: HrrRbSsh::Message::Codable

Instance Method Summary collapse

Instance Method Details

#common_definitionObject



14
15
16
# File 'lib/hrr_rb_ssh/message/codable.rb', line 14

def common_definition
  self::DEFINITION
end

#conditional_definition(message) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/hrr_rb_ssh/message/codable.rb', line 18

def conditional_definition message
  message.inject([]){ |a, (k,v)|
    field_name  = k
    field_value = if v.instance_of? ::Proc then v.call else v end
    a + ((self::CONDITIONAL_DEFINITION rescue {}).fetch(field_name, {})[field_value] || [])
  }
end

#decode(payload, complementary_message = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/hrr_rb_ssh/message/codable.rb', line 35

def decode payload, complementary_message={}
  def decode_recursively payload_io, message=nil
    if message.class == Array and message.size == 0
      []
    else
      definition = case message
                   when nil
                     common_definition
                   when Array
                     conditional_definition(message)
                   end
      decoded_message = definition.map{ |data_type, field_name|
        [
          field_name,
          HrrRbSsh::Transport::DataType[data_type].decode( payload_io )
        ]
      }

      decoded_message + decode_recursively(payload_io, decoded_message)
    end
  end

  payload_io = StringIO.new payload
  decoded_message = decode_recursively(payload_io).to_h
  if complementary_message.any?
    decoded_message.merge! decode_recursively(payload_io, complementary_message.to_a).to_h
  end
  logger.debug('decoded message: ' + decoded_message.inspect)
  decoded_message
end

#decode_recursively(payload_io, message = nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/hrr_rb_ssh/message/codable.rb', line 36

def decode_recursively payload_io, message=nil
  if message.class == Array and message.size == 0
    []
  else
    definition = case message
                 when nil
                   common_definition
                 when Array
                   conditional_definition(message)
                 end
    decoded_message = definition.map{ |data_type, field_name|
      [
        field_name,
        HrrRbSsh::Transport::DataType[data_type].decode( payload_io )
      ]
    }

    decoded_message + decode_recursively(payload_io, decoded_message)
  end
end

#encode(message, complementary_message = {}) ⇒ Object



26
27
28
29
30
31
32
33
# File 'lib/hrr_rb_ssh/message/codable.rb', line 26

def encode message, complementary_message={}
  logger.debug('encoding message: ' + message.inspect)
  definition = common_definition + conditional_definition(message.merge complementary_message)
  definition.map{ |data_type, field_name|
    field_value = if message[field_name].instance_of? ::Proc then message[field_name].call else message[field_name] end
    HrrRbSsh::Transport::DataType[data_type].encode( field_value )
  }.join
end

#loggerObject



10
11
12
# File 'lib/hrr_rb_ssh/message/codable.rb', line 10

def logger
  @logger ||= HrrRbSsh::Logger.new self.name
end