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