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