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