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