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