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