#!/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+Wj4CowGWhdAEAAyynXgKBkJkJmv/boY8vTM9MktbLOpatIGjz3QEXi/jpWYIhyvazjaqNiCilUZeiPhLftmEwTobgika+xlSAz6eVk56JK552KyGIKkw4tJTd7ewSdF5uA6eYI+YgnrkIpKd3c3OoaywgLfxoLEiUriyFZKHlC9RrCoaAFvlEUVQpV8pAc+ZDk4Be0JEdcH5QN9ZywFTuG2dheGs69YDY7+l5o4FSLB+f9yuylM0lG/aFrCTyEpyqtxE+AGKoFBaN5Ue4sLPwinblCjDnrJs2BJSO9WFuSgTR3QB1RGMxo0zWTGGdOJhJBmy/ofGz1AYnobZNydvCdi+k4ghjailL19mH9qRN2ML01yluWeYr2DaZ6fa5x250+WrCwcju/kxsMZZx4WDkMpE+j4cbEfaOHeqi/Ey2l+TYjeFgwawCx+PzYgEd+338bfwBY8Uc7VfQIZNly6YIBWLSyZpnDlksUtUSMXlnism+xvPvE2wLRp9D1y1QOWqoYkUXM8ca4lgi4c9ZWfvz67HcCvqIX5CMg5NeRsFwid5PjoCCpEFIVpJKn9+tnQGvsa0pw+tJZAf3DO31Uk1GeJ2xJ3wBtnTqW6EtMrPm+I/cBx6TVYI9DKQYp1jxpFKIisLQ8J46m+X2bKXPNGyTKfeApxE2EgSTq0BvpxZk6V9+b7k3Ui7lBcDt2q+Qg2vEWPYUuMDhS0o/kU5Nzwo/gjNtjbQsXlK5ss8ra1WqLnBrWX1q1KME57gFXYF1mviPCRx/bodEtK5xr8DvRhBml23dPnaRNKQKm19vWxdi/omdLZRm1a+ZUoN9PjfJ8YjCP1eaUqLfioELcaQGiGleuhoIozhISPr8Lo2bIVGrrwiq3ZXESxqjoAZaK2OQewXV3UlcUOchdysU0srHE2I/3CSKp4GX5XGYJqdfQfnw9bu55dc6ZmIrtPYstNQmnZw0vWao7Aphhp8R5n8Rbxk+NN0CRnIA6uk24s8UJUiZ6jt9VgKoxoGJnBya/ASvxxl4bv9PQyBXjH+nS6j6dnQ51pQk4B7zjQFlC9XOZ37acya8Qma1u5WfrklZm5YJKbKZevHm82R/c8d362XXpEvQ8SU96ungosn1L94wpE5N+GtXOOHYN6WiUWyFd9fWE4FkSvoH9lQhs6OqQ17SfObS4Z6JK3WiCR9ydPfkL9d4d3IsEPOhxeVI5A1QPfaVSSHVao4uNxCMYqFhu3xafmpJYGDoGEgtTXiYlp6LqGsf+xmizGNRbz/3bfoDO+cyoAKfggIeKiuF+flYsNgvRSqoYIquNaa8TOeIgdDl1PHl+GUvagdUBsJhTxrTkE4F+qVjhhz1adhGAvsw9ZT1THOpieODSMoaaYZYuRQjKSI8Iun8+z70K3gOitcJWoS23hdLS7fLzbJeIm2vYQqnLm59iqaP2nHuLtMK8WvU5TS4loSd793JzSljan5iyiMcdlgrdm6e5FIvWA/eByfMMSkrk0GQgjMbxs9FLAWeAlEur6Bw41odzYvloCV0wrztbGRphiWz5dnqqcwR2j8vLupIFwktd6UVCp7ndksPJHRk+xRz/1ui8KP+SX2LPl5kHntHBEL6dXzcVIT5RL8hWv3W+CObB7my2YnwzUam++wZtMzSomRh3fLnTVfjS5qRskDt8Y3o8Z6E0kx5NofTwxM2ShyU/971+RUeH1qHTOEgU0bH6bHQm8wMebO3j1VPFky7ohYTU7erDUqogEG5dUNDieXQYrMz/X272nlhMY5A8EIqhHAtPj3JABUeRm+Y91teUkJ+EHZXbYXu7qAjFGVgJ76CEp3SQTuZoSOySJnPa0zZmvU7H8SobtZHagPyFegflJ4Zp1MXIon2tzWEGBZyPXrIdMoy2uXJupWgrc0SzO7N+1Ke1pC+HQghbxd7UwawQDyE8NaoldbNPxBcttuRotiOnp19AsIAIPsv3ZZDwP5xI9l4rRtjfAAarhcRrRbUY9xgmO1BDHTbFeXw+kaaaVpq+8lKJdR5fINXxXoeUAKNOgORjJrN0WKJR2wVs80UhjpjYL3V/a4ooXrCiKlTbxEjTv80jnMiY57TR8IrVb6hcML/WaJFkuceGfMBmOyXGd8WsNbrSGErgpzAJqMAPj1URx/mOA7k0izkK7Ke1ZVg6/WjVcIvjIxnqD+7GLjtm9lbn8BEOmthzjv10Gk4dujZhMqzThHHGWKx7wKzD8xfI29UrMHX6UUkiNNFAnf5XvglxBxQaBC/bk7Nl/ZtwMtguwwJCZrDyeTM65Dv+lMi5wOAS7xhoSMR2lYoDql6Ct97gl1RHvklqC7sH3L9tCKPyfhnSckh1AHteYQZdllCjnflOYddlianlobx+ZOph3TqBe+118l2KXv/PCwcDx7NgDLiZyr04ehOG616sMFQY+IsWFbldq9/gbSA0c6ZRxHnz0KYWB5b4VGPu6Afk8O/tYQiK7xWpape5vZuvkWhzBeO/2jXGv19OsAeVXjFxQw7bWyjlXTsGZHwNTXjHs5TW5LJ66m562vol5VxTBppNUub+mRCs/qGHCSNrQ8aY4ccvXsVlZiiYxEEr7GkDQ7ogimsZVXtmFyVGk96rsyTtA4ef5gqSJwC+F/h7AVK72h4QLB2ElYoFMuPkZmqM3LEDNHkZMIGSib6lgwYsd0ZOhlJMoBrOmxCyYyYyqgE2LkCoERVN6Nqu/F28vgG1FgLA22+w+HskmTsBtrYRsRRBL308y4eqLVWC7KDfAT5s1jvOE8qbulfF/PvCure2q/qLR0ZSQakNHnKa5cyxcDoE/eS5qg5XJQHFjNITtD3A6Fu0JV2PO+TemvtOo9/CNoQ/AG9/MMB8FQAe4y1vnV+uY3r+5vd7H6jmIF+I9fBwYhteyvNTubeM8+IWxR5zzun/HuS2bh4Gj8FiTyFvJptjy5lp3lXBcp8sQDfpd+EeyR8w6XRxfmYI+k6Ds3frAa1eRJkhtQvcva8CpZz59hRoXBXi124S35g9yRP2+6pPq6l6qhjUk7FDK9GRGzO9+bhSo12qSYQmz/7cF2GHmozJlr8G2cCoxVqiKkBAHB2N/3ynSUzCFhOwwf85gjrt03jgL0cs72HRskZGAX+RyLBVs0AbFcU2xyl8lVgev9rohIBcTU4yUHmx1ECgx9rcr9hQnAbtSv8GVASQICVaKnZUa/Nzq6u2SppYZTaqQ8rntB2bkKPhpD1iisTBWzjarTR9l00Q4liWjdNeqCYlnuNu1YPDPTklWN7daOMgUsUL/yXi2UK2WCZncYWcm3iolocEu09VZKaugiaONEHJ1+aYT+588Oi//5a/NFv/wYNN0RdLGJRORSSIEFLJPGyX9bUOZgoo2918MbMsl+X2+ERUZyp7qCxD98AHTigUSTccIeTzrWh4xnsVtu1FpIx/0UXKxFtmTGRX64O2V+iTbqCWjjCNjf1R7usWfyH8X/LIP/PwqW5RtnD5+tyhgC+vbr8IvcTp1N2zFw9EOTyumUoXV4+kAUxxce9pRn8vYwISLsV5hRKUjjEGDTtOP9UPBMJ8IF5BE3L6UB8t/5r27jOCVr8khQZxAz8ZYYo4pnuU+zmyHAVO4BvswXArYLJ2gf5N1e6HjlvwEEZCNsjvSyyj9fFwpl6QZ9i0ZcEYZSfCJkSYXevSSTfsHhu0sQ29xULwqrBKv2yzEHWAWucrSbdcFnoIguMtI5wYeizcv8rIxirI0PEC7z5TXO4nP2QILu2OB/diKAhVaTh0p52zVOwtsq0I8eXgJ6r7V0Z7y/cZgS/U8P6c5tkCaudyIUM5dZumIbDRYkxM8+NAcx0RriV89cwHmoF0UniWiAiCE3K/hMivCK2rWNKfSxaNHHEeSI+s+huxP1Y728H70xHghqTegmKae+TekWitiJBQNvujcsT796zqtbQ56iMvtdFgvKgypco9MeEc/PY20lbLqF+UllNyPTFsuRV7YTMDcB2HlLHCpOt4urh5u2MlWhAk9D/GIdR/a/fv57/fqyh5KxvTRLV2nfXhl/eqjX4AAoBNj8NWnzqMOycdK8pfYKGSEpUHK3CyTbOfyKgMyRPKb7KG0sajDCuuSfY/Ip865dJXvtupccgXw9wwesZG9dqyO2QqrCJJ3+LdxVXKAO9KLI8y3q0JlaEv3o1TbxaiMtPpCjvi0wSn7xMfV/Bse6xSOQJOH8tSf5LV5upxvpwzmZEd/HErbMV3ePrMThCzlUOvYvXJpn1a6PwNkf8IU8Gb1IaQRagu9axmyGz/POUHPUH8byoPMj8LRNWMq8Z+LShXJXQ/IH7bm0ZkZarzhJufdOAHzhwrYYgoc1EqBtyp9v/x/evtXGvPs08t1CrQthf/fUdpzlr/qMG6fN9Xs9h9NCTT3C/Y3SnkK1KBlmbUKWVOTTWftOm39GZYuulvnFNkEkc9aXU7ngflzZiPVKbBf30LuwtJVebBUsmumOVMBhsfUEikQ8MNCU/brgPip9LIq1tLWeMFiwsgAnM40t/xyOHuGVXtM+IrYK29hF+CLQF1VF6A5tCjh0UeAjj3HB1oC515oTA8awdrwmtb8y/IgndId0E6By0tFGrMhlrzePdclYicFbQt+SzuhdHqRWtipajiTHDQ8bdAW6GsGe77uRmtjj2jx16/E2ecmsGAiuxtn3dXy3n30S07jSQZfJeqpPwR5z08vWLnjeZPg7EgR1RV3OG3wzhky7YsHOsKWxCsbnhuWiE8blEvWamWX+4UdHH1ekFMyBHSOtzScB6vRQm3sQhuLDwf/CSrLcy78mBcn69/GSjXkKeCuRnSDWV+5Dw+yX449QrktDXROaIeNGGcqh89e9ud0gDXi6vPJP/upZ+XLCQJvYn/2PlpdNdqVhfkB20ORmNil7aXpxXQkaDXlN2mm1lEBmb79creqg3c3ii/4kvoUn976+9zFnjiwuDdDSENtk6J9dqgUD3gXyDA24xFTjVCMNh6e8Yl2CxNU7LuDMlTDF4Fil8JSJlVi6aMU5weBYOKxOZCLTNzYkt4WNqXK0m27MXCS36ZhG8e4oHQocSTIsXDuv+Gt2ojJOVFXefUPbVlhP+aBN/iC21kQsyGSYGnOn1HpFbziSakSwEFa5kPs16wavMsMU8dEkmHuxHv93oPTmT0ss8qa0iLryU/L8JC3gmw5CXasnddkU6JtZ+tZpMuTHcbzfzaOqiRBP6/6GxtQNmaCn662Uzgzm/DOyU89kKE42nM7SCexm7AxfyBqIKgtFyPSgzAHjqqY/sk+Ht8mUvpLs8mOyrIcP/yKpOxljV92CKvCxoCBfGdkrD0qmxcjIGhDe6FSmUdmqKn0I0zKEr+0pq2yE8OSTHFSSq5x6DyKsFZLl75e9uvGLVWuRbGGsS2sFLR1MwvJjXBZywaJCiBlUvsCOGQh3RMEW5U6xlxZueQ4IqA01h+cuz724zCNCnBZY/KdKanW1m9YLh+fs+xiZruZQY2OS4Np5iFjmmgFPaWXgEkbY6MbLTSNTsv4c4IqbqvTq/GTlUp1i7oxrM3nKTjty5ly6tbNkHm9352t4aQlJDTHNcECVj0XIBLiL/f0NRMGSouNbnL/o4AANERP6/iuI2MUi5reW7ObhVPKIqHSr/MaDRn5SSvvg1XdvUYLT5GUPdwUjVwzwq8OiF+Lm9KOSfEdnCmmQ49D++QLvWJnhcT7BY0ib84AgW4y3U02U6VxCuh6HD0s41IM9nuYR/HGNF6OBaswy11zI00vUMuzd75HRukJWDM6rQ+txtHaYxChwq6hRdTbVZMfgJ5sjdg7O9Prqxma7nWPUnkUxzJdmjnj9fG0oZycz4caSrEi2eYxIau+51w5DhEHG0dkXW2Ig0KTOFilj+hXc1Dp5XpMrDTmZJEH4IH+vQNIVlkwUyD58/CePY9y0mWypCSH/nlTujAFihAN3zPtEe7iXozFfWPmHSHHiNfKzAgf/mYIzZa9LJsCrZo3buru3wRYw2rOzdPtybxpvSlIurSXzo7oSQKONcmEdiZK57iYsRZTrFK1rkdIPc61dTA0tz2y0EysoIwODZyGX36s+lked7Vk3yUjy8fH9ekIrahmaN1eezj4eV3+Lrt64IUL9VHQYiY+C32W4XYB76une7C7/CfuCIVGWO74dgYp1WiUKP8CHVNGT2lRk+SLG5k17Xy4kgWjwRqQjv7xHCDOLQG8kcKE1NhSVK6kXzpfsGphE1ei626C36DpqKeWMwxPYmVSd2S/avSUJ8DoWqfHCu33mJupOKL6Bp9J83lu/7PWpcTSrelaOZUlxdNPonfJ+zvisRQyXpBaxdiQdmY8/Zx0DUhkUdHQ5AEFxKf7HsmJ9A4o0YgM1MTI8ElWbIGnwfzEvG1xYITUOoOBJQitm+/lv53IVW0o0g3fCjnhxZR+d+Fe/VyCbfmAa27Vg9Si7cK4qG8+sWz4G6lZ//q3ATyEhMx1NyeAzAoaSWNI2PwbxKPCVnKwlakj6qogVg5Ol3gIwzNdkjuuY67bmQigg8sfV8mc6JQ0+BrHZjLY3NT/BAQgLsZSKunr/WVwDTPoqwiltA5QDQr4/LtNsx3pDCOtp9AheyNRwX2thpFccXTayYXdQ22KJSa17w26CFAioyhu7qyEKYQN233A5MaWZvNMnTPEXv//zuLKm9gE0SJikHBEjKzS3vyaReyw04+wv6EI1C8Ja7wtJkNCflvOB7dDnOPL8G8OkQw05bxqJydo8w3Or8YAgIJIviZNQk8vqYefDq+VYyWOZtqr+15wOVCVgmjvI3/tAUFYKKCKqIArBEmRwSC4O+jTF0oTmeB/hIOXoSRL2p53ZnOoJa1K6h1pB4iLb2VuKQYkzDB3WvfU2uPobv4WI6SA+J4aJdH3kw6/JOXrHtOJIsu3WQPTtRZmD4ew3dTv1Y1/Qu7dfa3Z9LiRnjJF+oT09qNxW5zjaR1bUuG8zqtUhV+DL/rQLDA6wh/hAJZ+qU+YeN0H9Bt2Axtl6cuSTjgNXQm84bb61q62mjJMQjWyI6l9OB6M51I7qIFXjgRCP4QJ96+vK6gBbTz6rbIIwZOAUq65jAiV98aoPpMGGSqAElH8M0qy2B58RpGHJV89kH2dGW/H9FGGaj0N2NSq4FShuRlI5Y1e3NMFt/CjuWpxVV7RN16gHhntEne/nKWvwyrgu9R8VEUDW8DJuTNMaqvTorpN3OfuL2d5JWp6T6/LviV1v9n5yD7R1gwQoVX+r3pbrbyCIJmnTlpVSLCmh2CXOua1ozz507mBtENd/N5C6xVIZhbRlArv2/o2q9Qm/3jFYEbQEyZx/g0WcSKMSBHd9w+SKJvekP35gReE50e/QawASik/xRxUaOoKiFqCU7zVG5ss/D/xfGN2OlXL+4/u0QNsTq5AJF0yHpLStcFlK0J30aYWZQdmqnV/du7Bwwt4VwJIrA/nF4xqW9ArXAyevBPkESlErL30BSC0TY08ofB6vE67aCp5MBVxtqaA5JivclXPS05b+C6n8OxbWSNd+mjRnn7P7t0dwV/FrpROHWj2ebLPyFiL8ei/h6ZpzBhSNcjKwFazQrRJtfEGGSeYETq+4fElg5IMnEt4Up5eGHH6LXLW1L6JzXvvZU8Yok7evMu7IrXEFsE2fhi1l0b0PREmv73T6NnWGrRIsKp57qxI6mvvOY2bKekCdGyx7jR8rP8grJeZtveLWwWc69WmOCXX4V18muMwpxWNZS5d/s4EMkcaFWssGAlctUC54i9mQcDzR6yjXmrYdBhY3kcnbTzfm593oQMrU0j7htzS2P+Et5v7OXCIraGRX+H8qGUKhUswGw8+Q5iHtm23gZFN1n8XdxDsBT8SbEi0yOcJDFrW7SewZCFz3Kou1p3oeCfnpHqNuwElIx2W4h0k7A+53+UiDMqbOiQqYXS23ClYK713TpuB6TXJ/zjLhAaykVDdGXDgnbWu0J5w5TCRJEwFNUFawA0RlgJqei5wjVhzXn9hQQ0LlelVcBbd+qmXN5iRu6DvBVA99sMehckcYLQnRQSkq0Bt5q8Jj68JYZ+TCXdsAZmPWpooONnOpw1l22Ca7HvbQtKUqWti3c3qgUOzu3LVT2mBhZnsh3i97shuQh0XAg+VRy8+N9usQzmxUyJwlLiR1Bwux8r2MQej6Sw0IL/uzKbJZPcIUuksh+jSQblPD8/NNGh8DgRYX14l3a+PRCkRfQlyaRtBVv4Ho+Hk8+eld70vIg7q1fcEELPmB/95b9x0S9RInLjzzVx97aRf3esJ39LhPnlT3TanyPkWwANOXFMvOA1nP6oNVC7NONOezT5LOSS8aSTbeKZZH3MiOUt0pXP0dzraMVME71gpW62JFFNHuomqfQD+k3+qrm9gAbLgc+jS70mCDDcOO4SdDeGktDsKJ1UC19FG3GiccneIX6E41lMq2Tfh1u3QH9KOR78hC9A5bHqYVVdblGpigSRHXWafnJFPSlnYVww6lJkp6YHDDuR/gfDdMwSlGzx54PBcjn3u+TR3rsDgCgSMWaYZ79NEsA0PB7vGSzriqzTgMiI9JXauLF2INHdhgRwCX0mcIkxr8mL08YbLg+nzaR1QaKYPMu5UfNf77rSZAnG5Vq5eS3vQQ+qLbJUCjfIZJVU+DM4bg86zfrwoyhonLHYL4e5uyD+Ow164b1t4lyaSKMwEYyBQSzdcHZd/I+UdjLUxTPuEfH1UABHemNm2pykrQABhDOxVAAA1u+ObrHEZ/sCAAAAAARZWg=="

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