| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | from __future__ import absolute_import |
| | from __future__ import print_function |
| | from __future__ import unicode_literals |
| | import codecs |
| | import zlib |
| |
|
| | _wbits = -15 |
| |
|
| |
|
| | def zlib_raw_encode(input, errors='strict'): |
| | assert errors == 'strict' |
| | output = zlib.compress(input)[2:-4] |
| | return (output, len(input)) |
| |
|
| |
|
| | def zlib_raw_decode(input, errors='strict'): |
| | assert errors == 'strict' |
| | output = zlib.decompress(input, _wbits) |
| | return (output, len(input)) |
| |
|
| |
|
| | class Codec(codecs.Codec): |
| |
|
| | def encode(self, input, errors='strict'): |
| | return zlib_raw_encode(input, errors) |
| |
|
| | def decode(self, input, errors='strict'): |
| | return zlib_raw_decode(input, errors) |
| |
|
| |
|
| | class IncrementalEncoder(codecs.IncrementalEncoder): |
| | def __init__(self, errors='strict'): |
| | assert errors == 'strict' |
| | self.errors = errors |
| | self.compressobj = zlib.compressobj() |
| | self.initial = True |
| |
|
| | def encode(self, input, final=False): |
| | c = self.compressobj.compress(input) |
| | if self.initial: |
| | c = c[2:] |
| | self.initial = False |
| | if final: |
| | c += self.compressobj.flush()[:-4] |
| | return c |
| |
|
| | def reset(self): |
| | self.compressobj = zlib.compressobj() |
| |
|
| |
|
| | class IncrementalDecoder(codecs.IncrementalDecoder): |
| | def __init__(self, errors='strict'): |
| | assert errors == 'strict' |
| | self.errors = errors |
| | self.decompressobj = zlib.decompressobj(_wbits) |
| |
|
| | def decode(self, input, final=False): |
| | if final: |
| | if len(input) > 0: |
| | d = self.decompressobj.decompress(input) |
| | else: |
| | d = b'' |
| | return d + self.decompressobj.flush() |
| | else: |
| | return self.decompressobj.decompress(input) |
| |
|
| | def reset(self): |
| | self.decompressobj = zlib.decompressobj(_wbits) |
| |
|
| |
|
| | class StreamWriter(object): |
| | def __init__(self, stream, errors='strict'): |
| | assert errors == 'strict' |
| | self.stream = stream |
| | self.encoder = IncrementalEncoder(errors) |
| |
|
| | def write(self, data): |
| | raise NotImplementedError |
| |
|
| |
|
| | class StreamReader(object): |
| | def __init__(self, stream, errors='strict'): |
| | assert errors == 'strict' |
| | self.stream = stream |
| | self.decoder = IncrementalDecoder(errors) |
| | self.buffer = b'' |
| | self.offset = 0 |
| |
|
| | def read(self, size=-1): |
| | if size < 0: |
| | c = self.stream.read() |
| | d = self.buffer + self.decoder.decode(c, True) |
| | self.buffer = b'' |
| | self.offset += len(d) |
| | return d |
| |
|
| | final = False |
| | while True: |
| | if size <= len(self.buffer): |
| | d = self.buffer[:size] |
| | self.buffer = self.buffer[size:] |
| | self.offset += size |
| | return d |
| |
|
| | if final: |
| | d = self.buffer |
| | self.buffer = b'' |
| | self.offset += len(d) |
| | return d |
| |
|
| | c = self.stream.read(8196) |
| | final = len(c) < 8196 or len(c) |
| | self.buffer += self.decoder.decode(c, final) |
| |
|
| | def tell(self): |
| | return self.offset |
| |
|
| |
|
| | _codecinfo = codecs.CodecInfo( |
| | name='zlib_raw', |
| | encode=zlib_raw_encode, |
| | decode=zlib_raw_decode, |
| | incrementalencoder=IncrementalEncoder, |
| | incrementaldecoder=IncrementalDecoder, |
| | streamreader=StreamReader, |
| | streamwriter=StreamWriter, |
| | ) |
| |
|