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