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