def iso_path_to_rr_name(iso_path, interchange_level, is_dir): # type: (str, int, bool) -> str ''' A method to take an absolute ISO path and generate a corresponding Rock Ridge basename. Parameters: iso_path - The absolute iso_path to generate a Rock Ridge name from. interchange_level - The interchange level at which to operate. is_dir - Whether this will be a directory or not. Returns: The Rock Ridge name as a string. ''' if iso_path[0] != '/': raise pycdlibexception.PyCdlibInvalidInput( "iso_path must start with '/'") namesplit = utils.split_path(utils.normpath(iso_path)) iso_name = namesplit.pop() if is_dir: rr_name = utils.mangle_dir_for_iso9660(iso_name.decode('utf-8'), interchange_level) else: basename, ext = utils.mangle_file_for_iso9660(iso_name.decode('utf-8'), interchange_level) rr_name = '.'.join([basename, ext]) return rr_name
def _rr_path_to_iso_path_and_rr_name(self, rr_path, is_dir): # type: (str, bool) -> Tuple[str, str] ''' An internal method to split a Rock Ridge absolute path into an absolute ISO9660 path and a Rock Ridge name. This is accomplished by finding the Rock Ridge directory record of the parent, then reconstructing the ISO parent path by walking up to the root. Parameters: rr_path - The absolute Rock Ridge path to generate for. is_dir - Whether this path is a directory or a file. Returns: A tuple where the first element is the absolute ISO9660 path of the parent, and the second element is the Rock Ridge name. ''' if rr_path[0] != '/': raise pycdlibexception.PyCdlibInvalidInput( "rr_path must start with '/'") namesplit = utils.split_path(utils.normpath(rr_path)) rr_name = namesplit.pop() rr_parent_path = b'/' + b'/'.join(namesplit) parent_record = self.pycdlib_obj._find_rr_record(rr_parent_path) # pylint: disable=protected-access if parent_record.is_root: iso_parent_path = b'/' else: iso_parent_path = b'' parent = parent_record # type: Optional[dr.DirectoryRecord] while parent is not None: if not parent.is_root: iso_parent_path = b'/' + parent.file_identifier( ) + iso_parent_path parent = parent.parent if is_dir: iso_name = utils.mangle_dir_for_iso9660( rr_name.decode('utf-8'), self.pycdlib_obj.interchange_level) else: basename, ext = utils.mangle_file_for_iso9660( rr_name.decode('utf-8'), self.pycdlib_obj.interchange_level) iso_name = '.'.join([basename, ext]) iso_path = iso_parent_path.decode('utf-8') + '/' + iso_name return iso_path, rr_name.decode('utf-8')