Thrift::CompactProtocol

Public Class Methods

new(transport) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 96
def initialize(transport)
  super(transport)

  @last_field = [0]
  @boolean_value = nil

  # Pre-allocated read buffer for read_double().
  @rbuf = Bytes.empty_byte_buffer(8)
end

Public Instance Methods

read_bool() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 298
def read_bool
  unless @bool_value.nil?
    bv = @bool_value
    @bool_value = nil
    bv
  else
    read_byte() == CompactTypes::BOOLEAN_TRUE
  end
end
read_byte() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 308
def read_byte
  val = trans.read_byte
  if (val > 0x7f)
    val = 0 - ((val - 1) ^ 0xff)
  end
  val
end
read_double() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 328
def read_double
  trans.read_into_buffer(@rbuf, 8)
  val = @rbuf.reverse.unpack('G').first
  val
end
read_field_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 246
def read_field_begin
  type = read_byte()

  # if it's a stop, then we can return immediately, as the struct is over.
  if (type & 0x0f) == Types::STOP
    TSTOP
  else
    field_id = nil

    # mask off the 4 MSB of the type header. it could contain a field id delta.
    modifier = (type & 0xf0) >> 4
    if modifier == 0
      # not a delta. look ahead for the zigzag varint field id.
      @last_field.pop
      field_id = read_i16()
    else
      # has a delta. add the delta to the last read field id.
      field_id = @last_field.pop + modifier
    end

    # if this happens to be a boolean field, the value is encoded in the type
    if CompactTypes.is_bool_type?(type)
      # save the boolean value in a special instance variable.
      @bool_value = (type & 0x0f) == CompactTypes::BOOLEAN_TRUE
    end

    # push the new field onto the field stack so we can keep the deltas going.
    @last_field.push(field_id)
    ["", CompactTypes.get_ttype(type & 0x0f), field_id]
  end
end
read_i16() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 316
def read_i16
  zig_zag_to_int(read_varint32())
end
read_i32() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 320
def read_i32
  zig_zag_to_int(read_varint32())
end
read_i64() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 324
def read_i64
  zig_zag_to_long(read_varint64())
end
read_list_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 284
def read_list_begin
  size_and_type = read_byte()
  size = (size_and_type >> 4) & 0x0f
  if size == 15
    size = read_varint32()
  end
  type = CompactTypes.get_ttype(size_and_type)
  [type, size]
end
read_map_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 278
def read_map_begin
  size = read_varint32()
  key_and_value_type = size == 0 ? 0 : read_byte()
  [CompactTypes.get_ttype(key_and_value_type >> 4), CompactTypes.get_ttype(key_and_value_type & 0xf), size]
end
read_message_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 218
def read_message_begin
  protocol_id = read_byte()
  if protocol_id != PROTOCOL_ID
    raise ProtocolException.new("Expected protocol id #{PROTOCOL_ID} but got #{protocol_id}")
  end
  
  version_and_type = read_byte()
  version = version_and_type & VERSION_MASK
  if (version != VERSION)
    raise ProtocolException.new("Expected version #{VERSION} but got #{version}");
  end
  
  type = (version_and_type >> TYPE_SHIFT_AMOUNT) & 0x03
  seqid = read_varint32()
  messageName = read_string()
  [messageName, type, seqid]
end
read_set_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 294
def read_set_begin
  read_list_begin
end
read_string() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 334
def read_string
  size = read_varint32()
  buffer = trans.read_all(size)
  Bytes.convert_to_string(buffer)
end
read_struct_begin() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 236
def read_struct_begin
  @last_field.push(0)
  ""
end
read_struct_end() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 241
def read_struct_end
  @last_field.pop()
  nil
end
write_bool(bool) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 180
def write_bool(bool)
  type = bool ? CompactTypes::BOOLEAN_TRUE : CompactTypes::BOOLEAN_FALSE
  unless @boolean_field.nil?
    # we haven't written the field header yet
    write_field_begin_internal(@boolean_field.first, @boolean_field.last, type)
    @boolean_field = nil
  else
    # we're not part of a field, so just write the value.
    write_byte(type)
  end
end
write_byte(byte) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 192
def write_byte(byte)
  @trans.write([byte].pack('c'))
end
write_double(dub) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 208
def write_double(dub)
  @trans.write([dub].pack("G").reverse)
end
write_field_begin(name, type, id) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 124
def write_field_begin(name, type, id)
  if type == Types::BOOL
    # we want to possibly include the value, so we'll wait.
    @boolean_field = [type, id]
  else
    write_field_begin_internal(type, id)
  end
  nil
end
write_field_begin_internal(type, id, type_override=nil) click to toggle source

The workhorse of writeFieldBegin. It has the option of doing a 'type override' of the type header. This is used specifically in the boolean field case.

# File lib/thrift/protocol/compact_protocol.rb, line 139
def write_field_begin_internal(type, id, type_override=nil)
  last_id = @last_field.pop
  
  # if there's a type override, use that.
  typeToWrite = type_override || CompactTypes.get_compact_type(type)

  # check if we can use delta encoding for the field id
  if id > last_id && id - last_id <= 15
    # write them together
    write_byte((id - last_id) << 4 | typeToWrite)
  else
    # write them separate
    write_byte(typeToWrite)
    write_i16(id)
  end

  @last_field.push(id)
  nil
end
write_field_stop() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 159
def write_field_stop
  write_byte(Types::STOP)
end
write_i16(i16) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 196
def write_i16(i16)
  write_varint32(int_to_zig_zag(i16))
end
write_i32(i32) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 200
def write_i32(i32)
  write_varint32(int_to_zig_zag(i32))
end
write_i64(i64) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 204
def write_i64(i64)
  write_varint64(long_to_zig_zag(i64))
end
write_list_begin(etype, size) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 172
def write_list_begin(etype, size)
  write_collection_begin(etype, size)
end
write_map_begin(ktype, vtype, size) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 163
def write_map_begin(ktype, vtype, size)
  if (size == 0)
    write_byte(0)
  else
    write_varint32(size)
    write_byte(CompactTypes.get_compact_type(ktype) << 4 | CompactTypes.get_compact_type(vtype))
  end
end
write_message_begin(name, type, seqid) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 106
def write_message_begin(name, type, seqid)
  write_byte(PROTOCOL_ID)
  write_byte((VERSION & VERSION_MASK) | ((type << TYPE_SHIFT_AMOUNT) & TYPE_MASK))
  write_varint32(seqid)
  write_string(name)
  nil
end
write_set_begin(etype, size) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 176
def write_set_begin(etype, size)
  write_collection_begin(etype, size);
end
write_string(str) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 212
def write_string(str)
  str = Bytes.convert_to_utf8_byte_buffer(str)
  write_varint32(str.length)
  @trans.write(str)
end
write_struct_begin(name) click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 114
def write_struct_begin(name)
  @last_field.push(0)
  nil
end
write_struct_end() click to toggle source
# File lib/thrift/protocol/compact_protocol.rb, line 119
def write_struct_end
  @last_field.pop
  nil
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.