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