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