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