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