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