#!/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 1.0.2\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"/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4BCpDe1dAEAAyynXgKBj/e5G4gCSMATQzhvxrUqAvGHHOKddyA3C5zAyHT1wT3KRO/PwS4QKkqio6flVyYBqvIdgvkrUVko/I7swkwRdWf4J7+OKk8C42qe5TIBCSfga1KLUO6aonDgA8W4wLL/fN99dfytZAkFXFEud4qsGIIugq8BB0VsXEGaMk7CrQImtFgdkcWIt6a442KsWEN2V5v0RCq58FcwU9nxTdoIUKTURxl2IJ7lUaWvsR8jJt+TtJJiZxBbqlK55y1CdNQVgwrabv620xBHSjpAjYwSSR9cXbg1d7VGXjE4QFdT+azNNeOXEz0h+P57zyUwkBSeg+3EmXFdP8BpxdX/TBpT0+0IAd0vL9fP/aFH9QFqI0fJ56CE/OKlwstyOP4DcstF/lqaMCkV6KROnCXhl9ZHMNrM4K7YyZGKcWaGq4edLPpIjZHC4GBduu9ExS9jrvpe9W0bmboun+jVO85bVwq6UspzPOP8FXI3Z3a6jwAVWypKpRZfpTZcTgHIOpd+7q0HY8CI/WnnEZtb8upWE01pnUWhvjTZ9iwmgUri2mLeH3xKaG25hfECnL3J7jDtax67VN+ad52YmhGwKBOD4n5djrfpx8rapHsRRZfiTxbsVq/NNq+X1ud4R5NqJ40R01C+o6jnV34AdJz2h42S/C5cyVWFzZIiqgV+2vy/TDmyBJYHoi++iMsLyXiuzB+a7NO0uLrFinN119kPhtgq0kcZzgjUCHyyzfbiLJAiNozuRNRZ3ojPbHRqEwmpZ2cwZDCvcqyfHq5AXpYnKuiNNYZiZy79U02cV2RtYoioS3jlZGnyeqiHDn7Bkzytp/q6W+t7T0wI8DTbY2g3UPYNnC6JOwniD4HILBxY3gyzg+1qcuqaLzd6HNVgeQtZP9+lbXQGo4ZU1jRkE+nTV3/F2Qn+mAn1neAT6k3p4HzffcO5vbFQq0l3XQuCnDj3yG/f7cg4S9dXUa/MVWPwHyjcOYrFiHsFdjiIJ88Q9mWBUceY1COsUS/4B8hgbbJZXqunpsfyx/3dYKzObW84Z3w0hgpYdohXyE22XQ2trfjxV49OcoIfYR6eEX9xuzTWq1u8/ozOoqvcJfhsbQ6lDxv4hACS9kYHL2ZMfkG837fTdhJxDwHi/kOLYWeEfH3TNBzDoJ4eT3nQAy8aaJ0bZYEDKP1SLuijNfzCkSr+jUPTdzN+hNsWBgaWohBG1s59iF5NHUixlNgFmBMPRJ/jSEQhPJZAKFWlXnEk5oGMMk8qYKBV7HF2y3sz+DVZMNCtKv84JMoSp6Zu8LS3v9n2IDvcjZygB3OQ4ZSgwpc06G+wjxVzwnWQQua8Ymyp3T5oZi6Nddl7+ik2NrQCF36PuohwSfj9B8+Ae+mPyLL2UN4Ih6dGypqa5/uG+2piHl/tqC2vpcpIaY5apugi+iBk6hpCVJuRB8r3FEQA/oaWygz3EN9LfCN+gXL70GW38HlCc8k99jrFT8w0r7zf7JJscP6B9H+mCNoWoOO3I0tD0cMZCgDIB5vXrZuVAkjHJFHPR8enJ3dlWzWcVkdsBjm+J8JxtQ7rnT64x+opnzlQkPv3mhVCWZQGNhE4YxoebKk8S4xv3ckNVxCUfrMb1FWj4vZ0rkQrYlKpn1rRgqUnyOViqOPoZYK8W/NaillExC8geCMCXEMuh39pupUOyc3xo9p0xiPh/eUKgVJCbM2PdOULD7y5XLAfYI+kAREpnlXYVDI8oOFW1vGyn5dyE6iNN2PUW5wi2eEsXws+PTU1es84QlVg9AXYVIZK/PlRZVcwhljcrzenW44y0g+hWxR3vASrSSqzZW83ICM9h92k5+jResu+19kGGCllF8eDG0E5JJccNEY9rOZmv8Ys2Fzm1WtvtlWSorTOk5laWSGO+UzonueEkA8Gf+RWQXSLvidClLw25l4SnFyBAln0llwb0ds3eVj8COZ5GIjD2L4LJSuQvXE7t9hQqVerNNZdxQY8uYlKU6z1ZP8yyOZvm4enNGOkNlnoDwYqIpSyWQ/Y3MQ/zrEsyqSgqARQ4xkCO7fRNQGSt0fRTmZq0t22L1jiIhXdT7YxPux+UiaXc1B7kPdJ5bXSZZl8pVYIUxoHwihPa6NmVdaEXc+vUWVfJBA506QjDoXyYmwaJmjZJ5zcyU3KgviPoMTBkbQRm1kAH5MNcUcC6L54tIzJa76RMvFnbGZDQ5ylSxrPnKXatX86Xby+91nuyb+FwyrF6ZmHqlS940O3XTK5VTHqTWs1mea0ib9NI0O2GMk15m5zaBNs/fFuAhzDmONY/aN0hlaZjRaHwnwPq4YGVtJKjmTd4PUa/JQ0E8fo5dq7W8FFnlAr3bnB0v6w8+5jqvE9LmoiY0GbdI5pnh0w6WI77dBlyi7uPY2WtgMLEiisfJdY3Bjk4uB8m1fGDMgG0n3hAO/LCDpQIkhAOmejeJ5Vww7qc+2ytonrBCu1UXEI8pnLG5HDF95PhknDTXzEUglUw6H2aBr3IecCzXnTBGmGjB3H4LCBnKSISMwZXoGDIMKogs2KZV/ckwkgY3Gg/yjkRUoDOEdzbwzcfvYC+wSx63LjDZ3FCJPnFFkPxIbFZTdl+ipMRO4QpoT4WdWNNV+JWusL3QEMnFkNUHIuGubYXAewKOd5lFTaaMtM/iRhDHzTuclVWCbjiaMrpp59JUEcTyaNkCaHuO12OnLtCqwpdg1Vshe+rSRIH7HXdYEY9jN18w6JUH9JdKhD4KJlzrrfbhQFMkqlSgeK2YWz6DO6gUjWjRMBeTNzgEglmWkFRavGNQJejm10j6QsVexJGIsBQUxZK0Pi+HofHS1YpOtWudsiATq8VN+MzIes0HxJJeoMiGQ3AxxSasNB6zLSGctIjg2LngYHe6XrguIrjSHUFwXqdbIcT81NcMshYscxr6vntXGySUmu2NIrmnsS0ZDW8GiMSxTJVVc4hnzzi3/uL2mBdh8HeprUuDxYNzpOeJvSUhcWPWIFX72C+rbErizROf+pzSBzqasbEHp9IEpdErAXkvo2Y676xLsHmxaVeuqi6hBIcMnbZAE/ioMKELUp+smWRCypgjMB3RNeTUK6oZaCoRk90aPvNMd5EpVz92Nugrp3HXgIbQBep21NloduXH672/KIZv6yqMgOjY68sOz4zxi5XWcdof35SO7qf9bPRGaGQMLNlcJQSMHZH0c0sWSnnAvI8viur3YCATkhnPIm9seMdxy6jWKXrt6ASlTTlJ/fmCTR6lABQ4f5US9+XiGjSMEmbMIGG0HJdIduk6s0KCOwrhsQcLAwvxg95baGouoygQSbx5gJH/Mz78BxcHXf0sR4P3YpZTD1Wr/RpmzPqBCCjSxRAAiqY5zzje2LYvm3TRch5QkmGHe7c6x7B0mJnK0KWoHWXQAQBiRoOO4Jf2yfUKNpfB4YczADvErmsyHn9Rxfj/UaLEKsYt/iqDcnCxyqSIpiCIUnIKgaKrzdvtplQ2OtFm/qUREYBaX3yGGEUnkXQFMI+SWjw7QjyM7Og95jMZJxyRM3/X2XsgE86euksMTz30Uo5Jneh84Z/vzJ0jAIcsgmkUEsD+8k4JdrFW/u2fJnw7ZmIusRCTOZ8Kpo0utlVD1N5U9d6+bwRf9zrFDapek9fliFc2a7zEnv205oW7vfXQvdN0uO/HlpzHbQL0WfUYeMpknJd6tye9K/NmE56u9JvruA1AB1VRmsEGAqLr7OkNmioEN1337ysK4/l2CiwjrY/YsYQH+4KQhsWM0Ln4jlza5KnHMK6pK3FBaIDAKuA/iuoKrNr65ye4KgAsw/LBGgW+IzAmp1EGfXNn3uet94JUhkFU5YvAPeplQHbiyKlXbJ8QTM2i+2EOaA8XWYRlItXUoxaVQ3HpGJoFucgpE8bSzOVbn9Rr1Mm1lShTap3c/PFpnGv/HYmB8tK8wvGZaWv3/wQf+R9R4Vqzzd64APbMTIsFUzYOMyeLuUPjzeck3yv6ch0WJlbbfGnK15cIAvEjKRQvAhVKYmfjo10dhyZEqwPLiCZmBLhhIWPMJfzKR9FkBUGTFDnppvrepL/IFIvvanbBHUbdLcUJyoP66Iwr4tWNyp5HbE3QC53BZR99Y8U4B7zW89jaEhl0HBU/ssYwW7iA/QCdy4YWB9i0JRc7OF28zZG5e1+nKxEvG929bn+FTV9P/7V1FeuSs9TWiJH07vmgWF5nEVjt2Jch34tUGLD/1bPQzKxKThP4r1raEpY6ihfQE+K0j2XU2ulZe7dx650muGja4WTtNN2rHeCP/R8HJrfLLv36CwDyEAGDAYyhXDdAL5/2k/i0z7E39ATWcx3fgkO3v6fxVjLQ12exX5wGD0C+QLD3eqkGflbF+WuRYwue9ZuEb90lsZXtbduuhdcF2nz8hAnp4e5SRcuCW9dPiwB63WDRcIbLfJ9HXvOvA63/4pXh9JP7PEEWtzpoOrv886gg1ErQlLMKPgG9/9Qj9qEOwGA2KuepkwMUI6YOS4AC2Cyl88LSdvoHqd8FAM8XqlsSH6Gt9i74/6s7tXU+oZZYzadQVSYtHV7DwcRAM5y6YT53kd1GuTE8OV0V87YqRd110B6p6wUVkBjmAegsSfum1esIopj5pckab5n6aleltbz0RAYfPDFpicXA1bZ8MzGmyineU4ipZAiDZKsyCgvEC2vAg9GlO9c+EPYTuV3/FgYoSVHlTkvHnkarnKNM7ou/LyJmC0VuDUpDrBuLamhCYfQJ/TFiJsewYNNUWBQHpwAAAAASCDrH5a+ABAAAYkcqiEAAPg+o0SxxGf7AgAAAAAEWVo="

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