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