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