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