laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/37652?usp=email )
Change subject: pySim.filesystem: Add Path for abstraction/utility around file system paths ......................................................................
pySim.filesystem: Add Path for abstraction/utility around file system paths
Change-Id: I202baa378988431a318850e3593ff1929d94d268 --- M pySim/filesystem.py 1 file changed, 55 insertions(+), 1 deletion(-)
Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved
diff --git a/pySim/filesystem.py b/pySim/filesystem.py index 5414fb9..0c7d51d 100644 --- a/pySim/filesystem.py +++ b/pySim/filesystem.py @@ -9,7 +9,7 @@ not the actual contents / runtime state of interacting with a given smart card. """
-# (C) 2021 by Harald Welte laforge@osmocom.org +# (C) 2021-2024 by Harald Welte laforge@osmocom.org # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -1448,3 +1448,48 @@ for m in CardModel.__subclasses__(): if m.match(scc): m.add_files(rs) + + +class Path: + """Representation of a file-system path.""" + def __init__(self, p: Union[str, List[str]]): + # split if given as single string with slahes + if isinstance(p, str): + p = p.split('/') + # make sure internal representation alwas is uppercase only + self.list = [x.upper() for x in p] + + def __str__(self) -> str: + return '/'.join(self.list) + + def __repr__(self) -> str: + return 'Path(%s)' % (str(self)) + + def __eq__(self, other: 'Path') -> bool: + return self.list == other.list + + def __getitem__(self, i): + return self.list[i] + + def __add__(self, a): + if isinstance(a, list): + l = self.list + a + elif isinstance(a, Path): + l = self.list + a.list + else: + l = self.list + [a] + return Path(l) + + def relative_to_mf(self) -> 'Path': + """Return a path relative to MF, i.e. without initial explicit MF.""" + if self.list[0] == 'MF': + return Path(self.list[1:]) + return self + + def is_parent(self, other: 'Path') -> bool: + """Is this instance a parent of the given other instance?""" + if len(self.list) >= len(other.list): + return False + if other.list[:len(self.list)] == self.list: + return True + return False