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