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