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