From 1a7e41025c56fb0cfe337d61924f08d87aa14066 Mon Sep 17 00:00:00 2001 From: David Stokes Date: Fri, 23 Feb 2024 01:18:44 -0500 Subject: [PATCH 1/4] First pass of userdata implementation; added userdata to schema (may change) --- idelib/schemata/mide_ide.xml | 21 ++++++ idelib/userdata.py | 141 +++++++++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 idelib/userdata.py diff --git a/idelib/schemata/mide_ide.xml b/idelib/schemata/mide_ide.xml index d975dcb..36a1bd1 100644 --- a/idelib/schemata/mide_ide.xml +++ b/idelib/schemata/mide_ide.xml @@ -404,4 +404,25 @@ Statistical data for this block's payload consisting of 3 datapoints (min, mean, max) per subchannel. They are organized as [[sc0min] [sc1min] [sc2min] ...] [[sc0mean] [sc1mean] [sc2mean] ...] [[sc0max] [sc1max] [sc2max] ...]. The format and representation of the stat data exactly matches that of the input samples; that is, if the input samples are uint16_t, each stat entry is also a uint16_t. Super-optional diagnostic element indicating the latency between data acquisition and transfer to the output media. The exact meaning of this value is device-dependent, but may serve as a general indicator of excess activity load, retransmission or congestion (for transmission media) or media wear (for recording media). + + + + + + + + + + + + + + + + + + + + + Position of the beginning of the user-defined metadata. This should be the last element in the file. diff --git a/idelib/userdata.py b/idelib/userdata.py new file mode 100644 index 0000000..1a15867 --- /dev/null +++ b/idelib/userdata.py @@ -0,0 +1,141 @@ +""" +Functions for reading and writing application-specific data from/to the end +of IDE files. This data is intended primarily to retain user preferences for +the display of the `Dataset`. +""" + +import os.path +import logging +from typing import Any, BinaryIO, Dict, Optional, Tuple, Union + +from .dataset import Dataset + +#=============================================================================== +# +#=============================================================================== + +MIN_VOID_SIZE = 9 + +logger = logging.getLogger('idelib') + +#=============================================================================== +# +#=============================================================================== + +def getUserDataPos(dataset: Dataset) -> Tuple[bool, int, int]: + """ Get the offset of the start of the user data. + + :param dataset: The `Dataset` in which to locate the user data. + :return: A tuple containing a bool (wheter or not data exists), + the offset of the user data, and the total length of the file. + """ + doc = dataset.ebmldoc + fs = doc.stream + hasdata = False + + oldpos = fs.tell() + filesize = fs.seek(0, os.SEEK_END) + offset = filesize + + example = doc.schema['UserDataOffset'].encode(1, length=8, lengthSize=8) + header = example[:-8] + + try: + pos = offset - int(len(example) * 1.5) + fs.seek(pos, os.SEEK_SET) + chunk = fs.read() + if header in chunk: + fs.seek(pos + chunk.index(header), os.SEEK_SET) + el, _next = doc.parseElement(fs) + offset = el.value + hasdata = True + + except IndexError: + # Problem with parsed chunk; shouldn't happen. + pass + + finally: + fs.seek(oldpos, os.SEEK_SET) + + return hasdata, offset, filesize + + +#=============================================================================== +# +#=============================================================================== + +def readUserData(dataset: Dataset) -> Union[Dict[str, Any], None]: + """ Read application-specific user data from the end of an IDE file. + + :param dataset: The `Dataset` from which to read the user data. + :return: A dictionary of user data, or `None` if no user data + could be read from the file (e.g., none exists). + """ + doc = dataset.ebmldoc + fs = doc.stream + oldpos = fs.tell() + + hasdata, offset, filesize = getUserDataPos(dataset) + + if not hasdata: + logger.debug('No user data found') + return None + + try: + fs.seek(offset, os.SEEK_SET) + data, _next = doc.parseElement(fs) + return data.dump() + + finally: + fs.seek(oldpos, os.SEEK_SET) + + +#=============================================================================== +# +#=============================================================================== + +def writeUserData(dataset: Dataset, + userdata: Dict[str, Any]): + """ Write user data to the end of an IDE file. + + :param dataset: The `Dataset` from which to read the user data. + :param userdata: A dictionary of user data, or `None` to remove + existing user data. Note that the file will not get smaller if + the user data is removed (or the new user data is smaller); + it is just overwritten with null data (an EBML `Void` element). + """ + schema = dataset.ebmldoc.schema + fs = dataset.ebmldoc.stream + oldpos = fs.tell() + + try: + _hasdata, offset, filesize = getUserDataPos(dataset) + + dataBin = schema.encodes({'UserData': userdata}) + offsetBin = schema['UserDataOffset'].encode(offset, length=8, lengthSize=8) + newsize = (len(offsetBin) + len(dataBin) + offset + MIN_VOID_SIZE) + voidBin = schema['Void'].encode(None, length=max(0, filesize - newsize), + lengthSize=8) + + userblob = dataBin + voidBin + offsetBin + + if '+' not in fs.mode and 'w' not in fs.mode: + if not getattr(fs, 'name', None): + logger.debug(f'(userdata) Dataset stream read only (mode {fs.mode!r}) ' + 'and has no name, not writing user data') + return + + with open(fs.name, 'br+') as newfs: + logger.debug(f'(userdata) Dataset stream read only (mode {fs.mode!r}), ' + 'using new stream') + newfs.seek(offset, os.SEEK_SET) + newfs.write(userblob) + else: + fs.seek(offset, os.SEEK_SET) + fs.write(userblob) + + logger.debug(f'(userdata) Wrote {len(userblob)} bytes to {dataset} ' + f'(file was {filesize}, now {newsize})') + + finally: + fs.seek(oldpos, os.SEEK_SET) From 47929510ae6a487c13db97c2ef7699b73a0eb0bd Mon Sep 17 00:00:00 2001 From: David Stokes Date: Fri, 23 Feb 2024 17:41:48 -0500 Subject: [PATCH 2/4] Documentation, mostly --- idelib/schemata/mide_ide.xml | 20 ++++++++++++-------- idelib/userdata.py | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/idelib/schemata/mide_ide.xml b/idelib/schemata/mide_ide.xml index 36a1bd1..637cdc8 100644 --- a/idelib/schemata/mide_ide.xml +++ b/idelib/schemata/mide_ide.xml @@ -407,21 +407,25 @@ - - - + An offset (in microseconds) for all sample times. + Application-specific data describing GUI settings, etc. + User-created highlights, marking particular spans and points in time - - - - + The annotation's ID, arbitrary but unique to the file. + A name and/or notes about the annotation. + Annotation start time. + Annotation end time. If present, the annotation will cover a time span. + Application-specific data describing the visual representation of the annotation. - + + + + Position of the beginning of the user-defined metadata. This should be the last element in the file. diff --git a/idelib/userdata.py b/idelib/userdata.py index 1a15867..d45c949 100644 --- a/idelib/userdata.py +++ b/idelib/userdata.py @@ -6,7 +6,7 @@ import os.path import logging -from typing import Any, BinaryIO, Dict, Optional, Tuple, Union +from typing import Any, Dict, Optional, Tuple, Union from .dataset import Dataset From f484b17a7f28fa8b03e133e27ab8fc8c6b9a6e8c Mon Sep 17 00:00:00 2001 From: David Stokes Date: Wed, 20 Mar 2024 11:30:12 -0400 Subject: [PATCH 3/4] Added caching, etc. --- idelib/dataset.py | 6 +++++ idelib/userdata.py | 61 +++++++++++++++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/idelib/dataset.py b/idelib/dataset.py index 521e2a1..176f13e 100644 --- a/idelib/dataset.py +++ b/idelib/dataset.py @@ -49,6 +49,7 @@ from collections.abc import Iterable, Sequence from datetime import datetime from threading import Lock +from typing import Any, Dict, Optional import warnings import os.path @@ -260,6 +261,11 @@ def __init__(self, stream, name=None, quiet=True, attributes=None): self.loading = True self.filename = getattr(stream, "name", None) + # For keeping user-defined data + self._userdata: Optional[Dict[str, Any]] = None + self._userdataOffset: Optional[int] = None + self._filesize: Optional[int] = None + self._channelDataLock = Lock() # Subsets: used when importing multiple files into the same dataset. diff --git a/idelib/userdata.py b/idelib/userdata.py index d45c949..5d2c666 100644 --- a/idelib/userdata.py +++ b/idelib/userdata.py @@ -22,13 +22,21 @@ # #=============================================================================== -def getUserDataPos(dataset: Dataset) -> Tuple[bool, int, int]: +def getUserDataPos(dataset: Dataset, + refresh: bool = False) -> Tuple[bool, int, int]: """ Get the offset of the start of the user data. :param dataset: The `Dataset` in which to locate the user data. + :param refresh:: If `True`, ignore any cached values and re-read + from the file. :return: A tuple containing a bool (wheter or not data exists), the offset of the user data, and the total length of the file. + Offset and filesize will typically be the same if there is no + user data. """ + if not refresh and dataset._userdataOffset and dataset._filesize: + return bool(dataset._userdata), dataset._userdataOffset, dataset._filesize + doc = dataset.ebmldoc fs = doc.stream hasdata = False @@ -37,10 +45,13 @@ def getUserDataPos(dataset: Dataset) -> Tuple[bool, int, int]: filesize = fs.seek(0, os.SEEK_END) offset = filesize + # The UserDataOffset is a known, fixed size example = doc.schema['UserDataOffset'].encode(1, length=8, lengthSize=8) header = example[:-8] try: + # UserDataOffset *should* be right at the end of the file, but + # don't assume so. Start some bytes back and find the header. pos = offset - int(len(example) * 1.5) fs.seek(pos, os.SEEK_SET) chunk = fs.read() @@ -57,6 +68,8 @@ def getUserDataPos(dataset: Dataset) -> Tuple[bool, int, int]: finally: fs.seek(oldpos, os.SEEK_SET) + dataset._userdataOffset = offset + dataset._filesize = filesize return hasdata, offset, filesize @@ -64,27 +77,36 @@ def getUserDataPos(dataset: Dataset) -> Tuple[bool, int, int]: # #=============================================================================== -def readUserData(dataset: Dataset) -> Union[Dict[str, Any], None]: +def readUserData(dataset: Dataset, + refresh: bool = False) -> Union[Dict[str, Any], None]: """ Read application-specific user data from the end of an IDE file. :param dataset: The `Dataset` from which to read the user data. + :param refresh:: If `True`, ignore any cached values and re-read + from the file. :return: A dictionary of user data, or `None` if no user data could be read from the file (e.g., none exists). """ + if not refresh and dataset._userdataOffset and dataset._filesize: + return dataset._userdata + doc = dataset.ebmldoc fs = doc.stream oldpos = fs.tell() - hasdata, offset, filesize = getUserDataPos(dataset) + hasdata, offset, filesize = getUserDataPos(dataset, refresh=refresh) if not hasdata: logger.debug('No user data found') + dataset._userdata = None return None try: fs.seek(offset, os.SEEK_SET) data, _next = doc.parseElement(fs) - return data.dump() + dump = data.dump() + dataset._userdata = dump + return dump finally: fs.seek(oldpos, os.SEEK_SET) @@ -95,7 +117,8 @@ def readUserData(dataset: Dataset) -> Union[Dict[str, Any], None]: #=============================================================================== def writeUserData(dataset: Dataset, - userdata: Dict[str, Any]): + userdata: Dict[str, Any], + refresh: bool = False): """ Write user data to the end of an IDE file. :param dataset: The `Dataset` from which to read the user data. @@ -103,23 +126,36 @@ def writeUserData(dataset: Dataset, existing user data. Note that the file will not get smaller if the user data is removed (or the new user data is smaller); it is just overwritten with null data (an EBML `Void` element). + :param refresh: If `True`, ignore any cached values and find the + position in the file to which to write. """ schema = dataset.ebmldoc.schema fs = dataset.ebmldoc.stream oldpos = fs.tell() try: - _hasdata, offset, filesize = getUserDataPos(dataset) - - dataBin = schema.encodes({'UserData': userdata}) - offsetBin = schema['UserDataOffset'].encode(offset, length=8, lengthSize=8) - newsize = (len(offsetBin) + len(dataBin) + offset + MIN_VOID_SIZE) - voidBin = schema['Void'].encode(None, length=max(0, filesize - newsize), - lengthSize=8) + hasdata, offset, filesize = getUserDataPos(dataset, refresh=refresh) + + if userdata: + # User data consists of a `UserData` element, a `Void`, and `UserDataOffset` + dataBin = schema.encodes({'UserData': userdata or {}}) + offsetBin = schema['UserDataOffset'].encode(offset, length=8, lengthSize=8) + newsize = (len(offsetBin) + len(dataBin) + offset + MIN_VOID_SIZE) + voidBin = schema['Void'].encode(None, length=max(0, filesize - newsize), + lengthSize=8) + else: + # No new userdata, just write 'Void' over any existing userdata + dataset._userdata = userdata + if not hasdata: + return + newsize = filesize + dataBin = offsetBin = b'' + voidBin = schema['Void'].encode(None, length=max(0, filesize - MIN_VOID_SIZE)) userblob = dataBin + voidBin + offsetBin if '+' not in fs.mode and 'w' not in fs.mode: + # File/stream is read-only; attempt to create a new file stream. if not getattr(fs, 'name', None): logger.debug(f'(userdata) Dataset stream read only (mode {fs.mode!r}) ' 'and has no name, not writing user data') @@ -134,6 +170,7 @@ def writeUserData(dataset: Dataset, fs.seek(offset, os.SEEK_SET) fs.write(userblob) + dataset._userdata = userdata logger.debug(f'(userdata) Wrote {len(userblob)} bytes to {dataset} ' f'(file was {filesize}, now {newsize})') From 656de45c45477f302cdb13568137a71d4acc54fe Mon Sep 17 00:00:00 2001 From: David Stokes Date: Wed, 10 Apr 2024 14:30:37 -0400 Subject: [PATCH 4/4] added user data tests; fixed `writeUserData()` with non-file streams --- idelib/userdata.py | 24 +++++-- testing/file_streams.py | 4 +- testing/test_userdata.py | 133 ++++++++++++++++++++++++++++++++++++++ testing/with_userdata.IDE | Bin 0 -> 137731 bytes 4 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 testing/test_userdata.py create mode 100644 testing/with_userdata.IDE diff --git a/idelib/userdata.py b/idelib/userdata.py index 5d2c666..738494d 100644 --- a/idelib/userdata.py +++ b/idelib/userdata.py @@ -4,6 +4,7 @@ the display of the `Dataset`. """ +import errno import os.path import logging from typing import Any, Dict, Optional, Tuple, Union @@ -124,8 +125,9 @@ def writeUserData(dataset: Dataset, :param dataset: The `Dataset` from which to read the user data. :param userdata: A dictionary of user data, or `None` to remove existing user data. Note that the file will not get smaller if - the user data is removed (or the new user data is smaller); - it is just overwritten with null data (an EBML `Void` element). + the user data is removed or the new set of user data is smaller + than existing user data); it is just overwritten with null data + (an EBML `Void` element). :param refresh: If `True`, ignore any cached values and find the position in the file to which to write. """ @@ -145,6 +147,7 @@ def writeUserData(dataset: Dataset, lengthSize=8) else: # No new userdata, just write 'Void' over any existing userdata + # (or do nothing if there is no existing userdata) dataset._userdata = userdata if not hasdata: return @@ -154,18 +157,27 @@ def writeUserData(dataset: Dataset, userblob = dataBin + voidBin + offsetBin - if '+' not in fs.mode and 'w' not in fs.mode: + try: + writable = fs.writable() + except AttributeError: + # In case file-like stream doesn't implement `writable()` + # (e.g., older `ebmlite.threaded_file.ThreadAwareFile`) + mode = getattr(fs, 'mode', '') + writable = '+' in mode or 'w' in mode + + if not writable: # File/stream is read-only; attempt to create a new file stream. if not getattr(fs, 'name', None): - logger.debug(f'(userdata) Dataset stream read only (mode {fs.mode!r}) ' - 'and has no name, not writing user data') - return + raise IOError(errno.EACCES, + f'Could not write user data; ' + f'Dataset stream not writable and has no filename') with open(fs.name, 'br+') as newfs: logger.debug(f'(userdata) Dataset stream read only (mode {fs.mode!r}), ' 'using new stream') newfs.seek(offset, os.SEEK_SET) newfs.write(userblob) + else: fs.seek(offset, os.SEEK_SET) fs.write(userblob) diff --git a/testing/file_streams.py b/testing/file_streams.py index 6741eff..85e5eba 100644 --- a/testing/file_streams.py +++ b/testing/file_streams.py @@ -2,7 +2,9 @@ FILES = [('./testing/SSX70065.IDE', 'rb'), ('./testing/SSX66115.IDE', 'rb'), - ('./test.ide', 'rb')] + ('./test.ide', 'rb'), + ('./testing/SSX_Data.IDE', 'rb'), + ('./testing/with_userdata.IDE', 'rb')] FILE_DICT = {} for fName, mode in FILES: diff --git a/testing/test_userdata.py b/testing/test_userdata.py new file mode 100644 index 0000000..a1874d9 --- /dev/null +++ b/testing/test_userdata.py @@ -0,0 +1,133 @@ +""" +Test reading/writing user data to/from IDE files and streams (files and +file-like). +""" + +import pytest # type: ignore + +from io import BytesIO +import os.path +import shutil + +from idelib import importer +from idelib import userdata + +from testing import file_streams + + +# ============================================================================== +# +# ============================================================================== + +USERDATA = { + 'TimebaseOffset': 12345, + 'WindowLayout': bytearray(b'bogus binary blob'), + 'TimeBaseUTC': [1712769739] +} + +SMALLER_USERDATA = { + 'TimebaseOffset': 54321, +} + +LARGER_USERDATA = { + 'TimebaseOffset': 56789, + 'WindowLayout': bytearray(b'bogus binary blob'), + 'AnnotationList': { + 'Annotation': [{'AnnotationID': 42, 'AnnotationStartTime': 101},], + }, + 'TimeBaseUTC': [35096400] +} + +FILE_WITHOUT_USERDATA = './testing/SSX_Data.IDE' +FILE_WITH_USERDATA = './testing/with_userdata.IDE' + + +# ============================================================================== +# +# ============================================================================== + +def test_read_userdata(): + """ Test reading user data. + """ + doc = importer.openFile(file_streams.makeStreamLike(FILE_WITH_USERDATA)) + data = userdata.readUserData(doc) + assert data == USERDATA + + +def test_read_userdata_no_userdata(): + """ Test reading user data from a file without user data. + """ + doc = importer.openFile(file_streams.makeStreamLike(FILE_WITHOUT_USERDATA)) + data = userdata.readUserData(doc) + assert data is None + + +def test_write_userdata(tmp_path): + """ Test writing (and re-reading) user data to a file without existing + user data. + """ + sourceFile = FILE_WITHOUT_USERDATA + filename = tmp_path / os.path.basename(sourceFile) + + shutil.copyfile(sourceFile, filename) + + with importer.importFile(filename) as doc: + userdata.writeUserData(doc, USERDATA) + + with importer.importFile(filename) as doc: + data = userdata.readUserData(doc) + assert data == USERDATA + + +def test_write_userdata_BytesIO(): + """ Test writing (and re-reading) user data from a non-file stream + without existing user data. + """ + sourceFile = FILE_WITHOUT_USERDATA + + with open(sourceFile, 'rb') as f: + stream = BytesIO(f.read()) + + with importer.openFile(stream) as doc: + userdata.writeUserData(doc, USERDATA) + + data = userdata.readUserData(doc) + assert data == USERDATA + + +def test_larger_userdata(tmp_path): + """ Test overwriting an existing set of user data with a larger one. + """ + sourceFile = FILE_WITH_USERDATA + filename = tmp_path / os.path.basename(sourceFile) + shutil.copyfile(sourceFile, filename) + + originalSize = os.path.getsize(filename) + + with importer.importFile(filename) as doc: + userdata.writeUserData(doc, LARGER_USERDATA) + + with importer.importFile(filename) as doc: + data = userdata.readUserData(doc) + assert data == LARGER_USERDATA + + assert originalSize < os.path.getsize(filename) + + +def test_smaller_userdata(tmp_path): + """ Test overwriting an existing set of user data with a smaller one. + """ + sourceFile = FILE_WITH_USERDATA + filename = tmp_path / os.path.basename(sourceFile) + shutil.copyfile(sourceFile, filename) + + originalSize = os.path.getsize(filename) + + with importer.importFile(filename) as doc: + userdata.writeUserData(doc, SMALLER_USERDATA) + + with importer.importFile(filename) as doc: + data = userdata.readUserData(doc) + assert data == SMALLER_USERDATA + + assert originalSize == os.path.getsize(filename) diff --git a/testing/with_userdata.IDE b/testing/with_userdata.IDE new file mode 100644 index 0000000000000000000000000000000000000000..36cd0aba3840deb478ae8bab89bccee7410f1dee GIT binary patch literal 137731 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 r