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