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