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