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