49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
import numpy as np
|
|
|
|
from . import errors
|
|
from .container import DiskImageContainer
|
|
from .segments import SegmentData
|
|
|
|
|
|
class DCMContainer(DiskImageContainer):
|
|
valid_densities = {
|
|
0: (720, 128),
|
|
1: (720, 256),
|
|
2: (1040, 128),
|
|
}
|
|
|
|
def get_next(self):
|
|
try:
|
|
data = self.raw[self.index]
|
|
except IndexError:
|
|
raise errors.InvalidContainer("Incomplete DCM file")
|
|
else:
|
|
self.index += 1
|
|
return data
|
|
|
|
def unpack_bytes(self, data):
|
|
self.index = 0
|
|
self.count = len(data)
|
|
self.raw = data
|
|
archive_type = self.get_next()
|
|
if archive_type == 0xf9 or archive_type == 0xfa:
|
|
archive_flags = self.get_next()
|
|
if archive_flags & 0x1f != 1:
|
|
if archive_type == 0xf9:
|
|
raise errors.InvalidContainer("DCM multi-file archive combined in the wrong order")
|
|
else:
|
|
raise errors.InvalidContainer("Expected pass one of DCM archive first")
|
|
density_flag = (archive_flags >> 5) & 3
|
|
if density_flag not in self.valid_densities:
|
|
raise errors.InvalidContainer(f"Unsupported density flag {density_flag} in DCM")
|
|
else:
|
|
raise errors.InvalidContainer("Not a DCM file")
|
|
|
|
# DCM decoding goes here. Currently, instead of decoding it raises the
|
|
# UnsupportedContainer exception, which signals to the caller that the
|
|
# container has been successfully identified but can't be parsed.
|
|
#
|
|
# When decoding is supported, return the decoded byte array instead of
|
|
# this exception.
|
|
raise errors.UnsupportedContainer("DCM archives are not yet supported")
|