@@ -7516,15 +7516,54 @@ def AppendFilesWithContentFromRarFile(infile, fp, extradata=[], jsondata={}, com
75167516 pass
75177517 return fp
75187518
7519+ if(not py7zr_support):
7520+ def sevenzip_readall(infile, **kwargs):
7521+ return False
7522+ else:
7523+ class _MemoryIO(py7zr.Py7zIO):
7524+ """In-memory file object used by py7zr's factory API."""
7525+ def __init__(self):
7526+ self._buf = bytearray()
7527+ def write(self, data):
7528+ # py7zr will call this repeatedly with chunks
7529+ self._buf.extend(data)
7530+ def read(self, size=None):
7531+ if size is None:
7532+ return bytes(self._buf)
7533+ return bytes(self._buf[:size])
7534+ def seek(self, offset, whence=0):
7535+ # we don't really need seeking for your use case
7536+ return 0
7537+ def flush(self):
7538+ pass
7539+ def size(self):
7540+ return len(self._buf)
7541+ class _MemoryFactory(py7zr.WriterFactory):
7542+ """Factory that creates _MemoryIO objects and keeps them by filename."""
7543+ def __init__(self):
7544+ self.files = {}
7545+ def create(self, filename: str) -> py7zr.Py7zIO:
7546+ io_obj = _MemoryIO()
7547+ self.files[filename] = io_obj
7548+ return io_obj
7549+ def sevenzip_readall(infile, **kwargs):
7550+ """
7551+ Replacement for SevenZipFile.readall() using the new py7zr API.
7552+
7553+ Returns: dict[filename -> _MemoryIO]
7554+ """
7555+ factory = _MemoryFactory()
7556+ with py7zr.SevenZipFile(infile, mode="r", **kwargs) as archive:
7557+ archive.extractall(factory=factory)
7558+ return factory.files
7559+
75197560if(not py7zr_support):
75207561 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):
75217562 return False
75227563 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):
75237564 return False
75247565else:
7525- 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):
7526- if(not hasattr(fp, "write")):
7527- return False
7566+ 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):
75287567 formver = formatspecs['format_ver']
75297568 fileheaderver = str(int(formver.replace(".", "")))
75307569 curinode = 0
@@ -7536,7 +7575,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75367575 if(not os.path.exists(infile) or not os.path.isfile(infile)):
75377576 return False
75387577 szpfp = py7zr.SevenZipFile(infile, mode="r")
7539- file_content = szpfp.readall()
7578+ try:
7579+ file_content = szpfp.readall()
7580+ except AttributeError:
7581+ file_content = sevenzip_readall(infile)
75407582 #sztest = szpfp.testzip()
75417583 sztestalt = szpfp.test()
75427584 if(sztestalt):
@@ -7559,14 +7601,8 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75597601 fcsize = format(int(0), 'x').lower()
75607602 flinkcount = 0
75617603 fblksize = 0
7562- if(hasattr(fstatinfo, "st_blksize")):
7563- fblksize = format(int(fstatinfo.st_blksize), 'x').lower()
75647604 fblocks = 0
7565- if(hasattr(fstatinfo, "st_blocks")):
7566- fblocks = format(int(fstatinfo.st_blocks), 'x').lower()
75677605 fflags = 0
7568- if(hasattr(fstatinfo, "st_flags")):
7569- fflags = format(int(fstatinfo.st_flags), 'x').lower()
75707606 ftype = 0
75717607 if(member.is_directory):
75727608 ftype = 5
@@ -7633,7 +7669,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
76337669 typechecktest = CheckCompressionType(fcontents, filestart=0, closefp=False)
76347670 fcontents.seek(0, 0)
76357671 fcencoding = GetFileEncoding(fcontents, 0, False)[0]
7636- file_content[member.filename].close()
7672+ try:
7673+ file_content[member.filename].close()
7674+ except AttributeError:
7675+ pass
76377676 if(typechecktest is False and not compresswholefile):
76387677 fcontents.seek(0, 2)
76397678 ucfsize = fcontents.tell()
@@ -11908,7 +11947,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1190811947 lcfi = 0
1190911948 returnval = {}
1191011949 szpfp = py7zr.SevenZipFile(infile, mode="r")
11911- file_content = szpfp.readall()
11950+ try:
11951+ file_content = szpfp.readall()
11952+ except AttributeError:
11953+ file_content = sevenzip_readall(infile)
1191211954 #sztest = szpfp.testzip()
1191311955 sztestalt = szpfp.test()
1191411956 if(sztestalt):
@@ -11952,7 +11994,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1195211994 printfname = member.filename
1195311995 if(ftype == 0):
1195411996 fsize = len(file_content[member.filename].read())
11955- file_content[member.filename].close()
11997+ try:
11998+ file_content[member.filename].close()
11999+ except AttributeError:
12000+ pass
1195612001 try:
1195712002 fuid = int(os.getuid())
1195812003 except (KeyError, AttributeError):
0 commit comments