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