#!/usr/bin/env python

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a string with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a string 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

from optparse import OptionParser
from sys import argv
import base64
import cPickle
from cStringIO import StringIO
from os.path import basename

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = cPickle.loads(ppds_decompressed)
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.iteritems():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            print ppd.replace('"', '"' + binary_name + ':', 1)

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'] = StringIO(decompress(ppds['ARCHIVE']))

    if ppds.has_key(ppd):
        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])
        print ppd
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = "/Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4CmKEnJdABQZCgMPj8dYIupuhXtLgOG1xLA6lSAf/o5AW4fG7h9eaFxF09W3lZpriSoc/DXsIX54I7z2voZjL9/WK5irbBLlCCBXZdwbfBDGhBhgypvIdP/hLw8/vjsm+KYfZomuTzc8Waw1D7mqE2RiomnDgDJR7np/yzSBX/dy8e29UId47B90m9ydbUPWLch/KyByG3iH57we78848ZiRZ3SFan0spix8hcPiJtfCvoWI/ST2JBtTlDXDP5FeZieowVEdb9lCtAdG3pH+a3uwvhGiabJlheMfUUjehq6RDhGqXaqrhuryPO7PcaGstMMX3a9NMJPaJZulvepfjXwxn+0pLpxKQvxhVtHeLkeCMv2BvFLPfZKJ8jP2lXqb4U14Bzo7MQhkeVpexgIIc7XgllnxcbAchsSsuZYlCo/61RVwWrOisZzalOUbC1oqRXpeWzSqOxr2jyKLEnSV7aJy62yVHg/Xp4HT0dIuXHlg3iJlN+h/3KzzC6s/spaFa/k8t7z57ScCvTScHhAP8qoYqav9qA/WgvNNvbCUPOvsafn/fKNRWCbIwg1xmoy1wikLjBo6yrJLRPAJUF/qdIKmZ9O1Z7c/NWT83KFP13sXVszURvC+ISfxwj3bT5kXdskicp/UT3o7FDnPH1y5kd97kHT6Qh2irU3+B34+kGf5lQ14Bo6SJiD5lvsriR0XtGOdlr8jgIr8i8OnLcdRVViUKdHw9UhtFbE7XN/HYx4EhoUORyfZ6Yo5w+us4Q/VPvWUzizW3kJcGdbqGIizULm0Bfo7aNAfGbylLSLYWyATU6K7abwoHcPG+U9RS1L0trAIopV7bTYShFG4yDfWcf5d7b3IwUEcPhJgWMt7uDn2KwRBbB5+eKIeWIVXA6RVj3GvudIfffwRR1ag1cKK8JeEuMvKP43Wpq68WJumODkoA9Y06Y2IDgPsSCcjTKvFd/TqA+abJujOFbCnhP8PA/LE8u9+e6OZ7XyYDzy0+ieai1jqQC6xQ2roDsyaDCMiZ/B6jJ6pHR+odC/S5a7LtdhN8m1WExgsweWBs8jk+MEzBbqtml5ly1pwS2C80Ci4fdsO+Vh3gS5vNCX3ZUvNTbVn0CtQckHgJGypzIXyqsvA2omwh/4gQgqOs701tnkN0mCGX42GFCpiNmtTxbZHSO6JZQDQsG3xUzY4SnHsUhs+d5NGxrRTGBX6NbJpmradJsAv3dG042N3H/LSNSzTH6nGu40DFwr5UXlZ+505BZ5NyBbI1Lh3OwZsZa/Gt9MpNg+pLdI2Rrdv8n8YMP6hTO1SDFRNuibttY+Wftrzy0lzIrMWVCbW4OVm1kS7myv3w4AIfif/Ar8m9iW5uWO0ICcLhBBHp89rQV5c+vSlKJlvz72mkiFi783CyTI0D42VDHQiIqIDOlYGo6J8RbZTwD9odSJlACE3fsv1hDa96CLmKPJ+6Vx18a+JQE4J960HXzPz5n/wy4CpgfC6gz8TgYfBY3DoJ/AEdB0aYpWnIDyIDlb3cR2uiEwQFDmGDk4q4NQYXp2jE0vYfwdeL6kyK5fhDIxB7YjSqPNYMPOpvQ9T6H8oFJMPRob3v6lYI5jFDekH42hH3A09TX6Q+LB3EOxOJSdtZ/iDI97gSs5RYicrSJQ8mOfDBnrYyKOoFryTcvHi+KdyEkukbLoqFo09fX3+EA320VA3cCUUJTEkNh16J13cEAScOGCPPpUvfOheMweenv9Gr4BSAW/BDPOtxMf/UUAvFucDSvRVvVJaYQrpC2J/Z1Qa3QMAFtXVL3yGYdTcwXhzo8PK85KLgGrwP5RkX+Cb6MamoZcTfQd9VoDhufraSB0/gbj7dXJ3CjnhgN2fFpuGbwmxAxZFaT2CyVxi7fb+ewta28DGb9yvRzcd4Czhkaj8zIojxrtv+k1RqDTtvrltlfFxwgp7S1ke80AjxUm7fA0h73LXDEvhk1qkcEujjd51xRpmponB0+8qvkeB/5AytP3MwKRdV8LynlqvJiHffZJFsBriWyyBN4gjDxm3821ENqrTrLahVZeLOf+GBY6iwMPcnNDcy1grY4agleHDUJweWoR4tLwn73FP1wYbghIT3wLHlqFK5xMJt8QZq+Xt5opa7hQw/ZxQa5ovX+npHTO6HN7oDuJCGnI76Dd/OTt2nNynoVQo3wKGfNk2fBy1IRFkN/uaroaKigDaEzqMTNeLHInd5r70xN54BYFXkholMqp9JM/M5NSpFu3txrcE9/Y6S/phc/iyqpN4HYUk5KV76jYb1H+L+aE6P31Sg8AoVlrTkBZyZtCdAWf2Izl/YBY6dYOCihXMG6E1MG90/KoxXYDCCAtr5kWcb7N+JtZ5fbZP/SuR5+FvJ1Fde+200/ZjzhedGPU1LgMRD5dvMLGZpqxJjJp1wf4+EAoF29nS61XmDXNeWpzquS0NhyZHu9OznmI0sjcTEF2jJ7rlElzC6/q8fTedt1RqCSdwTq1w6KYVjp3LQGZ1RCKq9FAaeERWH9/ypDl9dJ73NJxGGzgpx2TJCM8bQSgCzK0J03Bayckuz6stOfdEk57wM+qA/Dsr49Xwya/ncqWGw5EJXuFMlFO8+1TMnErKttmoRLDcYrDTBDqe9SjSajTypampBphWjYG6/sXO4QvKq8MaiOavubcYlnL5Tb+Qvfi/Uwh8aWCt8s3CLiWxlVYxXdH+1yLq7vy04hmUvF06ZuSIOsTVU4AeCl0i4/hUgpcW8Os3FYSj1xhFSRyMtwIk1lLhSQpE+/RdYNobmCbXrHv8L8b2uaAtYj/gCfglqlmE9SN4ky/B2uv9PRKMT5KczaiAxf1V0yLHn4hi//kclii0ThTDa+StMhRB+mRmTqfMsEgRFY9XjqqiwvGIAcOWez/ztJK1Qtq1gySEoQ9Spyj83n/PdXFuqM0wRcsOfyuUm5yArFW2Om1JcDr6997HL++HFHZsArRnESeapPUU+/AB5ELSN9Zc5eGdNW5RW/Oaa+4UEugbVrk/B5PyQ9zsfU2VXKEZwCupfRhVEKv1fNuYBKx9D7I6pGNyOOAX/NExbiAj+R4KRLxXsN10xgJOZLOk7niK/WnnChkTKPH5GETS988rV1xDrbpmlE4A0awq0GwmgOO5cAgBHu3uX/W6aIsHScqwUL0AS0y0aLUDC2rIRZGHJkqEg+mbNqcL2DMlJV/UBgjXGrlIK4IzzsDDlMV0LXziMN7zKRmSoPg1E2LE90e2A8zOQVcMIu6j1mPRbHKwyILMh8J0SYcvOGx2Frn2WAlfIFmPhJGL4UHcfqJIPsQMTwPmgb5c6UBCnuL9tPjji7DnEMBFytb6PUDfC8+Kt1vMhy3YUNCw1mFcRdITzjSSAUBVF7sI29YLD7uYSdMFNPwnmc9MUHqd6tdaKgp+NBz7Q4o8mh5xYQR6ByizmLbxl7LhW1J6mRwmJP8Edf9dUtzRkviOMbRRBCVSJuhSGsUFtIAkYHyz7mtwkrvQQOmAWI5+BI+lhGeoL1T1wDrvbUizcXAK6x74C5axVZlXUCjGGeEK1eQytVEqnBW76v7GyXxHid/tFIAgvGwVv2LFOJYPKrp/sigPEmOTlMp7odWK4ODhSGi0jdQFJmmUn7A5jb0KPcWmIC8RlLAxWqAd509GSc1kc03vdXaFr1K0GJChIfYQLEEC5nl3ruoWXY2T89zRR3imman0b/I/2K3K+yZ/ObB5ZzqdfmT3RTxvLW+ZWSm6IHcLT3hSNtm5b4ibJrA69M9RNtJ9uK30IMC3Z7Xr47j+UNyaliqZJBJ6wsAQuJ3NkXaX+SPrwks45FofvTcEp5IjFaep49+X3TCm7apTe9Y+dQhrunVqlW69uYZvCosTo+EvvDVWBdehotGIUw8SrBr/u05eScKDQK5tve6FLET/TluPFsUySOZ9KVH+6D348Ppwu6JzZvjE5o4VzjwBU/KFwLvLjghvxK98eZjaCgpae1LZmdTdtABLqoV8VGSe7Xo8J7uytVgzwfXkbiXCdOygc4TC3cEXzvm7z3j3opZN/XXNj0BjbDX7ZVeTzIepMIjAvXkaZJZULu8BqXUZD6edS5LmYxxMpzBvrUg6vDL0zamW2xd+dg8iJ4DAEfKmCOVuDKw23rvNBJfztU/40ncOUjgi+afEIVPO87wKbT/N5zKUIkRm+XQinEfzN0waa5WJ5r/MFlSGz/SVZ8MCIP1H4qb7Lcxx81casezkULw19fV0izCWYCxzc/P5K7p2ihqKZZ4qFfhXkc/HI45b1V9O/20Cp4UNp49UIs6oJuEGS5IIn7kXV/PHpkdc1GvP08oOhKOpVIzlvz3QevAZMN/KSLmTGH7+d0Vw47VXTTO1+HzWN/yAvgetlLeFBf54JDq4BC9wBWdC8hm7mJlpWgbZ4kJCJWbfG0nxQ67FlAHjsNfoqxZA2+ar41FGJqj93DkYUPOaDUrUUIZVYzXSUX6UtHy1crMdoua7EYnW4xqyZrF/1BATm3pvnZx3JjqDEVM9l8Ewo22yO+af60cslfABCQTFhg2AJpATyNta7LT+E7Y8iiymS29i5SWz0Z90waf9yyRjKTH5P5+X4BGpj8gkBPIk10hkeTHrVcWzr0FtAITTPDtOEPp7RoZlBOWyqav+P4L/XTLaJg4CsGYtYQ+cZ4tVJG0GegPFScxk40UwEVRTgDJrdCB1C6ZYlG+k3enneQIXipzo72VXppGKkBZDUl74XwWfhI8R/bhkN6aW9pa5v6uH6zaO7kxP1ijrzmBWUyLZdTCcxJgkdD/j1oot2b315QEgLSm0Y7GFpxzORzPKNiUxYSK18L1F3GgM7fZXW4pXmpXK4mU3HqY6x0JN+cS+VRzjLeY1SHk42GuobE0gI8WsbU2G17FJKXJ5mezLYhE/LIW8D96zoIxq89QqeAlSDeXB1HR7eSBgBWdqcE2jek/YV6jhpGtZ1IXfldDtRU90RmuZvVT/txY1udE89recbTwW86brpNm9XraNp2IVxtWz293OX5b0YBGiYJVetq/MGz6co/lJVqlpLrhNpLrLTmKSZUItzLKW+Wwu07meuCxwFUyZChK9iC3vWqGgQZRI167o/s54++WhmUxfjxXdaRViXZejkTC/V+4Xb6NdMDx8qGous2R/f8UY+7xufyOQSFl/oEe/3oqbJgZD37JjhH9mS7waRA0f57LsdiOU0v6vX0frof7WGqajpcTTRUmj5OrEaAy7W9h6IKFzP0O8XM+ka8FLlqKO6nrmitwzwq509+xxgcmoXjFKNugDAQUMoBvngoIGu2+whhdr8cIcVAGSSEgbE6a6W85asXLbfssFlFDJoAE+9yjOB+1t436ClSkM8Q+O4GwsNF6PbctGMIlqadYZwXXYr7JOZeHkl4+OgB4iUP1aaSfTizAM2i4ad2kZN3V7OzV23QT7FNp3FFkkOlAScbswUS+zvqH89PVZwdGM3QLKb81GOOGgHXOT7UhHbxU12ePSrAm57WAP0ZE2TM2gOBnEjpXw0a/ZhgngGUr1WOFNn8bwFkRFJXRAVfCDABbxk0aVYdxFbTUDtrxeDNdSmxmNZ93xnZMGMwn50sqA1dabtPu1nJZxxohoOou82p/2P0plTwTrj0RLQVX2eFuHoaPFqLjmbDRfeynz8jc3PS3Moq2f747oY8DIghXLxPLe23pmCaHrKiosvVgxJE9LUyqBslTHAU+Ow2WwLyRmirAXt+JbQNdsUNRDsOepF45EpCwBdFSPbDurD+/y831kFSKMetqq6TRE//Qs+HolqG+kmTSOyyj46Njp1mnVMDlVQCRjAX42ZKxLvEiuPQtHzDhHo1mk/MIvsma5U5gte6hfKIyJyk05eibkjSsC6hSC8H+nUbGSY6Btrs7qWUqikQ20m5iPWbfcndWvUgPONHMEPbCReiApwI9MmsvuRMiKB7DDEwyNd50AM2AiEDjxUENfvum48tKbgN/BrfDG/jZRlr+1RS0Zduxyix86j7+M1SAlEOAQBUjyp3u2DFwM4s5/qODr6f1t/PT8b/N3srbE8UXgciOo/H++vck+bY86bauyuqO/1OjaoHw0VVMlNS+AorpVcxOOpQ4A48dqM/xQHj2chyqB+Gb99RCLVaAzpXG8iglLeZLDMBPWiqEvI4Va1FtObpqXdZPuRqJFm8QpyrMQv8saavjHXdKkarfP3YE+NQuwBwDPwJiwFJOPaVPDfNnh7c7YNVff7rfkzdqj01+93cu/hIsZYxIggaEpJbNyT4t+3EbbnuRGkDDOMKAAWHQgUanIEbDvaZFd9qcsJuFisHNFpG1pUxlmIlln5wAAAJl5VvIOHbsQAAGOJYtTAADSoGy6scRn+wIAAAAABFla"

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