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