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