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