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