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