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