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