#!/usr/bin/env python

# compressor.py
from subprocess import Popen, PIPE

def compress(value):
    """Compresses a string with the xz binary"""

    process = Popen(["xz", "--compress", "--force"], stdin=PIPE, stdout=PIPE)
    return process.communicate(value)[0]

def decompress(value):
    """Decompresses a string 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

from optparse import OptionParser
from sys import argv
import base64
import cPickle
from cStringIO import StringIO
from os.path import basename

def load():
    ppds_compressed = base64.b64decode(ppds_compressed_b64)
    ppds_decompressed = decompress(ppds_compressed)
    ppds = cPickle.loads(ppds_decompressed)
    return ppds

def ls():
    binary_name = basename(argv[0])
    ppds = load()
    for key, value in ppds.iteritems():
        if key == 'ARCHIVE': continue
        for ppd in value[2]:
            print ppd.replace('"', '"' + binary_name + ':', 1)

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'] = StringIO(decompress(ppds['ARCHIVE']))

    if ppds.has_key(ppd):
        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 0.4.9\n" \
              "Copyright (c) 2010 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])
        print ppd
    else:
        parser.error("argument " + args[0] + " invalid")

# PPDs Archive
ppds_compressed_b64 = "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"

if __name__ == "__main__":
    try:
        main()
    except (IOError, KeyboardInterrupt):
        # We don't want neither IOError nor KeyboardInterrupt throwing a
        # traceback into stdout.
        pass
