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