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