__all__ = [ 'TOCEntry', ] from typing import Optional, Union from ._helpers import BytesReader from .cfoas import ClipboardFormatOrAnsiString from ..constants import st from .dv_target_device import DVTargetDevice from ..enums import ADVF, DVAspect class TOCEntry: def __init__(self, reader: Optional[Union[bytes, BytesReader]] = None): if reader is None: self.__clipFormat = ClipboardFormatOrAnsiString() self.__aspect = 0 self.__lindex = 0 self.__tymed = 0 self.__advf = 0 self.__targetDevice = DVTargetDevice(None) return if isinstance(reader, bytes): reader = BytesReader(reader) self.__clipFormat = ClipboardFormatOrAnsiString(reader) targetDeviceSize = reader.readUnsignedInt() self.__aspect = reader.readUnsignedInt() self.__lindex = reader.readUnsignedInt() self.__tymed = reader.readUnsignedInt() reader.read(12) self.__advf = reader.readUnsignedInt() # Based off the wording of the documentation, it seems like this can't # actually be 0 bytes, so this should be fine. self.__targetDevice = DVTargetDevice(reader.read(targetDeviceSize)) def __bytes__(self) -> bytes: return self.toBytes() def toBytes(self) -> bytes: ret = bytes(self.__clipFormat) td = bytes(self.__targetDevice) ret += st.ST_LE_UI32.pack(len(td)) ret += st.ST_LE_UI32.pack(self.__aspect) ret += st.ST_LE_UI32.pack(self.__lindex) ret += st.ST_LE_UI32.pack(self.__tymed) ret += b'\x00' * 12 ret += st.ST_LE_UI32.pack(self.__advf) ret += b'\x00' * 4 ret += td return ret @property def advf(self) -> Union[int, ADVF]: """ An implementation specific hint on how to render the presentation data on screen. May be ignored on processing. """ return self.__advf @advf.setter def advf(self, val: Union[int, ADVF]) -> None: if not isinstance(val, int): raise TypeError(':property advf: must be an int.') if val < 0: raise ValueError(':property advf: must be positive.') if val > 0xFFFFFFFF: raise ValueError(':property advf: cannot be greater than 0xFFFFFFFF.') self.__advf = val @property def ansiClipboardFormat(self) -> ClipboardFormatOrAnsiString: return self.__clipFormat @property def aspect(self) -> Union[int, DVAspect]: """ An implementation specific hint on how to render the presentation data on screen. May be ignored on processing. """ return self.__aspect @aspect.setter def aspect(self, val: Union[int, DVAspect]) -> None: if not isinstance(val, int): raise TypeError(':property aspect: must be an int.') if val < 0: raise ValueError(':property aspect: must be positive.') if val > 0xFFFFFFFF: raise ValueError(':property aspect: cannot be greater than 0xFFFFFFFF.') self.__aspect = val @property def lindex(self) -> int: """ An implementation specific hint on how to render the presentation data on screen. May be ignored on processing. """ return self.__lindex @lindex.setter def lindex(self, val: int) -> None: if not isinstance(val, int): raise TypeError(':property lindex: must be an int.') if val < 0: raise ValueError(':property lindex: must be positive.') if val > 0xFFFFFFFF: raise ValueError(':property lindex: cannot be greater than 0xFFFFFFFF.') self.__lindex = val @property def targetDevice(self) -> DVTargetDevice: return self.__targetDevice @property def tymed(self) -> int: return self.__tymed @tymed.setter def tymed(self, val: int) -> None: if not isinstance(val, int): raise TypeError(':property lindex: must be an int.') if val < 0: raise ValueError(':property lindex: must be positive.') if val > 0xFFFFFFFF: raise ValueError(':property lindex: cannot be greater than 0xFFFFFFFF.') self.__tymed = val
Memory