10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" Python 'zlib_codec' Codec - zlib compression encoding 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Unlike most of the other codecs which target Unicode, this codec 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao will return Python string objects for both encode and decode. 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Written by Marc-Andre Lemburg (mal@lemburg.com). 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport codecs 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport zlib # this codec needs the optional zlib module ! 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao### Codec APIs 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef zlib_encode(input,errors='strict'): 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ Encodes the object input and returns a tuple (output 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao object, length consumed). 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao errors defines the error handling to apply. It defaults to 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'strict' handling which is the only currently supported 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao error handling for this codec. 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao assert errors == 'strict' 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao output = zlib.compress(input) 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return (output, len(input)) 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef zlib_decode(input,errors='strict'): 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ Decodes the object input and returns a tuple (output 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao object, length consumed). 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao input must be an object which provides the bf_getreadbuf 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao buffer slot. Python strings, buffer objects and memory 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao mapped files are examples of objects providing this slot. 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao errors defines the error handling to apply. It defaults to 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 'strict' handling which is the only currently supported 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao error handling for this codec. 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao assert errors == 'strict' 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao output = zlib.decompress(input) 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return (output, len(input)) 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass Codec(codecs.Codec): 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def encode(self, input, errors='strict'): 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return zlib_encode(input, errors) 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def decode(self, input, errors='strict'): 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return zlib_decode(input, errors) 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass IncrementalEncoder(codecs.IncrementalEncoder): 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, errors='strict'): 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao assert errors == 'strict' 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.errors = errors 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.compressobj = zlib.compressobj() 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def encode(self, input, final=False): 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if final: 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = self.compressobj.compress(input) 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return c + self.compressobj.flush() 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.compressobj.compress(input) 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def reset(self): 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.compressobj = zlib.compressobj() 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass IncrementalDecoder(codecs.IncrementalDecoder): 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, errors='strict'): 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao assert errors == 'strict' 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.errors = errors 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.decompressobj = zlib.decompressobj() 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def decode(self, input, final=False): 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if final: 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao c = self.decompressobj.decompress(input) 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return c + self.decompressobj.flush() 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.decompressobj.decompress(input) 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def reset(self): 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.decompressobj = zlib.decompressobj() 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StreamWriter(Codec,codecs.StreamWriter): 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass StreamReader(Codec,codecs.StreamReader): 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao### encodings module API 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef getregentry(): 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return codecs.CodecInfo( 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao name='zlib', 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao encode=zlib_encode, 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao decode=zlib_decode, 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao incrementalencoder=IncrementalEncoder, 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao incrementaldecoder=IncrementalDecoder, 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao streamreader=StreamReader, 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao streamwriter=StreamWriter, 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ) 103