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