class Resilience::Page

Attributes

attributes[RW]
contents[RW]
entries[RW]
id[RW]
object_id[RW]
sequence[RW]
virtual_page_number[RW]

Public Class Methods

extract_all() click to toggle source
# File lib/resilience/page.rb, line 26
def self.extract_all
  page_id     = PAGES[:first]
  pages       = Pages.new

  image.seek(page_id * PAGE_SIZE)
  while contents = image.read(PAGE_SIZE)
    # only pull out metadata pages currently
    extracted_id   = id_from_contents(contents)
    is_metadata    = extracted_id == page_id
    pages[page_id] = Page.parse(page_id, contents) if is_metadata
    page_id       += 1
  end

  pages
end
id_from_contents(contents) click to toggle source
# File lib/resilience/page.rb, line 42
def self.id_from_contents(contents)
  contents.unpack('S').first
end
new() click to toggle source
# File lib/resilience/page.rb, line 22
def initialize
  @attributes ||= []
end
parse(id, contents) click to toggle source
# File lib/resilience/page.rb, line 62
def self.parse(id, contents)
  store_pos

  page          = new
  page.id       = id
  page.contents = contents

  image.seek(page.offset + ADDRESSES[:page_sequence])
  page.sequence = image.read(4).unpack('L').first

  image.seek(page.offset + ADDRESSES[:virtual_page_number])
  page.virtual_page_number = image.read(4).unpack('L').first

  unless page.root? || page.object_table?
    # TODO:
    #page.parse_attributes
    #page.parse_metadata
  end

  restore_pos

  page
end

Public Instance Methods

attr_start() click to toggle source
# File lib/resilience/page.rb, line 50
def attr_start
  offset + ADDRESSES[:first_attr]
end
has_attributes?() click to toggle source
# File lib/resilience/page.rb, line 86
def has_attributes?
  !@attributes.nil? && !@attributes.empty?
end
object_table?() click to toggle source
# File lib/resilience/page.rb, line 58
def object_table?
  virtual_page_number == PAGES[:object_table]
end
offset() click to toggle source
# File lib/resilience/page.rb, line 46
def offset
  id * PAGE_SIZE
end
parse_attributes() click to toggle source
# File lib/resilience/page.rb, line 90
def parse_attributes
  image.seek(attr_start)
  while true
    attr = Attribute.read
    break if attr.empty?
    @attributes << attr
  end
end
parse_metadata() click to toggle source
# File lib/resilience/page.rb, line 99
def parse_metadata
  @object_id = @attributes.first.unpack("C*")[ADDRESSES[:object_id]]
  @entries   = @attributes.first.unpack("C*")[ADDRESSES[:num_objects]]
end
root?() click to toggle source
# File lib/resilience/page.rb, line 54
def root?
  virtual_page_number == PAGES[:root]
end