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