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