#!/usr/bin/python

import ConfigParser, os, re, string, sys
import ndtplib

class NDTPSession:
    """ super """
    def __init__(self, server):
        self.server = server
        self.NDTP = ndtplib.NDTP(self.server)
        self.version, self.dictdict = self.NDTP.version(), self.NDTP.listdic()
        self.NDTP.quit()

class NDTPBitmapSession(NDTPSession):
    def __init__(self, server, prefix, bitmapsize = 16):
        NDTPSession.__init__(self, server)
        self.prefix = prefix
        self.bitmapsize = bitmapsize
        self.bitmaps = {}
        self.dicnum = None

    def get(self, dicnum):
        self.dicnum = dicnum
        self.NDTP.connect(self.server)
        self.NDTP.setdic(self.dicnum)
        if len(self.NDTP.listbitmapsize()) >= 1:
            self.NDTP.setbitmapsize(self.bitmapsize)
            self.bitmaps = self.NDTP.getbitmaps()
        self.NDTP.quit()

    def reverse(self, str):
        out = str
        prog = re.compile('(?P<bitmap>0x[0-9a-f]+)')
        bitmap = prog.search(out)
        while bitmap != None:
            a = eval(bitmap.group('bitmap'))
            out = string.replace(out, bitmap.group('bitmap'), '0y%x' % \
(0xff ^ a))
            bitmap= prog.search(out)
        out = string.replace(out, '0y', '0x')
        return out

    def create(self, flag=0):
        cachedir = os.path.join(self.prefix, str(self.dicnum), \
str(self.bitmapsize))
        if not os.path.isdir(cachedir):
            os.makedirs(cachedir)

        files = self.bitmaps.keys()
        for file in files:
            xbm = '%s.xbm' % file
            img = open(os.path.join(cachedir, xbm), 'w')
            if flag == 0:
                img.write(self.bitmaps[file])
            else:
                img.write(self.reverse(self.bitmaps[file]))
            img.close()

def main(configfile, flag):
    conf = ConfigParser.ConfigParser()
    conf.read(configfile)
    n = NDTPBitmapSession(conf.get('common', 'ndtpserver'), \
conf.get('common', 'cachepath'), conf.get('common', 'bitmapsize'))
    bits = n.dictdict.keys()
    bits.sort()
    for num in bits:
        n.get(num)
        n.create(flag)
        n.bitmaps = {}

if __name__=='__main__':
    try:
        arg = sys.argv[1]
        flag = 0
        if arg == '-r':
            flag = 1
        main(os.path.join(os.environ['HOME'], '.pydic.conf'), flag)
    except IndexError:
        print "Usage: %s" % sys.argv[0]
        print "	-n 	create *.xbm with background white(default)."
        print "	-r 	create *.xbm with background black."

