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