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