# File lib/rpm/header.rb, line 20
  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)
    #
    # See rpm's header.c, the headerLoad method function for reference.

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

    entry_size = 16 # tag id, type, offset, count == 16 bytes
    @index_size = @index_count * entry_size
    tag_data = @rpm.file.read(@index_size)
    data = @rpm.file.read(@data_length)

    #ap :data => data

    (0 ... @index_count).each do |i|
      offset = i * entry_size
      entry_data = tag_data[i * entry_size, entry_size]
      entry = entry_data.unpack("NNNN")
      entry << data
      tag = ::RPMFile::Tag.new(*entry)
      @tags << tag

      #ap tag.tag => {
        #:type => tag.type,
        #:offset => tag.offset,
        #:count => tag.count,
        #:value => (tag.value rescue "???"),
      #}
    end # each index
    @length = @magic.size + @index_size + @data_length
  end