mirror of
https://github.com/robmcmullen/atrcopy.git
synced 2025-04-16 08:37:27 +00:00
Added hierarchical printing to container and segment
This commit is contained in:
parent
a6f5ed0a0a
commit
1817483b3c
@ -7,6 +7,7 @@ import numpy as np
|
||||
from . import errors
|
||||
from . import style_bits
|
||||
from .utils import to_numpy, to_numpy_list, uuid
|
||||
from . import media_type
|
||||
|
||||
import logging
|
||||
log = logging.getLogger(__name__)
|
||||
@ -42,6 +43,7 @@ class Container:
|
||||
self.segments = []
|
||||
self.header = None
|
||||
self.filesystem = None
|
||||
self._media_type = None
|
||||
|
||||
self._data = None
|
||||
self._style = None
|
||||
@ -74,7 +76,7 @@ class Container:
|
||||
@data.setter
|
||||
def data(self, value):
|
||||
if self._data is not None:
|
||||
raise errors.ReadOnlyContainer("media_type already populated with data")
|
||||
raise errors.ReadOnlyContainer("container already populated with data")
|
||||
raw = value.tobytes()
|
||||
try:
|
||||
unpacked = self.calc_unpacked_bytes(raw)
|
||||
@ -100,6 +102,29 @@ class Container:
|
||||
def header_length(self):
|
||||
return len(self.header) if self.header is not None else 0
|
||||
|
||||
@property
|
||||
def media_type(self):
|
||||
return self._media_type
|
||||
|
||||
@media_type.setter
|
||||
def media_type(self, value):
|
||||
self._media_type = value
|
||||
self.segments = []
|
||||
if value.header:
|
||||
self.header = value.header
|
||||
self.segments.append(self.header)
|
||||
self.segments.append(value)
|
||||
|
||||
@property
|
||||
def verbose_info(self):
|
||||
lines = []
|
||||
name = self.verbose_name or self.name
|
||||
lines.append(f"{name}: {len(self)} bytes")
|
||||
for s in self.segments:
|
||||
v = s.segment_info(" ")
|
||||
lines.extend(v)
|
||||
return "\n".join(lines)
|
||||
|
||||
#### dunder methods
|
||||
|
||||
def __str__(self):
|
||||
@ -148,6 +173,18 @@ class Container:
|
||||
"""
|
||||
return np_data
|
||||
|
||||
#### media
|
||||
|
||||
def guess_media_type(self):
|
||||
media = media_type.guess_media_type(self)
|
||||
self.media_type = media
|
||||
|
||||
def guess_filesystem(self):
|
||||
fs = filesystem.guess_filesystem(self.media_type)
|
||||
if fs is not None:
|
||||
self.filesystem = fs
|
||||
self.segments.append(fs)
|
||||
|
||||
#### serialization
|
||||
|
||||
def __getstate__(self):
|
||||
|
@ -65,6 +65,11 @@ class MediaType(Segment):
|
||||
"""
|
||||
pass
|
||||
|
||||
def find_filesystem(self):
|
||||
fs = filesystem.guess_filesystem(self)
|
||||
if fs:
|
||||
self.segments = list(fs.iter_segments())
|
||||
|
||||
|
||||
class DiskImage(MediaType):
|
||||
pretty_name = "Disk Image"
|
||||
|
@ -94,7 +94,7 @@ class Segment:
|
||||
origin = " @ %04x" % (self.origin)
|
||||
else:
|
||||
origin = ""
|
||||
s = "%s ($%x bytes%s)" % (self.name, len(self), origin)
|
||||
s = "%s (%d bytes%s)" % (self.name, len(self), origin)
|
||||
if self.error:
|
||||
s += " " + self.error
|
||||
return s
|
||||
@ -142,7 +142,7 @@ class Segment:
|
||||
|
||||
def create_subset(self, new_order, *args, **kwargs):
|
||||
new_order_of_source = self.container_offset[new_order]
|
||||
segment = DefaultSegment(self.container, new_order_of_source, *args, **kwargs)
|
||||
segment = Segment(self.container, new_order_of_source, *args, **kwargs)
|
||||
return segment
|
||||
|
||||
#### serialization
|
||||
@ -212,6 +212,13 @@ class Segment:
|
||||
s += " error='%s'" % self.error
|
||||
return s
|
||||
|
||||
def segment_info(self, indent=""):
|
||||
lines = []
|
||||
lines.append(indent + str(self))
|
||||
for s in self.segments:
|
||||
lines.extend(s.segment_info(indent + " "))
|
||||
return lines
|
||||
|
||||
def is_valid_index(self, i):
|
||||
return i >= 0 and i < len(self)
|
||||
|
||||
|
@ -56,9 +56,8 @@ if __name__ == "__main__":
|
||||
print(f"checking {pathname}")
|
||||
sample_data = np.fromfile(pathname, dtype=np.uint8)
|
||||
container = guess_container(sample_data)
|
||||
print(container)
|
||||
media = guess_media_type(container)
|
||||
print(f"{pathname}: {media}")
|
||||
container.guess_media_type()
|
||||
print(container.verbose_info)
|
||||
|
||||
import sys
|
||||
import glob
|
||||
|
Loading…
x
Reference in New Issue
Block a user