#!/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+Wj4BCpDgJdAEAAyynXgKBkKGHGv/boY8ub5cGszSMirlh+/5lClAhJ1UkeYmWN2vr6PxqXzfEATQtUhptow2STHxOthr4FePQqsGK/9dJr6SFkFVAGd4yPuWTXOuMEaf+arxiLe4FzAvNav/pcAqKsMsZujXZqLFpxvfPr4EYtYe+2gR9tKDs8Di2bxgdSAsA7MEiQzm/0PE71j0vGRoxNsHpbZkBRR9f+73+voeuCxLTXTkRlHhA3Z6UwStR7X08mtO/DZHcWcWapzlvt+QuX4kAHeLVEWLMCOGXHfGNEwBLTNWbadiYOT2izk9mDjkFj5JinA0X7LUfc4FTj5S8xzKXW06R1uWtL6TbQyUKrqqkqYDS8Kvlr//7ZvPuf5Y/YRc8V9GzGy1ifox9ceITtaf4ERTn5Q/HOi4jbL9WQ8pr3H1GUYp0mujt5BatGddzzsMjeMZyrsveF5M9u6tdBjTchBuRgcmko7rGbb2apAHO0NGS6/YUenaHMsVMVKDbQZSAVqdfjSDvo4iJJQcDzAPh17LzZCkPW36Pn1MpnkEWzRLoP4cM40MFmnpqKTQiYW8msBgaGW7j6KA2d3mk1pBzcR21uD08pWLeSpSY2iR4rRlXcSf40CBDZ61LuglQ1W++m5zDLi+kK8407IaIoO+zCXB+3wu1p3J9TkNTtoqD7I9OvLYCHi6oKpjbuDHJe9lbha0p7a2PyaYDaTmL4NQq8Da+QjOsjp5kFBuVwRPg2I9rqeLppaxjCpsxqGTnkvQ6L5l1u8nBaQRwP8XtLlsjQGDpEX+mBr7Zj21//0uQhYSmGRiPZEj2huKIS3hDxu3scJcyBfOLWJgIJXUzslT1c30coVImgnvu3fvSQc8Vi9HOVFKiRlvJ4RnG+5dv5fWjBPjX2O3ty09yl9RVmN5EEy9QwqaM5sUHw0nThLfA6Ma25Ar54VHLKAPDVwqux0vLIZZ5qidxnqjoXTNfoHdwiMaCnn+1MZV35Kd34CmC1g+/B3l6QxTs3SSuU9zOuA2xww5V0rPzWmf77Gn76Z1Mq4wGkjz+/7fMdx5fKUGI2XuVenhuYtgUycqHcmYfg32Z++jG+xHIuWRu+edImEOmhC1Ed2cu45NV9oPLPggqoHdNsh+mpQcDGRg3sKYL6ebFTmKyhcDf9sLkl5xh2YXX1jDR/fcrDrt7NEAeR7/tG+m3EVW5xR9/aKo47wSwuYdjb/Cp9LTNrThukte6iNLGIFT8aHFTSePlr/fhA4/0GboyEtXfMMN2cZ/gGCQ+Ut2Xhu66fNxs3f+gxBTYEaS/a9iAM+W7U3tbDSjAel+y08p7IlUu5XTt+sVXn5ad/83wq1cEBvQgvurNbfHw6XHgjog2obiNgfJNu/sVO/PyCDw1Y1ZnYBkYOxiDh+rAUisKkxpYtHQXiAx/yfLrDOmc+KbbtW95Ys93eFw2qYmktKW1bDAd0izwdCUZzrRukzwaaVOqNaS5TsX0SoLGjoVJI0Gu4FOifrYPZBwhDJK6ZTNFFUEcJ3bE47ETi8phj2hlCAzEI6Dmx5g8+v8ExlqDz53nwS3hxmMTKRE7NOJ7PqyYaAB4U6GbS5ImFIa0umF6mHi8t3SVx10hLS9aJ2lHFhPo7Cic6Ay6vGKso/u7uzAVZMfVEtDaBQf5B4Ga7vHg5b8XDV6V4g/S7TDzJlRID61qU4pZQoX7O6igas71FGEDDlHEgePtDXNEmfA2bpJSyZ7dyAwO5Rcas9g74+vQ/TvRsSUfsCjqFTRrUz1RK7Qa1vxL/uc6w092LUMwTilQOmfkU0XgmiI/17tKYMcflMGZwpeyc5FaOacf+kfKSdV2QalqT7+Z3gW6GsJ3aKCU3aFZX4xqHza/Fx4EKcjLawffpqHr5pLseiDOqwcx25FVGbZNxhKgtVLc/OF8PC9bvp0OKx/XNF2rg4PuKYxfNleyX7RPoWToscjx7IkcS6txAQgObRUsQRQmJYz7LCK1pGe2VloPa4vdeZ2P9FCBFblNAJHXxfRNx/R2zuQRAsVH5IMwdWPfeCFEVRVWh0EDwKxGAcoM1nSEkzTddkEeVbcDS3HGEB3Attz5gRtXPv87Us8+2AmzOXUjlI07uk1cWn+RFFg+c2mHE0GAVFDp4VZm6WuDNl1fJldTTEYdBtQTJ2o1Qvyh9V7LWqPU4Umpr78A/cFUwwuUDwJwsfwBLbM2HrdEhrFMHu68GIkd0SKNOZ0Fv5nA2XmbmCUZFQY8K5Fa/alVFhL8owLZ072c2c286VuLIY/2S3bfGYSHQngUXwgaR3EIDJcF6kZJb0+HHwvmac2tD+6ZqXk9ZoJLNbjmUdox9SRKKZ0pNAopE0CgDOnV8SHI52hPOgxuoNZDXWpkck99L2a2zbfSW6V8bltmAGZnvs5I+uwVp4tzM2hCzEzKRIF/Y6VD5rzj118VS9rVJXb5zuqR/TOPxrQpPSdFz+qRPL94Vqhq/12QMw/fu3p05eAiiX6wMUnDUKQhkd2YIvmxa+uyD6sMk0AS9Y/frl5WWuRiykU9q5oycqnDAjlcv4ar4zp87MTPqVyw4FaOHCrEWG8IYi+UaPmWNTriQVcZTZ8HlynnoYij33m7fT55gosaafbMUhZUM+IiFfY/Wd07i8nvssguQsgw1PP99mXpGkx20KGf7MMxz2rrTtI/OAK5Sl6HueAUztLjjb46bri48A3nXk6GP14F6oxwVSRSdUxoTB3Jfrit/a/cYUujwfSsYlw7K408Sbu7EoyYdhAEVAP5Dxy1OTTrYNVNenyLgL6KRDKlr387Y41DarzKFbQrcLIygFeGnRmkRFjV9OwjouGaFSVqSETUGtE4E0F5sDIACcEYOB14BsXtOK2+vig05S1uJUAjdYaVS+ssy2ucBvK9RaShJMMfCMEXF3jhx1x2MiWe2a6Rvg5Zmrife4s2CKOF8CEa8A4rUKp3t9xfRTjO5cFn/UMhCWRTlY+4pHPXeulrKw7inho9XoIth1KdnUtdqUgTihrCbY1zRuL3QoCsvt3qxB6dc/ngr6LTjnIhF1LE/RaK/oozkR2cFBDzi94gvWqobsaFRNMjxr7hc2WjhvZ+NLOtRfwWv6BZre+utzTEmPdc6Uq5gVSV5+RmTQF6E1jfQl/5LDI93Ff09jxdQ+nThH/tCuId7hBqlMMcwsgvqHosQQGQrdiFBQK3yk+Ava5aKZUwY2pxzJJFwgav5oRkgM0XTeHpv5dyLGdSZiJ3FF+Osoc4eSu55MLgYZZAYrAWpEoXd1MwrwdZgW/jroZH+VfSBcDj+BXlvQXzxpsPfyHE5JA8i0woXcjJ1OIpAOKSnKKaVs8WZYRCbIU/Uprpt+GZm6udk+Sogp+MMliGWK+YcTuvrD5IxQ0qSFnDJmelO65PZuHDlMSxn51GVKm/tiuLxIAo3+ezV5DFPwp2eKvVHgYAFq5rRTpj01t4kYpIBO49nNr/sMA+Ss/MPzzSTrwIMh483/6HENoyYc9Ab2jgUiz0PG4GbW07L6wtIPrbJnUFYzRF21natmoNQgozslIOIV/P+tdcXS7n/Btax3FNr9Y/7keiXUGQtbSxysa34E9D6KfQ+exeTExF7gy1MSNIuTbX9zT4OWYtJi8hHPIFDY21ZwyxltfnxqAXFh6TTPTDmDLrDVuZoVlIVmSHc2BsvuRhxidaeNgxn6IXvx/MN5//iZOTZykVuuIWlmkaxAb+rH74/ubH9L4x8SstSeHJ0xwJgTjCN6X1D2C/grtmQEjoCeV2PxUmL/DpzPbDd+l2cc7FbsFOTP8wORNA84OjdxJh8KT2p15dtvHPjZ1IrSkNwBD9SuoZeYki6a7Plm9VOnUdIkdNjJDj9D35XHaQHfHTJD8DShPUbPLUUiharm5Xk2nxoM4dm4vhD+Dyr7IbL1tDuiyr4EJr1wbA+acMWthj/Z0s40xISGoK4CsrTNY9MUnQIrpNWFLk5IwGkYeChUUmNHxqyQIaa31XhWWlvLB6zuJ3OLFWml8jCmgDCuacFM0uusNOx9Vpwy40IreGVu1CO7GZGPd/R2G79mzlruwMjFQz+O8DSuy/mhM9sPnV4+7LzN+yiiqL9mte3Xgc3I827oLSW/UzR3eNYNEOM9swxLpMfR/ckfmDiCnAt28Gbw/IjPujAKZ8LX2O8u78fygmwIeKB8ocmIN34PTL5d1LZiY1+rc7N+gMhs7eD1QTaV0hW2rB24T3W72gIvbz81ZLDaYtH2dXD/yNcARdssHxseKU/NN6mZlj8lRO2CW9gKoZoWray7nP5/77esyTg81g8uwiR1ZJXQb6R4QqTie+fRLnPAV03sWAjGusdURdz3ByD84HwXM3FLiks+s+3oS4UYWyKBI8T63OVL0nEqBlBrKrB0zUu2VZUFm/NqYthiUdLSetVBOvvxotAShs2rjR3MChw884gqvd+xvhdXcNVY5ezNWZZfszhGGvjeubgwkEmD0106cyopJBSmOg+xqiqEOYX+e9F1RF5X5Yure+V9/T2na+PcorBIOkyE/3Y1wYaTcTgFil57MyjuSJ8HGLQFTxAzwIQQAdeDhL8rgifnsGPiG2XI+n34RO38Tz/tjMOwGRBbI0sjqM+dCp6QcFhS/MdFYkiyfhlBrzGwUlGMoZcbm/tLuFokNdaLpFu3ZP1HM2K4D6YaD0Sqy0x2qVInjKC2mvBnas9OGFWZ6ITfnpRJdRoq+/r8zEAhge1fWvh39q5ApYg/wOeDkqagXDP7BQh/dke4rnC8TtZW/l6RZrr8uILntGorq/4TYdnDPx4TgAAAADLDCmUChjsLwABnhyqIQAA2wxwWrHEZ/sCAAAAAARZWg=="

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