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