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