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