# File lib/arr-pm/file/header.rb, line 36
  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