From 2d38eb235aebe6fc395b75119d1bae5ac7a88fab Mon Sep 17 00:00:00 2001 From: Faik Uygur Date: Thu, 13 Apr 2006 20:46:33 +0000 Subject: [PATCH] * crc problemi icin pylzma.compressobj implement edilene kadar dosya bir kerede okunsun * archive zipfileext kullansin, default 7ZIP olsun --- pisi/archive.py | 8 ++-- pisi/zipfileext.py | 94 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/pisi/archive.py b/pisi/archive.py index c5c7ec25..fba5c8ab 100644 --- a/pisi/archive.py +++ b/pisi/archive.py @@ -17,7 +17,7 @@ import os import stat import shutil import tarfile -import zipfile +import zipfileext import gettext __trans = gettext.translation('pisi', fallback=True) @@ -105,7 +105,7 @@ class ArchiveZip(ArchiveBase): def __init__(self, file_path, arch_type = "zip", mode = 'r'): super(ArchiveZip, self).__init__(file_path, arch_type) - self.zip_obj = zipfile.ZipFile(self.file_path, mode) + self.zip_obj = zipfileext.ZipFileExt(self.file_path, mode) def close(self): """Close the zip archive.""" @@ -124,13 +124,13 @@ class ArchiveZip(ArchiveBase): else: if os.path.islink(file_name): dest = os.readlink(file_name) - attr = zipfile.ZipInfo() + attr = zipfileext.ZipInfo() attr.filename = file_name attr.create_system = 3 attr.external_attr = self.symmagic self.zip_obj.writestr(attr, dest) else: - self.zip_obj.write(file_name, file_name, zipfile.ZIP_DEFLATED) + self.zip_obj.write(file_name, file_name, zipfileext.ZIP_7ZIP) zinfo = self.zip_obj.getinfo(file_name) zinfo.create_system = 3 diff --git a/pisi/zipfileext.py b/pisi/zipfileext.py index cb1ec121..2197dc09 100644 --- a/pisi/zipfileext.py +++ b/pisi/zipfileext.py @@ -90,6 +90,84 @@ class SevenZipFileEntry: self.finished = 1 del self.fp +class ZipFileEntry: + """File-like object used to read an uncompressed entry in a ZipFile""" + + def __init__(self, fp, length): + self.fp = fp + self.readBytes = 0 + self.length = length + self.finished = 0 + + def tell(self): + return self.readBytes + + def read(self, n=None): + if n is None: + n = self.length - self.readBytes + if n == 0 or self.finished: + return '' + + data = self.fp.read(n) + self.readBytes += len(data) + if self.readBytes == self.length or len(data) < n: + self.finished = 1 + return data + + def close(self): + self.finished = 1 + del self.fp + + +class DeflatedZipFileEntry: + """File-like object used to read a deflated entry in a ZipFile""" + + def __init__(self, fp, length): + self.fp = fp + self.returnedBytes = 0 + self.readBytes = 0 + self.decomp = zlib.decompressobj(-15) + self.buffer = "" + self.length = length + self.finished = 0 + + def tell(self): + return self.returnedBytes + + def read(self, n=None): + if self.finished: + return "" + if n is None: + result = [self.buffer,] + result.append(self.decomp.decompress(self.fp.read(self.length - self.readBytes))) + result.append(self.decomp.decompress("Z")) + result.append(self.decomp.flush()) + self.buffer = "" + self.finished = 1 + result = "".join(result) + self.returnedBytes += len(result) + return result + else: + while len(self.buffer) < n: + data = self.fp.read(min(n, 1024, self.length - self.readBytes)) + self.readBytes += len(data) + if not data: + result = self.buffer + self.decomp.decompress("Z") + self.decomp.flush() + self.finished = 1 + self.buffer = "" + self.returnedBytes += len(result) + return result + else: + self.buffer += self.decomp.decompress(data) + result = self.buffer[:n] + self.buffer = self.buffer[n:] + self.returnedBytes += len(result) + return result + + def close(self): + self.finished = 1 + del self.fp + class ZipFileExt(ZipFile): def _writecheck(self, zinfo): @@ -148,7 +226,7 @@ class ZipFileExt(ZipFile): cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15) else: - cmpr = None + cmpr = None while 1: buf = fp.read(1024 * 8) @@ -169,15 +247,13 @@ class ZipFileExt(ZipFile): else: zinfo.compress_size = file_size - # unfortunately pylzma.compressobj is not implemented yet elif zinfo.compress_type == ZIP_7ZIP: - cmp_fp = pylzma.compressfile(fp, eos=1) - compressed = '' - while True: - tmp = cmp_fp.read(1024 * 8) - if not tmp: - break - compressed += tmp + # unfortunately pylzma.compressobj is not implemented yet. + # So in order to calculate the CRC, we are going to read + # all the file at once until it is implemented. + buf = fp.read() + CRC = binascii.crc32(buf, CRC) + compressed = pylzma.compress(buf, eos=1) self.fp.write(compressed) zinfo.compress_size = len(compressed)