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