Class: Qrack::Protocol::Header

Inherits:
Object
  • Object
show all
Defined in:
lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Header

Returns a new instance of Header.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 64

def initialize *args
  opts = args.pop if args.last.is_a? Hash
  opts ||= {}
 
  first = args.shift
 
  if first.is_a? ::Class and first.ancestors.include? Protocol::Class
    @klass = first
    @size = args.shift || 0
    @weight = args.shift || 0
    @properties = opts

  elsif first.is_a? Transport::Buffer or first.is_a? String
    buf = first
    buf = Transport::Buffer.new(buf) unless buf.is_a? Transport::Buffer
   
    @klass = Protocol.classes[buf.read(:short)]
    @weight = buf.read(:short)
    @size = buf.read(:longlong)

    props = buf.read(:properties, *klass.properties.map{|type,_| type })
    @properties = Hash[*klass.properties.map{|_,name| name }.zip(props).reject{|k,v| v.nil? }.flatten]

  else
    raise ArgumentError, 'Invalid argument'
  end
 
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &blk) ⇒ Object



120
121
122
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 120

def method_missing meth, *args, &blk
  @properties.has_key?(meth) || @klass.properties.find{|_,name| name == meth } ? @properties[meth] : super
end

Instance Attribute Details

#klassObject

Returns the value of attribute klass.



92
93
94
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 92

def klass
  @klass
end

#propertiesObject

Returns the value of attribute properties.



92
93
94
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 92

def properties
  @properties
end

#sizeObject

Returns the value of attribute size.



92
93
94
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 92

def size
  @size
end

#weightObject

Returns the value of attribute weight.



92
93
94
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 92

def weight
  @weight
end

Instance Method Details

#==(header) ⇒ Object



114
115
116
117
118
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 114

def == header
  [ :klass, :size, :weight, :properties ].inject(true) do |eql, field|
    eql and __send__(field) == header.__send__(field)
  end
end

#to_binaryObject



94
95
96
97
98
99
100
101
102
103
104
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 94

def to_binary
  buf = Transport::Buffer.new
  buf.write :short, klass.id
  buf.write :short, weight # XXX rabbitmq only supports weight == 0
  buf.write :longlong, size
  buf.write :properties, (klass.properties.map do |type, name|
                           [ type, properties[name] || properties[name.to_s] ]
                         end)
  buf.rewind
  buf
end

#to_frame(channel = 0) ⇒ Object



110
111
112
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 110

def to_frame channel = 0
  Transport::Header.new(self, channel)
end

#to_sObject



106
107
108
# File 'lib/ext/bunny-0.6.0/lib/qrack/protocol/protocol08.rb', line 106

def to_s
  to_binary.to_s
end