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