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