#!/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
try:
    import cPickle as pickle
except ImportError:
    import pickle
from io import BytesIO

from os.path import basename
from errno import EPIPE

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = pickle.loads(ppds_decompressed)
    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:]

    ppds = load()
    ppds['ARCHIVE'] = BytesIO(decompress(ppds['ARCHIVE']))

    if ppd in ppds:
        start = ppds[ppd][0]
        length = ppds[ppd][1]
        ppds['ARCHIVE'].seek(start)
        return ppds['ARCHIVE'].read(length)

def main():
    usage = "usage: %prog list\n" \
            "       %prog cat URI"
    version = "%prog 0.4.9\n" \
              "Copyright (c) 2010 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
