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