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