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