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