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