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