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