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