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