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