Module: Bones::RPC::Adapter

Extended by:
Adapter
Included in:
Adapter
Defined in:
lib/bones/rpc/adapter.rb,
lib/bones/rpc/adapter/base.rb,
lib/bones/rpc/adapter/json.rb,
lib/bones/rpc/adapter/parser.rb

Defined Under Namespace

Modules: Base, JSON Classes: Parser

Instance Method Summary collapse

Instance Method Details

#get(adapter_name) ⇒ Object



7
8
9
# File 'lib/bones/rpc/adapter.rb', line 7

def get(adapter_name)
  adapters[adapter_name] || raise(Errors::InvalidAdapter, "Unknown adapter #{adapter_name.inspect}")
end

#get_by_ext_head(head) ⇒ Object



11
12
13
# File 'lib/bones/rpc/adapter.rb', line 11

def get_by_ext_head(head)
  ext_heads[head] || raise(Errors::InvalidExtMessage, "Unknown adapter for ext head #{head.inspect}")
end

#read_ext(buffer) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/bones/rpc/adapter.rb', line 30

def read_ext(buffer)
  ext_code, = buffer.read(1).unpack('C')
  ext_length, = case ext_code
  when 0xC7
    buffer.read(1).unpack('C')
  when 0xC8
    buffer.read(2).unpack('n')
  when 0xC9
    buffer.read(4).unpack('N')
  end
  ext_type, = buffer.read(1).unpack('c')
  ext_data = buffer.read(ext_length)
  return ext_data
end

#register(adapter) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/bones/rpc/adapter.rb', line 15

def register(adapter)
  adapter.send(:attr_reader, :adapter_name)
  adapter.send(:include, Adapter::Base)
  adapter.send(:extend, adapter)
  adapters[adapter] ||= adapter
  adapters[adapter.adapter_name] ||= adapter
  adapters[adapter.adapter_name.to_s] ||= adapter
  return adapter
end

#register_ext_head(adapter, head) ⇒ Object



25
26
27
28
# File 'lib/bones/rpc/adapter.rb', line 25

def register_ext_head(adapter, head)
  ext_heads[head] ||= adapter
  return adapter
end

#write_ext(head, data, buffer = "") ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/bones/rpc/adapter.rb', line 45

def write_ext(head, data, buffer = "")
  ext_length = data.bytesize + 1
  ext_code = if ext_length <= 0xFF
    0xC7
  elsif ext_length <= 0xFFFF
    0xC8
  elsif ext_length <= 0xFFFFFFFF
    0xC9
  else
    raise ArgumentError, "datasize too large: #{ext_length} (max #{0xFFFFFFFF} bytes)"
  end
  buffer << [ext_code].pack('C')
  ext_length_packer = case ext_code
  when 0xC7
    'C'
  when 0xC8
    'n'
  when 0xC9
    'N'
  else
    raise ArgumentError, "bad ext_code: #{ext_code} (should be one of #{0xC7}, #{0xC8}, #{0xC9})"
  end
  buffer << [ext_length].pack(ext_length_packer)
  ext_type = 0x0D
  buffer << [ext_type].pack('c')
  buffer << [head].pack('C')
  buffer << data.force_encoding('BINARY')
end