class AMQ::Protocol::Basic
def self.decode_properties(data)
def self.decode_properties(data) offset, data_length, properties = 0, data.bytesize, {} compressed_index = data.byteslice(offset, 2).unpack1(PACK_UINT16) offset += 2 while data_length > offset DECODE_PROPERTIES_KEYS.each do |key| next unless compressed_index >= key compressed_index -= key name = DECODE_PROPERTIES[key] || raise(RuntimeError.new("No property found for index #{key.inspect}!")) case DECODE_PROPERTIES_TYPE[key] when :shortstr size = data.getbyte(offset) offset += 1 result = data.byteslice(offset, size) when :octet size = 1 result = data.getbyte(offset) when :timestamp size = 8 result = Time.at(data.byteslice(offset, 8).unpack1(PACK_UINT64_BE)) when :table size = 4 + data.byteslice(offset, 4).unpack1(PACK_UINT32) result = Table.decode(data.byteslice(offset, size)) end properties[name] = result offset += size end end properties end
def self.encode_app_id(value)
def self.encode_app_id(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [12, 0x0008, buffer] end
def self.encode_cluster_id(value)
def self.encode_cluster_id(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [13, 0x0004, buffer] end
def self.encode_content_encoding(value)
def self.encode_content_encoding(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [1, 0x4000, buffer] end
def self.encode_content_type(value)
def self.encode_content_type(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [0, 0x8000, buffer] end
def self.encode_correlation_id(value)
def self.encode_correlation_id(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [5, 0x0400, buffer] end
def self.encode_delivery_mode(value)
def self.encode_delivery_mode(value) buffer = +'' buffer << [value].pack(PACK_CHAR) [3, 0x1000, buffer] end
def self.encode_expiration(value)
def self.encode_expiration(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [7, 0x0100, buffer] end
def self.encode_headers(value)
def self.encode_headers(value) buffer = +'' buffer << AMQ::Protocol::Table.encode(value) [2, 0x2000, buffer] end
def self.encode_message_id(value)
def self.encode_message_id(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [8, 0x0080, buffer] end
def self.encode_priority(value)
def self.encode_priority(value) buffer = +'' buffer << [value].pack(PACK_CHAR) [4, 0x0800, buffer] end
def self.encode_properties(body_size, properties)
def self.encode_properties(body_size, properties) pieces, flags = [], 0 properties.reject {|key, value| value.nil?}.each do |key, value| i, f, result = self.__send__(:"encode_#{key}", value) flags |= f pieces[i] = result end # result = [60, 0, body_size, flags].pack('n2Qn') result = [60, 0].pack(PACK_UINT16_X2) result += AMQ::Pack.pack_uint64_big_endian(body_size) result += [flags].pack(PACK_UINT16) pieces_joined = pieces.join(EMPTY_STRING) result.force_encoding(pieces_joined.encoding) + pieces_joined end
def self.encode_reply_to(value)
def self.encode_reply_to(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [6, 0x0200, buffer] end
def self.encode_timestamp(value)
def self.encode_timestamp(value) buffer = +'' buffer << AMQ::Pack.pack_uint64_big_endian(value) [9, 0x0040, buffer] end
def self.encode_type(value)
def self.encode_type(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [10, 0x0020, buffer] end
def self.encode_user_id(value)
def self.encode_user_id(value) buffer = +'' buffer << value.to_s.bytesize.chr buffer << value.to_s [11, 0x0010, buffer] end