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