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