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