__all__ = [
'ClipboardFormatOrAnsiString',
]
from typing import Optional, Union
from .. import constants
from ._helpers import BytesReader
from ..enums import ClipboardFormat
class ClipboardFormatOrAnsiString:
def __init__(self, reader: Optional[Union[bytes, BytesReader]] = None):
if reader is None:
self.__markerOrLength = 0
self.__clipboardFormat = None
self.__ansiString = None
return
if isinstance(reader, bytes):
reader = BytesReader(reader)
self.__markerOrLength = reader.readUnsignedInt()
if self.__markerOrLength > 0xFFFFFFFD:
self.__ansiString = None
self.__clipboardFormat = ClipboardFormat(reader.readUnsignedInt())
elif self.__markerOrLength > 0:
self.__ansiString = reader.read(self.__markerOrLength)
self.__clipboardFormat = None
else:
self.__ansiString = None
self.__clipboardFormat = None
def __bytes__(self) -> bytes:
return self.toBytes()
def toBytes(self) -> bytes:
ret = constants.st.ST_LE_UI32.pack(self.markerOrLength)
if self.markerOrLength > 0xFFFFFFFD:
ret += constants.st.ST_LE_UI32.pack(self.clipboardFormat)
elif self.markerOrLength > 0:
ret += self.__ansiString
return ret
@property
def ansiString(self) -> Optional[bytes]:
"""
The null-terminated ANSI string, as bytes, of the name of a registered
clipboard format. Only set if markerOrLength is not ``0x00000000``,
``0xFFFFFFFE``, or ``0xFFFFFFFF``.
Setting this will modify the markerOrLength field automatically.
"""
return self.__ansiString
@ansiString.setter
def ansiString(self, val: bytes) -> None:
if not val:
raise ValueError('Cannot set :property ansiString: to None or empty bytes.')
self.__ansiString = val
@property
def clipboardFormat(self) -> Optional[ClipboardFormat]:
"""
The clipboard format, if any.
To set this, make sure that :property markerOrLength: is ``0xFFFFFFFE``
or ``0xFFFFFFFF`` *before* setting.
"""
return self.__clipboardFormat
@clipboardFormat.setter
def clipboardFormat(self, val: ClipboardFormat) -> None:
if not val:
raise ValueError('Cannot set clipboard format to None.')
if self.markerOrLength < 0xFFFFFFFE:
raise ValueError('Cannot set the clipboard format while the marker or length is not 0xFFFFFFFE or 0xFFFFFFFF')
self.__clipboardFormat = val
@property
def markerOrLength(self) -> int:
"""
If set the 0x00000000, then neither the format property nor the
ansiString property will be set. If it is 0xFFFFFFFF or 0xFFFFFFFE, then
the clipboardFormat property will be set. Otherwise, the ansiString
property
will be set.
"""
return self.__markerOrLength
@markerOrLength.setter
def markerOrLength(self, val: int) -> None:
if val < 0:
raise ValueError(':property markerOrLength: must be a positive integer.')
if val > 0xFFFFFFFF:
raise ValueError(':property markerOrLength: cannot be greater than 0xFFFFFFFF')
if val == 0:
self.__ansiString = None
self.__clipboardFormat = None
elif val > 0xFFFFFFFD:
self.__ansiString = None
self.__clipboardFormat = ClipboardFormat.CF_BITMAP
else:
raise ValueError('Cannot set :property markerOrLength: to a length value. Set :property ansiString: instead.')
self.__markerOrLength = val