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