import os
import logging
from twisted.web import xmlrpc, server
from lechat.Credential import Credential
from TDB import TreeDataBase
import pickle

class TDBRPC(xmlrpc.XMLRPC):
    """TreeDataBase XMLRPC server."""
    def __init__(self, uri, base_dn):
        xmlrpc.XMLRPC.__init__(self)
        self.db = TreeDataBase(uri, base_dn)

    def xmlrpc_commit(self, args):
        """Commit changes to TDB."""
        _args = pickle.loads(args)
        cred = _args['cred']
        changes = _args['changes']
        c=[]
        try:
            self.db.commit(cred, changes)
        except Exception, error:
            return "Error on commit: %s" % error
        return ''

    def xmlrpc_getTree(self, args):
        """
        Returns tree rooted at base_path as a pickled DataTree.
        """
        _args = pickle.loads(args)
        cred = _args['cred']
        base_path = _args['base_path']
        _filter = _args['filter']
        result = self.db.getTree(cred, base_path, _filter)
        return pickle.dumps(result)

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)

    from twisted.internet import reactor
    #r = TDBRPC('ldapi://var%2frun%2fslapd%2fldapi',
    #           'dc=lechat,dc=praksys,dc=net')
    r = TDBRPC('ldap://localhost', 'dc=abadcafe')
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

