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