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