#!/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.1\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+Wj4BCxDgNdAEAAyynXgKBkKGHGv/boY8ub5cGszSMirlh+/5lClAhJ1UkeYmWN2vr6Pxsec2idBocDT8NcpNQXKhH8jf2zUuyQNYL1rf7reG5d2C9gGHjomiufR5e+XtGw1WHSgN4Ey6+1NVb3d3/AnQjZM0kJ38ulc6bBdMw1unYtVf+IXkaJDPhcTv0moyv85dca60zksm0szvkCF99u3cj5pTBeKXG+bWvjOWTkqzXsZOAmMb+QrTm1HfxQDAbwKqqpXlS3bZ2OuMRmBxAAQ0wXqKdxhX9uP+aM7iF4j9CetOzFz4K2W6t+/68Chxaxmnvwtl8+zhLBQIns2+VnBshShXNrE070/xj3+GibwaR1UPdrzR9x1Wij7sZvT0k8kOCWQBYPlB/YdSrckDr57gtoEXjIiQuQJfJbp5qu3OlnZ2glzfvP9v0lHl/V3+kXtlJCe0RdAxeUSkA5xJVBMlYx/uDtLWUhThWLJHNKnIg/UYzVs0p+zCF+bfvKnBa98jYKZqdzPbS7gzm9ZoXaYaIdOj47AtFE2GhDcM5n84a1Mc+zh26H75ufIhdLH71lJA/yMkyzqrvscH+QMzDlhfTsi4v7fGFnrNASklrQNiPp+lSCi64mHmtaCYujca3h7dsn6zieba1srRUuhA5pcVW+xpklskHVGdOoDQmiXHGm+D5S93bHS0LVAxElzqhWxDLVNdfFKVjsyDZzxlavTyD8apF04Dz0BzLMi7sf8GXxZXMD9MxM/cebKDHfO1gQ+qjOKgSsqNZszCGPiteH515a+//op3QougJUMvyDwDufMhyzo76Nh22xA465ZrQETiSGp3cL7NPmG2Ilau2pQ5ctUdDN0yrfAN2JBYXqdyzNySICbMjJ+F08BcgQQ03kyZ9COXmXbOSwxOab6CxFY1fZOJXx64Gju5yj3pPLh8umAzpQPEGKiQRPvPCgDhB30xcFhFJ2ojrau2ZOvzplugG4rZtvuY6CejROhYZQY65gXIcKNUx51oJWUs9xAt+8zUmuY5q3gPyW1bJKXuQ3iVuJtLaIyF/f8cRD2IudiWyPWT2xkMpoc+/6rosBkdIfvzaHbI8pZeuqhXIKIXDSEj7D2xi+0lVb5FrKpn+SuE/jVZZMFQM/+pB7EUsx+rhFATkW/M459+vdfdvL1wwGNrMWVtsRrhPhlERNnIW7jGFnp076xlIElt9y0wIDPxYAGRufCi7RRN5Z8ltNMs9oqt8CLg4YCfqyudpJ9qET5SKLqE3fk43rFaqwIBFU6GP8smiJvt/6EjDgLuj9dhDqC+MPoFRB4mVYx/Yb8/rZ+dBiwj+tvotx7FgwwnZLzpxBhgnsUmAheIk/eJt7T5xBTPYm4UsLVT8z6gLDxJtFwpx2sPzDUUji1j6PuOzf/7pWc61g2Bb4jYwfYB0LoilpToQFO1X20O7L4mmccijWQejuTr7avzA7Ok9fr0zarlAe+JU6D+c142vd89Yozp65NUu1ILjjczEbo0lIDLGbqUyUXvzF++dWnDjqMQ1t1sgNXsKlOjotVnW+l8PX6NfzcAOH5kXtQO32/5k7jsn9gOmV7A97nzAKYO2t7BCLOlMOYuI7kBbP9fDYmh/2cQJga6IrG0Th5b4yK3ftbjP2FOaUOBDDiWiPy7FuMazA9edPXMkueAPd8GBPfed2lb7ukFuYILezoF6wpA2qjiImlAOYtWHz0EON7LRf8p/T72258k71RgnSWsRq5yBlTq1wVZ55iOZVfYgvB8SeKmngmG8W43ikzQ93Q+ZgUI/qdKmo5jkcClQOeQOsLRUIFCOiwmfo0yCGEtrlDE7VAyf9oO017SNNKpFsg+q9Z54B/TxI06at9PS8X1MpqrADvXUHOZzbuXbbGFCd/60jpy24OBCoJANUwi4FMRwa3FmXwAPZOLbtpLinwbbNjVCknyZJUIgcWF4S3vpe0z0XTySIXzH8nBPG1jM85lxvwBL0NoNrx1sR8qd1YvTF8hT3uFT5xdLllg5ImFs3jLV8Oin8HEKBGInIxI0DilXIpA4mPfNkUIm6DFvw07hBZ+8EB+YAWsQPRo/2cxLvOWqreVIjLmmYPQ8DpP7xOfq+uD1S1yB/50IHfVIbYraB5bG8Uk6g6Y6XSsdg/w0OZfBd14vjhrR2uWAKwe9OrA/3/4A5/3x8FtkYc9Nq8wW1iCgWq+lbtFjOncrAgEJAtwg5AwQSsvKgZuZ0igYE4lR6Rbhuxx3VoG1D992CTO5O4m+7pfRkUtv8v5lHScCUjvZgq+yCqUNz4nmjIFY72lSFAQsE/BdJYWvd8kcQAjk5fm8tevKvYd/HvV3LVy2Sr9wc4sttMwJHIulKUK+qtqhRN6EeWzglZeDtcIOeP1JjmDzjdZ5cb49zu+XU4HlUF8tEh0sSwlngTEsnhNIah6rmns8rmFNGBa9er5pUmG647/+97F5yuM98HZ+TkY2aLkVMRUxjRs+GiHTsNyFUjY+tYDtg0T3WiSfwx39kk1MhW8BAxiMingvBBvAsnS2XowNdXNUID0sqHz3mH+bZzUF+y+jQr4XOdpo4WSkaraFERJdd1T78j/UKfl2SnZO+3tR4e/l3b6I0b5CPNKytTMAm+vh7aHPXMhjFjx7xscQfiGqdsQzHgPN5RjQ/DKAroGQbvNZ4RZz7Cfw13o8DNuh+P/gMgO44gwrDvQAiX9maxSLFF88ATSyrlpIqQwvdhBWKHCSXMfllspGbkyGoaUjAjONhOLP7nOpp7WV8pHopcRKG1rWpe3g4RlCZAkIBTZmkyi9KGTmYPX6Glwm7H9R8rv+2/W2NeWM6eVLQ2c2RgadV/ewavmOX/vTs7Kz+JUC2CUtNzoc3QxIg6mrbFpa9orvxcaVotjOvgXhtYBoutdese1EOGO31JYBx9urkU7R5WHcza3pKUFw3kY9kk06Oa1HeRtMO4NfIwOtC+/tqhdej7MgX3jCisDTO8MV51yPNGxeuUebzpkG/4mM/rTzg59XnIIz4uO5nhvKziLCvt2fUsi42Qv56ESyOXXaMEXPWku3m+v45J9k61cTxdsmi610snLL7fg5ikunLxYNrac1EKHKa6jmmd5ngsI/HGdyeHv0aKOnmjnAhf8uRWb4fetUmh53VUTiqzcHzofYzt5YL3e2OfZtKP8LoU+trA0vEWcN4a+jtb/HX2GXh01zjeYewDI5yGNVz4BVVR/58AUY6vkJ093Hp0Ou3Z0xIjLZYAjpdTCKJMb72VJJpbV8GyStlKoknoxWMNemUm9H0b8H4W+a48a+IfBRjz3yaJDkWgrQJVwvEvT0knSsU7FtaCPgSnb2lxSV6kBFiTKU730LZ8L343F8LvRS3DAJh2KgeW4odzhclUF+5KPrPShbNHOMqvNRRGPjpELcnd89favwVzWat1nFDg70Uf3q6u4T906sWemW9ESSVldfzyFDmnpa3F1O1ihFByOHDh2xWBBm97vmdQFufl7Y8q63BgajehIYOwQneNGmy0zpe1QerqnQsN4k7MQNGHCqq9CF0RD5T2V+kVtR9eM2yPieFuRVPodduXIirjTlDnWnjrBwUyGk3TNqXFgub0+8w6AbmRGguVxbBmwc1rHBb1Fvcouo44Y4bdZqzrNtBk2FzxWDcg7bXexapfQ2oH7SIFZvl539L7rrQ/wEKjZ0FX8af16ZOQQU/MBbg2P0wJ3TJk6ihXZDPsrD0KfttzFpYKw6RN4Fn8ipUofMes08z49OY5twEJLgHAjaIznmCBcaRu2A9/x+3LSMXNxYZIIB21uY9ZLyOq0PXX6VpljzzGz5Eb/C7i1NeHd3WJj0feEF15cEJaRWz81Zd3oykZOU2oiZjmJh950yXxOOAcG5lwW8Nr4XPNmsDCSn/uCS//9/u4G6ilh0MezoC9v+0/p7xfSM9lg1dKmsR7mc+/g6M5Do/lc5SW/3EYgDihSTteCSKHT22u9UjV61NFtgFPm2KS7FjCLZ1DaLKvZ3xOzvnqTgkaUvWHS3eTEhpBDFfvCrbPFAdnnelS8AbRi99dXuuBzsAXVdBKtwC/0G+lFCmyKuLTzloXPRG5XtV22Lpp4VGvgl3lLucFa59/tB4LEw+3ct+nvws/80AfBIkKRfuaXZhDqvZSGix5tfIo0fIFJTI6Ahl/dmw4paxA+04dgYp8yr+oMBPJnAuJHaw1zGTDaf6cIcMjQcoE06gg71MUrkwzdLX6htski9u5ivyGVHII9/FTCtnZ5JizGTVFQSs8rSy4fzhupjsIM6fybXZAdIpcvi+2KWgeUXkZn77yC5KJBMyoziQE+z4lYphLF7SLzQBJOdJEMR8vQoUoLLy/Tm+pedaAasL3W4gJ3R/6ApqZdRoCF5TkDHXdSduL8IZ+ft38x3AEm6ufUcDWwmZU2jrlrlMCIOY1VNL8jNccoBztVoRnpTH/m46zgp3y7RXGsx0a9PJIYgNvR4SJ0eZ1frIeDDLIs0pmnN3fNSs6e+LgKFtfb1NE+BFEupU08SKnqtlkZuTNmJro9a4IYOcEr+6MzUjRciz4XZglo679LLyR0v5AtW0gLPcVGqWyF46cmNIPwshBBrorUd7/nj4ZbYEW65r3e4bVAROHGQRB2O2pYs+ZYcL4bDIroAMAYnc+RwKQ4cxJaYSjMCAzV4BaqVI43JP7/kinodlkHJPPljuM2RLoiFNP8gTSdPFirVxgVUhqhxJYK5uEw2sTImsU1DaH610XRng8NOyiH3DcYo8seaGTJ/ddKN1B4rQYIGWJjui0bHg7cgbEq6XCjjqqG1sQlgGAAB7ICx82Uh1IgABnxyyIQAADqCBBLHEZ/sCAAAAAARZWg=="

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