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