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