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