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