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