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