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