#!/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
import json
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 = json.loads(ppds_decompressed.decode(encoding='ASCII'))
    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()
    # Encode to binary, decode base64, decompress and convert to bytes again
    ppds['ARCHIVE'] = BytesIO(decompress(base64.b64decode(ppds['ARCHIVE'].encode('ASCII'))))

    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
