#!/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 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])
        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"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"

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