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