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