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