@@ -7522,15 +7522,54 @@ def AppendFilesWithContentFromRarFile(infile, fp, extradata=[], jsondata={}, com
75227522 pass
75237523 return fp
75247524
7525+ if(not py7zr_support):
7526+ def sevenzip_readall(infile, **kwargs):
7527+ return False
7528+ else:
7529+ class _MemoryIO(py7zr.Py7zIO):
7530+ """In-memory file object used by py7zr's factory API."""
7531+ def __init__(self):
7532+ self._buf = bytearray()
7533+ def write(self, data):
7534+ # py7zr will call this repeatedly with chunks
7535+ self._buf.extend(data)
7536+ def read(self, size=None):
7537+ if size is None:
7538+ return bytes(self._buf)
7539+ return bytes(self._buf[:size])
7540+ def seek(self, offset, whence=0):
7541+ # we don't really need seeking for your use case
7542+ return 0
7543+ def flush(self):
7544+ pass
7545+ def size(self):
7546+ return len(self._buf)
7547+ class _MemoryFactory(py7zr.WriterFactory):
7548+ """Factory that creates _MemoryIO objects and keeps them by filename."""
7549+ def __init__(self):
7550+ self.files = {}
7551+ def create(self, filename: str) -> py7zr.Py7zIO:
7552+ io_obj = _MemoryIO()
7553+ self.files[filename] = io_obj
7554+ return io_obj
7555+ def sevenzip_readall(infile, **kwargs):
7556+ """
7557+ Replacement for SevenZipFile.readall() using the new py7zr API.
7558+
7559+ Returns: dict[filename -> _MemoryIO]
7560+ """
7561+ factory = _MemoryFactory()
7562+ with py7zr.SevenZipFile(infile, mode="r", **kwargs) as archive:
7563+ archive.extractall(factory=factory)
7564+ return factory.files
7565+
75257566if(not py7zr_support):
75267567 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):
75277568 return False
75287569 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):
75297570 return False
75307571else:
7531- 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):
7532- if(not hasattr(fp, "write")):
7533- return False
7572+ 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):
75347573 formver = formatspecs['format_ver']
75357574 fileheaderver = str(int(formver.replace(".", "")))
75367575 curinode = 0
@@ -7542,7 +7581,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75427581 if(not os.path.exists(infile) or not os.path.isfile(infile)):
75437582 return False
75447583 szpfp = py7zr.SevenZipFile(infile, mode="r")
7545- file_content = szpfp.readall()
7584+ try:
7585+ file_content = szpfp.readall()
7586+ except AttributeError:
7587+ file_content = sevenzip_readall(infile)
75467588 #sztest = szpfp.testzip()
75477589 sztestalt = szpfp.test()
75487590 if(sztestalt):
@@ -7565,14 +7607,8 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
75657607 fcsize = format(int(0), 'x').lower()
75667608 flinkcount = 0
75677609 fblksize = 0
7568- if(hasattr(fstatinfo, "st_blksize")):
7569- fblksize = format(int(fstatinfo.st_blksize), 'x').lower()
75707610 fblocks = 0
7571- if(hasattr(fstatinfo, "st_blocks")):
7572- fblocks = format(int(fstatinfo.st_blocks), 'x').lower()
75737611 fflags = 0
7574- if(hasattr(fstatinfo, "st_flags")):
7575- fflags = format(int(fstatinfo.st_flags), 'x').lower()
75767612 ftype = 0
75777613 if(member.is_directory):
75787614 ftype = 5
@@ -7639,7 +7675,10 @@ def AppendFilesWithContentFromSevenZipFile(infile, extradata=[], jsondata={}, co
76397675 typechecktest = CheckCompressionType(fcontents, filestart=0, closefp=False)
76407676 fcontents.seek(0, 0)
76417677 fcencoding = GetFileEncoding(fcontents, 0, False)[0]
7642- file_content[member.filename].close()
7678+ try:
7679+ file_content[member.filename].close()
7680+ except AttributeError:
7681+ pass
76437682 if(typechecktest is False and not compresswholefile):
76447683 fcontents.seek(0, 2)
76457684 ucfsize = fcontents.tell()
@@ -11914,7 +11953,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1191411953 lcfi = 0
1191511954 returnval = {}
1191611955 szpfp = py7zr.SevenZipFile(infile, mode="r")
11917- file_content = szpfp.readall()
11956+ try:
11957+ file_content = szpfp.readall()
11958+ except AttributeError:
11959+ file_content = sevenzip_readall(infile)
1191811960 #sztest = szpfp.testzip()
1191911961 sztestalt = szpfp.test()
1192011962 if(sztestalt):
@@ -11958,7 +12000,10 @@ def SevenZipFileListFiles(infile, verbose=False, returnfp=False):
1195812000 printfname = member.filename
1195912001 if(ftype == 0):
1196012002 fsize = len(file_content[member.filename].read())
11961- file_content[member.filename].close()
12003+ try:
12004+ file_content[member.filename].close()
12005+ except AttributeError:
12006+ pass
1196212007 try:
1196312008 fuid = int(os.getuid())
1196412009 except (KeyError, AttributeError):
0 commit comments