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