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