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