mirror of
https://github.com/volatilityfoundation/volatility3.git
synced 2026-08-25 07:32:23 +02:00
85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
__author__ = 'mike'
|
|
|
|
from volatility.framework import validity
|
|
|
|
class TreeRow(validity.ValidityRoutines):
|
|
"""Class providing the interface for an individual Row of the TreeGrid"""
|
|
def __init__(self, treegrid, values):
|
|
self.type_check(treegrid, TreeGrid)
|
|
if not isinstance(self, TreeGrid):
|
|
self.type_check(values, list)
|
|
treegrid.validate_values(values)
|
|
self._treegrid = treegrid
|
|
self._children = []
|
|
self._values = values
|
|
|
|
def add_child(self, child):
|
|
"""Appends a child to the current Row"""
|
|
self.type_check(child, TreeRow)
|
|
self._children += [child]
|
|
|
|
def insert_child(self, child, position):
|
|
"""Inserts a child at a specific position in the current Row"""
|
|
self.type_check(child, TreeRow)
|
|
self._children = self._children[:position] + [child] + self._children[:position]
|
|
|
|
def clear(self):
|
|
"""Removes all children from this row
|
|
|
|
:rtype : None
|
|
"""
|
|
self._children = []
|
|
|
|
@property
|
|
def children(self):
|
|
"""Returns an iterator of the children of the current row
|
|
|
|
:rtype : iterator of TreeRows
|
|
"""
|
|
for child in self._children:
|
|
yield child
|
|
|
|
def iterator(self, level = 0):
|
|
"""Returns an iterator of all rows with their depths
|
|
|
|
:type level: int
|
|
:param level: Indicates the depth of the current iterator
|
|
"""
|
|
yield (level, self)
|
|
for child in self.children:
|
|
for grandchild in child.iterator(level + 1):
|
|
yield grandchild
|
|
|
|
class TreeGrid(TreeRow):
|
|
"""Class providing the interface for a TreeGrid (which contains TreeRows)"""
|
|
|
|
simple_types = {int, str, float, bytes}
|
|
column_formats = {"address"}
|
|
|
|
def __init__(self, columns):
|
|
"""Constructs a TreeGrid object using a specific set of columns
|
|
|
|
The TreeGrid itself is a root element, that can have children but no values
|
|
|
|
:param columns: A list of column tuples made up of (name, type and formatter).
|
|
"""
|
|
self.type_check(columns, list)
|
|
for (name, column_type, column_format) in columns:
|
|
is_simple_type = False
|
|
for t in self.simple_types:
|
|
is_simple_type = is_simple_type or issubclass(column_type, t)
|
|
if not is_simple_type:
|
|
raise TypeError("Column " + name + "'s type " + column_type.__class__.__name__ +
|
|
" is not a simple type")
|
|
if not column_format is None and not column_format in self.column_formats:
|
|
raise TypeError("Column " + name + "'s format " + column_format + " is not an accepted formatter.")
|
|
self._columns = columns
|
|
|
|
# We can use the special type None because we're the top level node without values
|
|
TreeRow.__init__(self, self, None)
|
|
|
|
def validate_values(self, values):
|
|
"""Takes a list of values and verified them against the column types"""
|
|
for i in range(len(self._columns)):
|
|
if not isinstance(values[i], self._columns[i]):
|
|
raise TypeError("Column type " + str(i) + " is incorrect.") |