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