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