class RPM::File::Header

Constants

HEADER_HEADER_LENGTH

magic + index_count + data_length

HEADER_MAGIC
HEADER_SIGNED_TYPE
TAG_ENTRY_SIZE

Attributes

data_length[RW]
index_count[RW]
length[R]
magic[RW]
tags[R]

Public Class Methods

new(file) click to toggle source
# File lib/arr-pm/file/header.rb, line 19
def initialize(file)
  @file = file

  @inspectables = [:@length, :@index_count, :@data_length]
  @tags = []
end

Public Instance Methods

read() click to toggle source
# File lib/arr-pm/file/header.rb, line 26
def read
  # TODO(sissel): update the comments here to reflect learnings about rpm
  # internals
  # At this point assume we've read and consumed the lead and signature.
  #len = @rpm.signature.index_length + @rpm.signature
  #
  # header size is
  #     ( @rpm.signature.index_length * size of a header entry )
  #     + @rpm.signature.data_length
  #
  # header 'entries' are an
  #   int32 (tag id), int32 (tag type), int32  (offset), uint32 (count)
  #
  #       len = sizeof(il) + sizeof(dl) + (il * sizeof(struct entryInfo_s)) + dl;
  # See rpm's header.c, the headerLoad method function for reference.

  # Header always starts with HEADER_MAGIC + index_count(2bytes) +
  # data_length(2bytes)
  data = @file.read(HEADER_HEADER_LENGTH).unpack("a8NN")
  # TODO(sissel): @index_count is really a count, rename?
  @magic, @index_count, @data_length = data
  validate
  
  @index_size = @index_count * TAG_ENTRY_SIZE
  tag_data = @file.read(@index_size)
  data = @file.read(@data_length)

  (0 ... @index_count).each do |i|
    offset = i * TAG_ENTRY_SIZE
    entry_data = tag_data[i * TAG_ENTRY_SIZE, TAG_ENTRY_SIZE]
    entry = entry_data.unpack("NNNN")
    entry << data
    tag = ::RPM::File::Tag.new(*entry)
    @tags << tag
  end # each index

  @length = HEADER_HEADER_LENGTH + @index_size + @data_length
end
validate() click to toggle source
# File lib/arr-pm/file/header.rb, line 72
def validate
  # TODO(sissel): raise real exceptions
  if @magic != ::RPM::File::Header::HEADER_MAGIC
    raise "Header magic did not match; got #{@magic.inspect}, " \
          "expected #{::RPM::File::Header::HEADER_MAGIC.inspect}"
  end

  #if !(0..32).include?(@index_count)
    #raise "Invalid 'index_count' value #{@index_count}, expected to be in range [0..32]"
  #end

  #if !(0..8192).include?(@data_length)
    #raise "Invalid 'data_length' value #{@data_length}, expected to be in range [0..8192]"
  #end
end
write() click to toggle source
# File lib/arr-pm/file/header.rb, line 65
def write
  raise "not implemented yet"
  # Sort tags by type (integer value)
  # emit all tags in order
  # then emit all data segments in same order
end