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