Class: Thrift::CompactProtocol

### Home Classes Methods

### In Files

- lib/thrift/protocol/compact_protocol.rb

### Parent

Thrift::BaseProtocol

### Namespace

- CLASS Thrift::CompactProtocol::CompactTypes

### Methods

- ::new
- #read_bool
- #read_byte
- #read_double
- #read_field_begin
- #read_i16
- #read_i32
- #read_i64
- #read_list_begin
- #read_map_begin
- #read_message_begin
- #read_set_begin
- #read_string
- #read_struct_begin
- #read_struct_end
- #write_bool
- #write_byte
- #write_double
- #write_field_begin
- #write_field_begin_internal
- #write_field_stop
- #write_i16
- #write_i32
- #write_i64
- #write_list_begin
- #write_map_begin
- #write_message_begin
- #write_set_begin
- #write_string
- #write_struct_begin
- #write_struct_end

### Files

- CHANGELOG
- README
- Makefile

### Class/Module Index

Quicksearch

- Thrift
- Thrift::ApplicationException
- Thrift::BaseProtocol
- Thrift::BaseProtocolFactory
- Thrift::BaseServer
- Thrift::BaseServerTransport
- Thrift::BaseTransport
- Thrift::BaseTransportFactory
- Thrift::BinaryProtocol
- Thrift::BinaryProtocolAcceleratedFactory
- Thrift::BinaryProtocolFactory
- Thrift::BufferedTransport
- Thrift::BufferedTransportFactory
- Thrift::Client
- Thrift::CompactProtocol
- Thrift::CompactProtocol::CompactTypes
- Thrift::CompactProtocolFactory
- Thrift::Deserializer
- Thrift::Exception
- Thrift::FramedTransport
- Thrift::FramedTransportFactory
- Thrift::HTTPClientTransport
- Thrift::IOStreamTransport
- Thrift::MemoryBufferTransport
- Thrift::MessageTypes
- Thrift::MongrelHTTPServer
- Thrift::MongrelHTTPServer::Handler
- Thrift::NonblockingServer
- Thrift::Processor
- Thrift::ProtocolException
- Thrift::Serializer
- Thrift::ServerSocket
- Thrift::SimpleServer
- Thrift::Socket
- Thrift::Struct
- Thrift::Struct_Union
- Thrift::ThreadPoolServer
- Thrift::ThreadedServer
- Thrift::TransportException
- Thrift::TransportUtils
- Thrift::TypeError
- Thrift::Types
- Thrift::UNIXServerSocket
- Thrift::UNIXSocket
- Thrift::Union
- Fixnum

No matching classes.

# Thrift::CompactProtocol

### Constants

EVERYTHING_ELSE_MASK
PROTOCOL_ID
SEVEN_BIT_MASK
TSTOP
TYPE_MASK
TYPE_SHIFT_AMOUNT
VERSION
VERSION_MASK

### 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 = "\00"" * 8
      @rbuf.force_encoding("BINARY") if @rbuf.respond_to?(:force_encoding)
    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()
      trans.read_all(size)
    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 181
    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 193
    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 209
    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 125
    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 140
    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 160
    def write_field_stop
      write_byte(Types::STOP)
    end

write_i16(i16) click to toggle source

    # File lib/thrift/protocol/compact_protocol.rb, line 197
    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 201
    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 205
    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 173
    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 164
    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 107
    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 177
    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 213
    def write_string(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 115
    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 120
    def write_struct_end
      @last_field.pop
      nil
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.