#!/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.1\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
