#!/usr/bin/env python3

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a byte array with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a byte array with the xz binary"""

    process = Popen(["xz", "--decompress", "--stdout", "--force"],
                    stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def compress_file(path):
    """Compress the file at 'path' with the xz binary"""

    process = Popen(["xz", "--compress", "--force", "--stdout", path], stdout=PIPE)
    return process.communicate()[0]

# compressor.py

import os
import sys
from optparse import OptionParser
from sys import argv
import base64
import json
from io import BytesIO

from os.path import basename
from errno import EPIPE
import lzma

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = json.loads(ppds_decompressed.decode(encoding='ASCII'))
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.items():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            try:
                print(ppd.replace('"', '"' + binary_name + ':', 1))
            except IOError as e:
                # Errors like broken pipes (program which takes the standard
                # output terminates before this program terminates) should not
                # generate a traceback.
                if e.errno == EPIPE: exit(0)
                raise

def cat(ppd):
    # Ignore driver's name, take only PPD's
    ppd = ppd.split(":")[-1]
    # Remove also the index
    ppd = "0/" + ppd[ppd.find("/")+1:]

    # Object for streaming decompression
    decompressor = lzma.LZMADecompressor()
    # size for one decompression i.e. ~20MB
    size = 20000000

    ppds = load()
    ppds['ARCHIVE'] = base64.b64decode(ppds['ARCHIVE'].encode('ASCII'))
    ppdtext=bytearray()

    if ppd in ppds:
        start = ppds[ppd][0]
        length = ppds[ppd][1]

        text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
        for i in range(int(start/size)):
            text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
        text.seek(start%size)

        if((size-(start%size)) < length):
            ppdtext.extend(text.read())
            length = length - (size-(start%size))
            text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
            while(size < length):
                ppdtext.extend(text.read())
                length = length - size
                text = BytesIO(decompressor.decompress(ppds['ARCHIVE'],size))
            ppdtext.extend(text.read(length))
        else:
            ppdtext.extend(text.read(length))
        
        return ppdtext

def main():
    usage = "usage: %prog list\n" \
            "       %prog cat URI"
    version = "%prog 1.1.0\n" \
              "Copyright (c) 2013 Vitor Baptista.\n" \
              "This is free software; see the source for copying conditions.\n" \
              "There is NO warranty; not even for MERCHANTABILITY or\n" \
              "FITNESS FOR A PARTICULAR PURPOSE."
    parser = OptionParser(usage=usage,
                          version=version)
    (options, args) = parser.parse_args()

    if len(args) == 0 or len(args) > 2:
        parser.error("incorrect number of arguments")

    if args[0].lower() == 'list':
        ls()
    elif args[0].lower() == 'cat':
        if not len(args) == 2:
            parser.error("incorrect number of arguments")
        ppd = cat(args[1])
        if not ppd:
            parser.error("Printer '%s' does not have default driver!" % args[1])
        try:
            # avoid any assumption of encoding or system locale; just print the
            # bytes of the PPD as they are
            if sys.version_info.major < 3:
                sys.stdout.write(ppd)
            else:
                sys.stdout.buffer.write(ppd)
        except IOError as e:
            # Errors like broken pipes (program which takes the standard output
            # terminates before this program terminates) should not generate a
            # traceback.
            if e.errno == EPIPE: exit(0)
            raise
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = b"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"

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # We don't want a KeyboardInterrupt throwing a
        # traceback into stdout.
        pass
