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