Module: RubyHome::HAP::TLV

Defined in:
lib/ruby_home/hap/tlv.rb

Defined Under Namespace

Classes: Bytes, Payload, TLV, UTF8String

Constant Summary collapse

ERROR_TYPES =
{
  unknown: 1,
  authentication: 2,
  backoff: 3,
  max_peers: 4,
  max_tries: 5,
  unavailable: 6,
  busy: 7,
}.freeze
TYPE_ERRORS =
ERROR_TYPES.invert.freeze
NAME_TYPES =
{
  method: 0,
  identifier: 1,
  salt: 2,
  public_key: 3,
  proof: 4,
  encrypted_data: 5,
  state: 6,
  error: 7,
  retry_delay: 8,
  certificate: 9,
  signature: 10,
  permissions: 11,
  fragment_data: 12,
  fragment_last: 13,
}.freeze
TYPE_NAMES =
NAME_TYPES.invert.freeze
READER =
BinData::Array.new(type: :tlv, read_until: :eof)

Class Method Summary collapse

Class Method Details

.encode(hash) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/ruby_home/hap/tlv.rb', line 83

def self.encode(hash)
  hash.to_hash.each_with_object(String.new) do |(key, value), memo|
    type_id = NAME_TYPES[key]
    next unless type_id

    if value.is_a?(String)
      value.scan(/.{1,255}/m)
    else
      [value]
    end.each do |frame_value|
      tlv = TLV.new(type_id: type_id, val: frame_value).tap do |tlv|
        tlv.len = tlv.val.to_binary_s.length
      end
      memo << tlv.to_binary_s
    end
  end
end

.read(input) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/ruby_home/hap/tlv.rb', line 68

def self.read(input)
  READER.clear
  READER.read(input)
  READER.snapshot.each_with_object({}) do |(hash), memo|
    type = TYPE_NAMES[hash[:type_id]]
    next unless type

    if memo[type]
      memo[type] << hash[:val]
    else
      memo[type] = hash[:val]
    end
  end
end