#!/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+Wj4ClyEltdABQZCgMPj8dYIupuhXtLgOG1xLA6lSAf/o5AW4fG7h9eaFxF09W3lZpriSoc/DXsIX54I7z2voZjL9/WL1gwrDn1m+EXM5x9YlsfL2dPSTB8I7uin9/L59HY7fMibAsT6juSuzceT7qlDiFRtmNwaxNBx6R5gQ8ndVhks+uYezTorLRztCVFz490BSk2kwKOmOOB8h43gsof3uHUT4qZS9I+y/rnje1YTQjYqAwaCtz1qfAI+XI5U4txjVCoymNic3+fI5cva72tt8g1vhyHnHoyQxAa/V4uWY06tUBpzxUDj262IaKuhl2LGxHaHhVDdV3+vjYynoc9EDnXvOmnznVJ6ngIj6q9zx9YGAarmhwa1x/yCtL8YCtpKYz4kFr936R6c4KN+GHXeiNEZr/xW6Om38kaa6RmobTWzzCM9FcXozLwP+5thd/erSL2tJlibOZdprq/Hiw1I8ztK2EfbMpqVvGljeUAfa1Idss/WJg0+6efx8MlvY5cL2EMn1wGiNV7I9DUArsoLv27DEatON/yQPdkWP328Xp+JhN1LFu3QiN2aNEM5wijuARm1N9WVTGOkwvVSO5Rv0W05DmU+aoKcsMS8GNV7qEPH1CUTuiBqoTKqrPQU2hCnyepfAuPxPOI7VGe1kzNx/7J2Zxx+lPxuTIy85693ZEBX26ZqZNoegllhwaSHC9Bfp6kMEYlg0ZeBYNs5mKZoD0z2dJ+V7SCFV3y6ocBOBFYfKXohO58e/bUNpjeuzQEtoG7LaxiP4KPuLJmAMZKqm1yGgBjTR5+6gUw0mbS0PyXNuE7lZKwdBNOT/huIxenlc4mtKIhVGVQJ+DBUAA75KPTSk5aDHoTlKV7o7YrqJKZUaOwuGb1FcDy0cHBdSokxfGpqPujX1LSd09A/Ujut1pcTYlgrWB7odmuo7ERjcpkKzSCL8+2/HHt3r8L+5oX5Ogak9tnRqP8Bo03dORaeRj1zsa3cYTKfcIlvN9ImCD03TG9CcQ5VloQKWSVOOUOJXO/r1d5nHlWpRmbwxmfUukJqLAHftYSQ0niaoT5ML4uSDRxPApzQrHp+Bzh+u2EBH4ENxBFZVzRHVBm93LsV/I9K6fvxmmEO3W2e5ZEr0NhY+DPz11wBUb63bAG5zpuIYks8awq4a+aSVMNmZeAqI3lzNtXSt5s+nTK7Effef+ed+1ZAnCcp67w/+yGWsovTQxg+s77T38RTpUC08R10gnT+E2fZwy7JscE9jIToJfx2N6Sa4Id8xonm6XvzfAgAnH3M4tLgf0hfOqt5mHIrc0OSB8RnI+8GeX7yj7MJbuPwO2v3YOZese8AmQbshbl81b/pLa+YhjCTaH4x2NG8nenwALL4ghsR+IUVtol9XcvKk/pPNf/3E2edI/Jrhxo0lSqdOlyd6pIvjjJsbnwt3RLzS+TNU2Zb7ngj1+8HbLs73LlkgnnRv7nAj1+qv2Lg29PKzk68rFVUnDBjqWLADIyYV5yyn4pLcf/WeeSMHzpK5HOrk8RS7RSrlKtQRcRtmqhAgUR2Au/lp0DfA6SELNJTaHpqA+xWLJSz5Pty/XEIEN3h5oFmH12gSQM1XNWsZ3aWFTYLZCguUmPVTbTq23ymnU4zDExWV29B5hGGxolP51oP1GmXLcBvOshZx3f1bJcugfPJFb2tEVTeIKMRNLJNr6L6UfAaa8MAIfZmDWBEul2IwJElSRe1MNkECw38BK+cptPLEifruPO5IIO8PyZqo946QsiqNRLFs8/CG/KqjHrpTFNJIx3zmrs6/p0z5c3SYGhF8P8zbThfWqll0axAIIfASp+MT97bgqvxhVczQeQoZ4tL8MnKZd54UREkjMe0m8klmzKiXn7yOF/kF9E2kUmK+GgFiSqY5Co0URhLEg8Cm1dkIQBWwtMGmIW/ia5P9I1Yhgv4a/qC+pxKSPfRndrJF4Q+bixWpHBuSM5zZfTdGdqNOzgo1FO++niThMf1f1h53J16fjSWvRmmj2ytyj5NuK3TiKV4nX7pNWRjye560d7DSn4Ygzq1o89XmtG9VLuzJfXMvhfSp0J/erI3P/PX5I3OeJos23hixxYTSlq8R9XQjfQ1mcM2247Zo/Aobx3oSLOV0gG8lZYVJgxZm34D6tLJL0bt4wJPcTk1UMT4sf1r2QQfh2TBgbPTsYsvUIxgR+60mnVYpS8veWsnkIHpHy/bX9jugnPDvJr7D4J7y0wFU4NZ7Jh7nJG5YmVuXxlXj0GxLSievcPDaz+l01bKO58yHjIjoBkCfNex5//bAqy2B0QcNQiiaeTBTR+dDlVPIZ6UCvIyNWDPR5smCOcfd+y2/3xFob6fI1w/791CvWGQ5x1NNRN4yHh8Pi++mVLecVRFBleu+jFN2+Cqni7foWUi80k6gvycL9VsnHjrWkm6iv0uLQJQ23DYZjRAFnF7W/7eajvXhuba+oKqfeoq08T9daBIfnmItH08KMNrlJ++XQSjt4Ldjp31khTPmVdVXHL/nD+USeM5VVqE+JqVCsT5QBcQMvHsBYpHufEemEGWA959dEsx1rgYdI3UPiwThf+dNnRNgMaizHRd8m10T+nD+J8ylv5DrkbwfTQF+Oqon8moCPG8gciUaeLdupi6HvkficjtdYitvjXv04an2wRNledAo1r2PbIqPtbkG0UTWsMgS827IEj6heEyM41hb5KG//uDaEZEH3p+DqEyGE6oxhegI3Jt+g74pbKVLfuLgQPQ/OHPAL0peprNEyAPjHrhxNKchgi/d6eA1QowfS0t3IKxnksyDX8SGWeFczApSOe8GcKYo8Sl/B+HFE7CLA+k8G3TtuTTKIRo6kTMaH/MWTkKB4Frc2mNPEOkjVJkiydUjK9bAj4/EEN6238toeYdT0MaYH03psVSt4HkLATxSZwArAmZWteHRvEm0VeY7KVbT5mMypYg8+O4uCdFeF2HHfu4xjY6aKsU3NPblT+BeQY1Bk28h20ocjgunsLXoyMULf1CtSqAzPaek9y9twmHYeMdw2mB7SUbgcwezLpoePL0vZrF7tsuamGasVJDjPqo9ExOuLuMWoDQZHyNwKvy84LC6c4hU/b/LsaVzPpwaaO23arKpgdQP5HjWOodN3P2uGiH/32HgnhQxSmQ7u6u80LUxwSJNcxpm30DVEbNVahdEi0kW067wZqXuhBxJuxi8onQoJ+osRvi1grP3e8Wmwy63K4TJv3sLK1X078rKtOKjw/zgN5lc/siueyYeflfNqTvblz1T42TbXX09kargIKYstWccuXqtEF3myaEoJRuusD/FAOiWpoXqRLksAPswB9kAKViz4jtpWmbWID4+6EMIOjkz2I1miiVPfyCLwmOWgILDy6Lv6loK0IyfTwh2n6O615V+G955bSoopbTEConrb4teAmXefT3QwmJOp48OkhqtoyAJ6BsPIcRAAyc4w5Urmor7iFjY+dIi4gJc97qYEM3pZ0CYKmafStTsD/s7113dzkLXhzbarN37DRdX4P5noffC5KmkIBb+/B/+n1Cx1bHaEJpCdOZMP9Kn6wY8joF3UlJ9pidDCM9bmFMBGFDjfw6ZbHGUpOdYOTaUYR76V+ZFmxAeRUFWanR2yXBW5zcY79thmxNbBgTVt3/yfOENovF2m/NOpQvSLnwzesPvfzGlhAZ/QK3f7cCjwkPE4X5Cl0RXTwxlFTuavQZxDva3vFO/2QIU20IcXUDxfkBMXxwrI2mEAIbsaLQr2aPwy28cCh+Q8cJNDNEYuH1uR0J2tA2pPcNwjsB1vX8lWOetrN1CcHADBlJd2gmVysMFfpPvZwWVbqEXh+XDcaX7WoIpBuNg6MK3Ige0VXRBsFce8DMvt26CSDz4taiOmHbiFf/l8ZtzgQb0P/AxZsa/aSQkLqUVfqreXgEC/aCuVyXj6nDdgUuxmGzJbgvxKuFogJJJeKvKkwTSbPl3I6F5D+QU7DqTW+G8ujEh/uOqBLvp93CDmp0HCGwj9vNOTDRCJpmCdFvzz5ySC7bPTiryD928iD+d3s8C2zHXFLXjOBp5nO8eMzW2JAMJYjdJ3KW2FS+Fukgzf0bbvtNi+hp3YrkeBwrS/pYBcNb2gWp6RJYkmiN+fBpAvmgFwEmClBJHuqtW+1wvkd/fjdmn4Qu7K02kKFCmw/ocfm0+LZktNYrb4juFpX6Y/i1fdmQPm0xlrfPZAxoM9LFnlgY3z8lmw7lXCC82+5ZHImNa3CqEYVvJzfmzt7IrFAlLGhkLWRKphUczxuzPd0TmAUNFhjmFUYBkFLOq9bhP54CTw3j03ZLz1IzwZm6itZxYU4Vh1P8WYhPTo19ctLntxrobOD0Sh6zGr40zyMM2rOk9VtITkPB23zDm7zLp2GYULolh9CicjpA2RpRw6uUuUanUKnX7iDt0UYRSUQ8XI1AnXWQAyNr3M2Cc/48FilaifktAx/QL93qi66IZQAT28jvIT+DfMLGTd3qCJRKupskbBRRlBM9fVxkLE/2ZmTjpi5k25UzbdVt/djKG+BkbMIySOHHD6GYFASY34AQNWEXY7NuRF1OyxgvoumBYsdqMd/L9WHWtNDmuiIpWPr14fKDTP4Ohwf3bxWN9aNWrh8OtE4i1x/XNp4OsW/0KyL4sOfUrKo9zGMSi757VhP7iZtvcDfkGCDKhEzjLt9xsinYuWVrlbC2TPGo5eaz/yhrzzMtH4bKbudd8pw2UgUEv2Uzs3f8Im9Np4nKrZx7KPhfnbYGSRmdJs9w3BCy0ExxiqPw6ioErDO8Nk9dd6EudmH0pKhET/7ysPKPW4mEHN9KFw/CQ9tPV2Ws4T8lLXsBcOloGnkDsqM5bZcuOuFT7ImHtDIUH8LMFLV8HmpDUZXlQ+Ci96ywOPhZtffVWXUCskIy8d/bU1uROElUJIyl+IDHGYuLuznbhff6Dq493c4P+un2CvaeOAFmAQDtlzGDoebC588Hprfgg2G96SflDoPsmyPHKzznx+uUeaU/wMHO/708Om9Mr2Aqv11npLlI33v/5eKxXQv6u1KUODmZz1+SSdan/r3IdOxl+1V1GMN6zuLtUznkEVyUAXmDBxLx9J+ARiXONE/krsyJUQ6XS7M7rCYlGfMFVbHZ8deXV0udSTGmhsoVFbrhTUYopMUAUZvCWPntXNiwDD1KuO8xI7QYp541RPfA8P8spyQ+u76tSop5FBv9d04TdLQcdC/vKfARk2EY9HT3Sc5ToGxAdD64X0xrdooKsqlC/lJr5oQpFVQ19TTh9ZQy71wBNS18jsItEUR3l2ADBvAqKnX6wb3QVwbwtSjbY/cfN9mc3On1O0BsAM2Ci8HBkji+qRh135X1jUjaTdbf8YF45OwfCHwdunWg6tXtWU5Jlpyj1ZmwPIurlZgshM2bZRzRoXOWef3x2bD9YxsrHiV2gSCrp2R1yfdV/YVl7bSa0Xz+dh7nf+Xlj+af753KGYz1mpdOSWhVvQUYxcN5JLW0F73ttuXH7FTK3xioMXBKIBist4xd9IxCjP5JnARINiMx1RMFV07SHtUV7gLJIcbVp9vmEcRNqh3HfMfBqNDvZQ1khvsYvghVq4ZxV3xpeLGpLPxX132Op4XTHyisJoHwnKVwXCmiNmJRuzmDfUd0RM33/hKo0qqzuxdvnPJyo7LLmALRaUYS8uMY5h36LkGE9ubB3NKEAeHOM1BeFuv3YRNMbh1VHDEEgYgvKFhonSw91U2H8eC9NSSzCDRup42uzLS/nmT54K+/feQMVtRcU9HoMrBL/bvPdulkWSkN3wHnOxDXtZeOJ1idgPUrK5rGptPQT26MlPdkN97jhgjXqONlPj7279eOOVeI3Utv1nsaWHp8uF9s0XKwkkbf0fqDpY1+9hf3SN03ecxlBflR/VWr4l0fG28Ff5EOXY4zRvVa2d8oFTKxXtHSyl4ULb8uC+wLZhwTTkG4FttvDwCKmfHBF693d9X2BG8tExJ41JuJ61IZk7uyKZYscvJzeeI5iF1XgCtoigeRVzfmuW9g1yQZBJg+xb3S0qKcEabg5gq7HM9vI1DHHNo4rAfslQS5mubf9SLdCxMog7PtObwtZYim4oNqjS7sS0NaIBQofLfLr5Ul7WdjthdQ3WnPf0qcuuOU96XqaQ8wOxzWOqJK5w99T+hi7u71YwmkdFIBsgTt34VPwuheeffz++qexfG5khBMtK5ktkgRaIJaQW1h8rqQR71llQkPT/oSwtWwE6hyiqTldcyMj7st00B1GAy7fwFRbor8Ben7PzdMJYivuIAAJqu80f2N0v4AAH3JPNSAAAvN2gEscRn+wIAAAAABFla"

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