102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl"""Python 'zlib_codec' Codec - zlib compression encoding. 202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 3e5cb836d4c481ad8ec6f5e0b611f7162c30a8abbR David MurrayThis codec de/encodes from bytes to bytes. 402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 502524629f39bb70f4ea00ab8e64d694e08719227Georg BrandlWritten by Marc-Andre Lemburg (mal@lemburg.com). 602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl""" 702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlimport codecs 902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlimport zlib # this codec needs the optional zlib module ! 1002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 1102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl### Codec APIs 1202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 1302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandldef zlib_encode(input, errors='strict'): 1402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl assert errors == 'strict' 1502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return (zlib.compress(input), len(input)) 1602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 1702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandldef zlib_decode(input, errors='strict'): 1802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl assert errors == 'strict' 1902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return (zlib.decompress(input), len(input)) 2002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 2102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlclass Codec(codecs.Codec): 2202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def encode(self, input, errors='strict'): 2302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return zlib_encode(input, errors) 2402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def decode(self, input, errors='strict'): 2502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return zlib_decode(input, errors) 2602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 2702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlclass IncrementalEncoder(codecs.IncrementalEncoder): 2802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def __init__(self, errors='strict'): 2902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl assert errors == 'strict' 3002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.errors = errors 3102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.compressobj = zlib.compressobj() 3202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 3302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def encode(self, input, final=False): 3402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl if final: 3502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl c = self.compressobj.compress(input) 3602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return c + self.compressobj.flush() 3702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl else: 3802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return self.compressobj.compress(input) 3902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 4002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def reset(self): 4102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.compressobj = zlib.compressobj() 4202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 4302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlclass IncrementalDecoder(codecs.IncrementalDecoder): 4402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def __init__(self, errors='strict'): 4502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl assert errors == 'strict' 4602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.errors = errors 4702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.decompressobj = zlib.decompressobj() 4802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 4902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def decode(self, input, final=False): 5002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl if final: 5102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl c = self.decompressobj.decompress(input) 5202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return c + self.decompressobj.flush() 5302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl else: 5402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return self.decompressobj.decompress(input) 5502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 5602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl def reset(self): 5702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl self.decompressobj = zlib.decompressobj() 5802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 5902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlclass StreamWriter(Codec, codecs.StreamWriter): 6002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl charbuffertype = bytes 6102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 6202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandlclass StreamReader(Codec, codecs.StreamReader): 6302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl charbuffertype = bytes 6402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 6502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl### encodings module API 6602524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl 6702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandldef getregentry(): 6802524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl return codecs.CodecInfo( 6902524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl name='zlib', 7002524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl encode=zlib_encode, 7102524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl decode=zlib_decode, 7202524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl incrementalencoder=IncrementalEncoder, 7302524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl incrementaldecoder=IncrementalDecoder, 7402524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl streamreader=StreamReader, 7502524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl streamwriter=StreamWriter, 7694ee389308ec9e0e07b3f7a944d5179aba540c5eSerhiy Storchaka _is_text_encoding=False, 7702524629f39bb70f4ea00ab8e64d694e08719227Georg Brandl ) 78