#!/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 1.0.2\n" \
              "Copyright (c) 2013 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
