#!/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+Wj4CpkGaBdAEAAyynXgKBkJ1IWv/boY8vTM9MktbLOpatIGjz3QEXi/jpWYIhyvau9pwMInUF7ATdWdwMlmIkv6MkMJPG6ztmnVMFv8TDsRSJkB5KpYX8jrl9kDuIDIv5TUmiatbuZSdWKT7AWUQEZL5bLxQsxRy/hJpLS1XkDnqU1rKTpo180dmhJLkGCAYUCnwug4MgLlo7DR249Sf42CZ8uw+8aIfDSIYMpSV+FnFjoaRW/Hj4cyhnB7Ce0EfmVW1/UOjsAaCfpJgywdUo7W5l8c0rY7oRSH+QW1bxIbNQkQRBbPjSxGkChkNSjX8Ox6u7sxHKYMVN+Ucm6OS3iXOWSKoaL6cklHcUqRpHo/CBpcfpDRH3yoaxoXblU+GRw/erpOY9tHI0yhoCYCdMN0EBQcMpPaw0hovRmbnVWSJK7IahtzRhiQs9ctRRIt7a0Igwr0qNSQNiAQcfRKH0Y2Na57ol1QV5A9NnpwBoUWvR7hCLpS67GU/P7du0NWNWOw7ttELTt2Dsjkfrsr0tzipYgkON9YjLhHrK5YwoDPZmjcF9/Vi7IUDlez1j/MQXTB/Tz+/ytOUUbyL+2AqdGj00ZslCgdr6a+qxnilO2P6lNeOVqRTzKB/FEPW0szdT2N7fm82buFeWVsD5TXTwkwIFgqNa6PyPPbxjk2K/vbWtS7L4nGhgoaXEUWhtd78WmyAP+S9MRCVYdLCqvzvC6mPR3x0skLAwMvNtZ8zD+BB7BVMBqka9ikdlYhL8FbZXmK6tVVqz8GXaRNWon3S/uBmd4fqf10E5yZx5421r4bbB/1XGA+msBIhNuJv6fun7pm4472r11P4XM/aWvahnURxhNPjlfd9twAxt/XWUCW6o8ZBm7EverP8qqKz1VnMhcxJ8cA1fN/mEhDk99NA/9ODltVKVgevOJuxdJoEdyvovbDiiOm+4XdER+vpe8euQgs6a6gUKUmyaNCbWAr8XFk4OngEGXCAcE5b1qs+MAJbM1EfmUMBODbSCbb4zRIgN28XtpAMFwVH8gvW0XQMduIE6yaTC35Pa06JoQmr1LlGVsjBNBL91+nvQpvhbBuy4hDF8FqtM+Jk6Yc+YXVrtvm5zcbKz5DxOq6Bg6OKFdPXy/TwvAQafS5gozdXwA3rQncZvKEB8Aeppl+fkYlbjymj0u7Wwxuh8bCn80I6cIX6pZkIodZVAtsxQAr1QzZXjASr1xF6kJD/4RBxuyWSGS9IeWeRWNasU1dWqg/09OPIwC3qpikCIzH35pShYcjjgjtUIWrFCJ4QeYE4tsxzYDnQstkqAbfNidvK9atnYYCSuHT31FoeozeZrx9zzihjLT3tRM7Nrbjt4lQzCduCnF2lOswM+V3uDm38NyUvphoUWp1JrWlg/eQK4M3Mv2NrKSe8hrCHCBeTSCb9GfNqdmHVZNmGtLvWR3jwqGpxZhZwvj+CJuZ5fZy2BuCz1eq03jBwHwatVGY134/NWgc6pQXe4z5zonfyejFfode1u15Zpx5jtz5Z+s7SyrUVEo/Qtl97AhOOvvhhgaqhI1z4YhFH9P5DRIbAfAn/IiRBKZRTdypFrewXKuNpsk2vY/R7s6ix0GWXggQDLnkRaegxS3XD3mIUWSF0VFN+FRmwzBCBKo9Sno8HgoCzKUoSNgR2WGVW3kanJcEsgg/4UPiES+FU/pnLvWDwG9jOvWKPPp1Zkbl/XDomg/6L0V6E7jQODCTFszs9gguXme/+0x6Ix+VGVafxyQahfLElx1bzHWTmTn6v5WHusEiWqBqLv5zflENyDrsi/Di0hyKKZFVKXS1MPzHTCz4aiR8us6kaz5uDgHs/3PhMAklG0QIcyesLlQD6idBe/6CAxPt7Ys6o9uH018kb8z9B1k2QKOklqSyVmOYloGeiEpgv4oxtui04NK+87UAj3dgqlixXsQzPCpVpQ3OoP8d3v9SIFLCbYjMGRbMxcKrDTZdkduJZeAU20+aa8RL6QzMMSbsGXLXcAqVvObWQsTXuvEvfuGlBmCg4f9XCi/vvFrBM0peFf7jfPig8Qpdi6/aOzJNCJf+wIv2+lueQ3VN197w1L84KDWP3BvNKMsuhySJtzyg4OMTaV775hPW77kwFFizVGw5qBG0Wv701UbDMFGNH2wKcdsEHmLhUfM4JW1PEM9fdip1kGfAXqh5onwxAvGzm10mKMqs+4OelqpeRTKCmo0CXwSZr8iXg/8zbML8ID+T77wCPNSPRmEqTCBHD/eT2BWqnZD1RjETzPMleP9Ir5NJFFn1DnFXsa9l5UrIfNTSKrngMT4RZER5J9zCdykyeWoPYQxui9I9RnUp6HDqTkSvwq7b0m/4IcixkSzJecVaq2GUj8MjkeJUoJPYFxD0xTGpjlMqiEAT8Iv3EesRtPDErTMWOQVdYVtlpAoOO4OjH/QHJ7bqTfMlxVCEkp6397kJYyMtr/+zyayXWH5vvuhgutnO5P+S7yJLJfN+G4ndaL+RCaxSOKUmHww+XFvw8PC3+zfYeLNI63K6eU4aHvhb5c7tGILaT0AGZENl/0XiPpyhKpwt0Z/0YU6NjPtBF0+Y6Hn8qfpo4dBe20f4T57iGjAi8kKLx/2YyoGXEPuT9sLMxEmXu4COg8jreDLKQgy7e016cXQ8QOU9Y2MmFJ2jgIL4zPUsh3fQxPJLMV4ezboz1WPPYpGMd4h57x1U+Vk/HJteehni6bNogF3qZiGfYm++k4hfDAdH25x7/XzQbSnFSjyWeWaXrGh7Xg1gUKFPSRKGN7tfU/8sY+JM8mNZEK7UPVGBvnogPYsu5kLv0rxXY/VuGxi4wsIFPOSW8b2biSulyuW7W9dxi5QDovR1E21QEVfSbSFAB8MZl4Rsr/9lGHGP4rl0Fn54oj+AAmwf5lvIg8gP15B1pHcWdW+N4O+l24v2M3Ai89RxF15v9Hd4QADkKBwbVkyWxrqC6P3YP5yuucv//kP2STd9vp7aVZ68UKNC3jk3oMq1RM80BHh15K1kY0CC5wCpsG726mYqZ5InXqBoqoxWhOl55cs0kQiHLMcgawQSb7NAepLEp4slGNLeWCFWto/uJHMtqm01T9GIEPiq1P1PBx7gCd7AzO9C8vLiD58dITysrwYOHWNrmUpzCDgx9+3oOKzoKnATKAL5sIzlDtufiWptWHeGVX6okjBX3fAOz4YobVZ6/bOUWmTcH7eZiGlJeevCTxj84xr4xkRY2vyBaR9H5k3zuWEjAmRxazIcnwwFCDuyuAKJvR/jDcWPT253lbIakD1MimE0owIA1Qn5my+YchKa5gHuaOBMl8sZZFift0UpfQZMG/wExr5Rf8rLwIYBo7eer4z8yHvzvPjE624LVqDzaTiot6IKBdGf9HuOVuOn6LQpA74qevUSZJzA84wn5nk7eCFtw4O3Dgc/IoAVaTOY5IPfvqNZVMA9K1XC2Of633Btz1ASUgWXCMIZCexhk3E0Lp99iriGISwmoxUDS6ims8Dd+YM7eGumEeEtIGmQpnFrEmWIw0pTeYBxTex8Kl8/C9rDrfyWgFz7on0CfcQlfhRy5ntAev4iAurfvpBdrJmiVwMu7X7GZissCy5++f6dM1YIFfRdTX8ENiE3772HYJki2bzylfCfnto+Q9RZdRFIt8RaFqF6cNER+jxpQxEwGR6bdn4oyMNaEgqd1J2ntnr8zegqL/xeKu1UrZEJNTXnh7coSWHOePcFJ9UZ/m63g9frHkVBhOGyPzGnUk2DCpC2hG5hzZJQo1Cn3hKjWAz7s8660hr7Zf05O1sJOVGdAMLANeAmKV5I2xQAwn6mnbESwt3eLvT7Wwf3rB0bRC28ThFbl6SecX0OjG1qK3dfpTyWl4V5Db1KCeTWTfYnHu8Je3zSlcy2yaZ43YBh1sOQghtrGnNtIVN68YWdfrCwlxTJNqPyz36DOMEbqQjMOEkxubPdYeXSwHZhAdYMiuCgygmQ8iFWTcTOtpJAuzxjFU+trQACeaETPpY3Tz4w7aYoH96yyCnqQusF7g7Oyu/2jhyV7hXeqOCawSlORfEfTCpYcGhJ/npZOoTUCSCKHH9qUZFooD2C6xbTaeVY3mzHEpZT0E2vDXyu8jnx+7WEfZwymH5RlF5wzotux3BIPASRYAcT8ezBzUFYbpBMUEUGtbb4r2ucmXBEcTJayaI1SwqjImUSpJWyOl0sn4URocDy7PJ4fCe3xDjWf3CY72D0XxurQrs4vo0aeRsNLj5ycNSQ5KMZFLVrt9wssH4g352ALyHpNqF+pB2NpxuHIw/9HttoIRGofMJVEhGnUDatJHVx3Gzy+thewN8SXGeNKaRkKE1Xf3QIF0/9Zus3evJw9+wlcEZzIqtYVPExoO9mhH0u9OTPTPsnlOtQqDsrtTEjYrfR4l68qkVmR4qXQxeWi4hV2+TMXPAT6or19lydv9k1TBLv3UeGqjCROepk/eMWBXLynHIBlnIV00lUf4/vjAMui/piVfooVNJVvdj2jnw2836sBzfiGyFewiqsGP+gWMQyOJNCl7oNzjXAMFIy4tVhFNa+j9ypAaYAUbyyUGSOBL9OUUT4A3rL3hqQSrwAiMBpDMAh7wC9t2mQtkv/OAUw0WkyzWhW1cyaZseQemePWnOL3Ua+/XFV0q+jB1vj/95ciBHaMbE43kLc+DmdTIsV+05W/ASjKZNBseGP11gbhbnejQ3nDKDsGh+IbH1/xIYeLklgBjlXGp87XXX8sGxlKp/eZCG9450eEIE3vzFVRR72IChtl4ditqw8dOcRdjWJrRAGFNJJ1ubv2xMN9rThojvgh72SbVHnGE7ksOtvP7lNoR+ws4Jkuuc4+IZRHnqTkaz0vKrtVpd4wQzQeQXCaU2DdEQCFubnyA0z5S8nNlzR1ZUSqAHtt8E7YDILUtlXeSYnKYUoxRIgcbTu8dCWx5oljOjx2gpnY5g2hjxjEkQ5Bpn/jfVmuRHw46UC5lw/9yKBXv+vOIst34LNoPNrj0ERvCfFj6T6F2Fl+mXptR0VpjBrfuO0LTEaETUEsY2yhXiN4xiglffgZU6/Vvj59XoydsCmtxO7lwutsQcBulZMYoxsL3cOWeX5kMw+tNgYPhDktqJFqzHXXlbPaWZDdTxmXJciNZKsRWw3QF0Y2c7DbxBCSEry64r0ZC+GdT0tGaY40pgplfW2ri0uFEpS/FGA7XXzOJFAA1a3NKlmCRnk3EyMzUI2cF6zhtcrsXQXMVLeaKUvnoCmYjO0UpJXzYmOlXG28MUUYD8U5OE4OadLV5LBQXeuKv8kUsie6irlY5rK2Xl+JNInWFd9KJNrtROrajo9EUndFQP3PZWB+D5uZWz8GXJZTTmk69bj6PTQYJZJo3NZpjjfBr9uDoq4ScmolegFqVOkK6edDCXLVhhrtLLi5W1Ff6IzdYYpj2tYui97q/CXpx/JvBVV9kr2nZx/vQ3ztBtCVqAZZkMUlJh/ZfoQdoNoXIE/4/XZ8velE1DwBw5zsxI6M677QYiO1BuB1CPvq+kq2j42vZ7KbpAQU8eIsve+cP6F0rf7o0J4XYPm1nEbRcGL3aiiP4TBnUy1N36qTYcdHLhPlvSBg7vCitG/HY9U6NzajUTTXSLSI56zxdJPjtuoPXR1XXL8d44qdWK51vZi6rlTJMZkfFR89G/5YiHtzQrlQvTyOZrKTsDSljatxvkryfulZw78RHvduZREIUy/l8kHAhTrsPGEvd5TUMQGHWW5hkgchSw7l5u+XhEjV41okkpv8BTQ2CgfMM5z8sBGKy1T3mCJZ4XDX5G95yWT1dW37cdNWdlEbD6VhNb8VWoQHqBe99ORxprgtJjXiF/PYO35nCHnJIG3+etqFgPGUsXw+KQYFiONDhCnD0UwC3RK7UMrkFdeg27XrVWcyNm4otZDFKywNdn8WljO/yl3P/ZuAqAUH9Jw0HgVT+b8lhoLnGA9G7AvuZjKoyHmVC+2L7hNAqk5aakazGr9NYWBmpl0OhbokfOrl83qldU/Fk1yUYk7WZmpnkAyIgFqh7Za7tBcR9IeybCuX13TGmY5ecasy1/wHO0IE6Q+685oTqhiP7/4Hidp+1V5B2SwYhIK5G/4jmKErRL+J4MV6CIDq+SOLHvjN+n6cj+NzY/IFRszllLr6SZRye3ZpAE0RkRI5tstjnBSG85+JgUfYHiclNb6abGaVfBTtgEy6YMNQ95HqlurXiW074991+70TYAClvlUiO7/757FxgwhIeKXXS0Z0lalu2W85sIIk+uSlvaSatzZhtPvhUnzyqRmkZgCqs18E6CijfO4kPhhvgZN7FwNIAuIfqSAMNHUYyo8nruyuPSI6GELw4vw2lxNxDRnJjJ+ThA335i7qq0PjbbpFOnVV/AsklqLow9hHKeXUAJeUTFEewSVTwbHOLJlwNBsQn5whwZaIcFE0F3ap2jA1GKhtsX47li2JmKe3/J6QZoUttqPEuSOHM9VsB7bGAx+kBpJLmHEQYP6D0HE7+9dsVJGE9LoCt4TUSgz6vv2HgqqN3Sjht4Bn0e56RlmUeIJUj9x5nfQos3WvegzomRXAAvn4KyTe+jenn76B8E56NAFiLxL4IAnAtnNW6kFPgQlp+LRnIbA4DBYgL85mY8otPyq2rRy0BolMjKxCTqVo6EazEBoS9wvr3LoGiwox09KFuM0TEtl0NydqchO2b6NrlcuC6gsjHkJXE9DhXxDjLcBQG7vqPL2YfYOHKVsrrO0C0RyBzi7wK3Re241cDGDfvAv7eFlsbGfBfItRobiON3xf5PyFXsfMAhbMSNSt9CnYs+xaE26+DeIvMggYVpkKsXqV3TCfHVm9I/LiurZYsMwpdm0cpLQFchzMfgQKIfkIjjebmiT+uoYdsaoIanDRnwt4KmPnSTvP99N5oAmz/D+KH8W+vri1EhCRubTW3WPvmMf7y8tTghtOT1dVw52UNYDBkpARuW2mZaj797I7AsnHuprw9td1Y3ud/Rt3dmlkAasXAsCzP6/1vURkzVKwNlJo5a9Ox8MZNiEMG2vt2R7tLW0lqA+Tf6xuDiMmLYGMg6CL1o5u5aEos5UuDMbYlOv1osA0sstn+nxLVcTvntCpElHu6NPjkEo5Le7Dd9jQuAZiRKd7pN+G64q3oPoHG+xPFAe1VgjBGbtssdAqXNxcbqfOZQstODE/GSfvSB76+7sEKM7dCl1HCn84cqKDjezacbLnxhyQVvtYPZhE10G6ATgckLHOyao2Yokw+7Nqu/YsouJdpcREe3ltqdH7MPDYmWC6vfstDyKRPTKGNAp/ipICoZfMWQKZ0rd8bFaRLlY1nufaylxVd0lvetKXoknw6Cln2Bm3U+lE4zVRwMjW8bOszjEiei0Ib/9pPFJpv0W456U+G49iPxQ6D0uDR/47nfRESNc7coakmSQ5xTFeVZGY/Dc0pTo+eJyVfaSAYq6wb+KyzEr8Z8dcjvQtEiK4NbRmyvAI8VuXimmoy239KvIxvAjLXOtEooLUguDDWqt77nW5XzTnq42cFeSMPMacEfxonop3eIT0sIAVP70+wDTWzdzrPjxRiikjjyovFdULUEm5snfioI/V0iM5kOG+ITU+OYIqOOJc/Bczs6Yy0zxpA5kju468HjiTbmhEJ8OlTl8hAdE6Xx61UQWlxNztV5iRErgCas7WIzwy5v+XWVfbJ3UyArX4w2A9WAqHA8RFHNjYZWovFmqaZFJ+4vK+fezY+HdNNdUTWryJ8KzBF3Sl/P1eHYQtDctpxP7s/yXASWEhUA8DrXgH/5clXhV/EHK/hl+wFA1lILNtFokDo59nJXXiu7wKY1V1k1/X+jPm9gJk4nkfZs/Rll9Mx0b039h57xuWKBmLoY2lX1YWdNaal58fpFDGLz2DO4cBd7CDeZHfsc2MN5h0IYQT4rwFxqNDIsBa0AxrFtZ3bkDn9BYDhp2jrV3E9OB8htLUrfJJf+Hux0M7A+3wwaQOPDs3hqKtfQ6fTJg3YAqYMjnzgFRDWrHR2OxRdWLGtWYNz6yUP1azIrjny0NzzHAuOK2ByMAk74axz3smkK/XUfjy2Hu1NXhcQ+EEOkclfLPj11nn0fYH0e4nBxImvMYRhwRxWVVs4lsuPQDBcxuWESlEVhNnS3JH1EhJeIws2cphybhOAXrDhxTiicGsar7bzK4po/kK95IWHD442k7dCnefVIOZO6oSS+K4wIjGq7xGxJhxRTRXrGiQZK2U2lcwnvax0rX2Th1hfGdaFJZwh3M6FFlKV3AYmAQGMVrzrH0SeNwjjjJo7824+c9wDJENutY8mFtEaPsYJ/Xmo56QjoOnUmaHLZY0N4sTRhag4LIIygt9laT5fuvS5pgRvYXytgNzW2qIAjHzLgUBKEY5cHGlPWUjBAWZSvq+0A4IrwlnehAGFRajO8WbTvSl5xTDx+4rt79JTeiF27oHahErNfJdBcpRJnSdwGvb3/ax4i3YkUYS63+wgmiq3PEhc0T5sd+m9jYiO6j/boNUEi2arrmd91wBAQywLckFShejtzwB7kRZ59L2jMh9arYgY9yr8ai2e7K6MUTdMruiE9fyVdMoUc4O1mcxF/LSSVm3bAB1icKX33B7LygHfGZnUCF4GsYzsqpZDTjvlOkUXo+Cn1j+80wb7xNcKakOG/NS471eSAgIgeop3KnqzWNXGbm323rpKsa4w1eiqG7CCskR+onOPJgfup6m32ZcAfy3PWqXX4gijUMJaEbOheUbyCOKblU59aQ4ypWDeQ0lYAACvMUU73bxONAAG8M+VUAADj8sjCscRn+wIAAAAABFla"

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