def encode(inputStream, outputStream, intervalLength, options): Coder.checkInterval(intervalLength) encoder = Encoder(inputStream, outputStream, options) header = Long(Coder.HeaderValue.a, Coder.HeaderValue.b, Coder.HeaderValue.c, Coder.HeaderValue.d) for i in xrange(8): outputStream.writeByte(header.a >> 8) header.shl8() packedOptions = options.toPacked() for i in xrange(8): outputStream.writeByte(packedOptions.a >> 8) packedOptions.shl8() Coder.doEncode(encoder, intervalLength)
def getOptions(inputStream): header = Long(0, 0, 0, 0) for i in xrange(8): header.shl8() inputByte = inputStream.readByte() if inputByte == -1: raise IOError("Unexpected end of file.") header.d |= inputByte if (header.a != Coder.HeaderValue.a) | (header.b != Coder.HeaderValue.b) | (header.c != Coder.HeaderValue.c) | (header.d != Coder.HeaderValue.d): raise IOError("Wrong file header. Probably not a compressed file.") return Coder.getOptionsHeaderless(inputStream)
def getOptionsHeaderless(inputStream): packedOptions = Long(0, 0, 0, 0) for i in xrange(8): packedOptions.shl8() inputByte = inputStream.readByte() if inputByte == -1: raise IOError("Unexpected end of file.") packedOptions.d |= inputByte result = Options.fromPacked(packedOptions) if result is None: raise ValueError("Invalid compression options.") else: return result
class Coder(object): HeaderValue = Long(0x208b, 0xbb9f, 0x5b12, 0x98be) @staticmethod def getOptions(inputStream): header = Long(0, 0, 0, 0) for i in xrange(8): header.shl8() inputByte = inputStream.readByte() if inputByte == -1: raise IOError("Unexpected end of file.") header.d |= inputByte if (header.a != Coder.HeaderValue.a) | (header.b != Coder.HeaderValue.b) | (header.c != Coder.HeaderValue.c) | (header.d != Coder.HeaderValue.d): raise IOError("Wrong file header. Probably not a compressed file.") return Coder.getOptionsHeaderless(inputStream) @staticmethod def getOptionsHeaderless(inputStream): packedOptions = Long(0, 0, 0, 0) for i in xrange(8): packedOptions.shl8() inputByte = inputStream.readByte() if inputByte == -1: raise IOError("Unexpected end of file.") packedOptions.d |= inputByte result = Options.fromPacked(packedOptions) if result is None: raise ValueError("Invalid compression options.") else: return result @staticmethod def checkInterval(intervalLength): if intervalLength <= 0: raise ValueError("Interval length has to be positive.") @staticmethod def decode(inputStream, outputStream, intervalLength): Coder.checkInterval(intervalLength) options = Coder.getOptions(inputStream) Coder.decodeRaw(inputStream, outputStream, intervalLength, options) @staticmethod def decodeRaw(inputStream, outputStream, intervalLength, options): Coder.checkInterval(intervalLength) decoder = Decoder(inputStream, outputStream, options) amountProcessed = 0 while not decoder.decode(intervalLength): amountProcessed += intervalLength @staticmethod def encode(inputStream, outputStream, intervalLength, options): Coder.checkInterval(intervalLength) encoder = Encoder(inputStream, outputStream, options) header = Long(Coder.HeaderValue.a, Coder.HeaderValue.b, Coder.HeaderValue.c, Coder.HeaderValue.d) for i in xrange(8): outputStream.writeByte(header.a >> 8) header.shl8() packedOptions = options.toPacked() for i in xrange(8): outputStream.writeByte(packedOptions.a >> 8) packedOptions.shl8() Coder.doEncode(encoder, intervalLength) @staticmethod def encodeRaw(inputStream, outputStream, intervalLength, options): Coder.checkInterval(intervalLength) encoder = Encoder(inputStream, outputStream, options) Coder.doEncode(encoder, intervalLength) @staticmethod def doEncode(encoder, intervalLength): amountProcessed = 0 while not encoder.encode(intervalLength): amountProcessed += intervalLength encoder.flush()