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