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