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