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