@@ -7523,15 +7523,54 @@ def AppendFilesWithContentFromRarFile(infile, fp, extradata=[], jsondata={}, com
75237523 pass
75247524 return fp
75257525
7526+ if(not py7zr_support):
7527+ def sevenzip_readall(infile, **kwargs):
7528+ return False
7529+ else:
7530+ class _MemoryIO(py7zr.Py7zIO):
7531+ """In-memory file object used by py7zr's factory API."""
7532+ def __init__(self):
7533+ self._buf = bytearray()
7534+ def write(self, data):
7535+ # py7zr will call this repeatedly with chunks
7536+ self._buf.extend(data)
7537+ def read(self, size=None):
7538+ if size is None:
7539+ return bytes(self._buf)
7540+ return bytes(self._buf[:size])
7541+ def seek(self, offset, whence=0):
7542+ # we don't really need seeking for your use case
7543+ return 0
7544+ def flush(self):
7545+ pass
7546+ def size(self):
7547+ return len(self._buf)
7548+ class _MemoryFactory(py7zr.WriterFactory):
7549+ """Factory that creates _MemoryIO objects and keeps them by filename."""
7550+ def __init__(self):
7551+ self.files = {}
7552+ def create(self, filename: str) -> py7zr.Py7zIO:
7553+ io_obj = _MemoryIO()
7554+ self.files[filename] = io_obj
7555+ return io_obj
7556+ def sevenzip_readall(infile, **kwargs):
7557+ """
7558+ Replacement for SevenZipFile.readall() using the new py7zr API.
7559+
7560+ Returns: dict[filename -> _MemoryIO]
7561+ """
7562+ factory = _MemoryFactory()
7563+ with py7zr.SevenZipFile(infile, mode="r", **kwargs) as archive:
7564+ archive.extractall(factory=factory)
7565+ return factory.files
7566+
75267567if(not py7zr_support):
75277568 def AppendFilesWithContentFromSevenZipFileToList(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75287569 return False
75297570 def AppendFilesWithContentFromSevenZipFile(infile, fp, extradata=[], jsondata={}, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75307571 return False
75317572else:
7532- def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
7533- if(not hasattr(fp, "write")):
7534- return False
7573+ def AppendFilesWithContentFromSevenZipFileToList(infile, extradata=[], jsondata={}, contentasfile=False, compression="auto", compresswholefile=True, compressionlevel=None, compressionuselist=compressionlistalt, checksumtype=["md5", "md5", "md5"], formatspecs=__file_format_dict__, saltkey=None, verbose=False):
75357574 formver = formatspecs['format_ver']
75367575 fileheaderver = str(int(formver.replace(".", "")))
75377576 curinode = 0
@@ -7543,7 +7582,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75437582 if(not os.path.exists(infile) or not os.path.isfile(infile)):
75447583 return False
75457584 szpfp = py7zr.SevenZipFile(infile, mode="r")
7546- file_content = szpfp.readall()
7585+ try:
7586+ file_content = szpfp.readall()
7587+ except AttributeError:
7588+ file_content = sevenzip_readall(infile)
75477589 #sztest = szpfp.testzip()
75487590 sztestalt = szpfp.test()
75497591 if(sztestalt):
@@ -7566,14 +7608,8 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75667608 fcsize = format(int(0), 'x').lower()
75677609 flinkcount = 0
75687610 fblksize = 0
7569- if(hasattr(fstatinfo, "st_blksize")):
7570- fblksize = format(int(fstatinfo.st_blksize), 'x').lower()
75717611 fblocks = 0
7572- if(hasattr(fstatinfo, "st_blocks")):
7573- fblocks = format(int(fstatinfo.st_blocks), 'x').lower()
75747612 fflags = 0
7575- if(hasattr(fstatinfo, "st_flags")):
7576- fflags = format(int(fstatinfo.st_flags), 'x').lower()
75777613 ftype = 0
75787614 if(member.is_directory):
75797615 ftype = 5
@@ -7640,7 +7676,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
76407676 typechecktest = CheckCompressionType(fcontents, filestart=0, closefp=False)
76417677 fcontents.seek(0, 0)
76427678 fcencoding = GetFileEncoding(fcontents, 0, False)[0]
7643- file_content[member.filename].close()
7679+ try:
7680+ file_content[member.filename].close()
7681+ except AttributeError:
7682+ pass
76447683 if(typechecktest is False and not compresswholefile):
76457684 fcontents.seek(0, 2)
76467685 ucfsize = fcontents.tell()
@@ -11915,7 +11954,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1191511954 lcfi = 0
1191611955 returnval = {}
1191711956 szpfp = py7zr.SevenZipFile(infile, mode="r")
11918- file_content = szpfp.readall()
11957+ try:
11958+ file_content = szpfp.readall()
11959+ except AttributeError:
11960+ file_content = sevenzip_readall(infile)
1191911961 #sztest = szpfp.testzip()
1192011962 sztestalt = szpfp.test()
1192111963 if(sztestalt):
@@ -11959,7 +12001,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1195912001 printfname = member.filename
1196012002 if(ftype == 0):
1196112003 fsize = len(file_content[member.filename].read())
11962- file_content[member.filename].close()
12004+ try:
12005+ file_content[member.filename].close()
12006+ except AttributeError:
12007+ pass
1196312008 try:
1196412009 fuid = int(os.getuid())
1196512010 except (KeyError, AttributeError):
0 commit comments