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