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