#!/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
