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