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