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