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