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