#!/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
