SickGear/lib/hachoir/field/fragment.py

50 lines
1.3 KiB
Python
Raw Permalink Normal View History

from hachoir.field import FieldSet, RawBytes
from hachoir.stream import StringInputStream
class FragmentGroup:
def __init__(self, parser):
self.items = []
self.parser = parser
self.args = {}
def add(self, item):
self.items.append(item)
def createInputStream(self):
# FIXME: Use lazy stream creation
data = []
for item in self.items:
data.append(item["rawdata"].value)
data = b"".join(data)
tags = {"args": self.args}
if self.parser is not None:
tags["class"] = self.parser
tags = iter(tags.items())
return StringInputStream(data, "<fragment group>", tags=tags)
class CustomFragment(FieldSet):
def __init__(self, parent, name, size, parser, description=None, group=None):
FieldSet.__init__(self, parent, name, description, size=size)
if not group:
group = FragmentGroup(parser)
self.field_size = size
self.group = group
self.group.add(self)
def createFields(self):
yield RawBytes(self, "rawdata", self.field_size // 8)
def _createInputStream(self, **args):
return self.group.createInputStream()
def createValue(self):
return self["rawdata"].value
def createDisplay(self):
return self["rawdata"].display