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