Esempio n. 1
0
 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)
Esempio n. 2
0
 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)
Esempio n. 3
0
 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
Esempio n. 4
0
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()