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