laurent@371: import gluon.contrib.simplejson as simplejson laurent@371: import types laurent@371: import sys laurent@371: laurent@371: class JSONRPCServiceBase: laurent@371: laurent@371: def __init__(self): laurent@371: self.methods={} laurent@371: laurent@371: def response(self, id, result): laurent@371: return simplejson.dumps({'version': '1.1', 'id':id, laurent@371: 'result':result, 'error':None}) laurent@371: def error(self, id, code, message): laurent@371: return simplejson.dumps({'id': id, laurent@371: 'version': '1.1', laurent@371: 'error': {'name': 'JSONRPCError', laurent@371: 'code': code, laurent@371: 'message': message laurent@371: } laurent@371: }) laurent@371: laurent@371: def add_method(self, name, method): laurent@371: self.methods[name] = method laurent@371: laurent@371: def process(self, data): laurent@371: data = simplejson.loads(data) laurent@371: id, method, params = data["id"], data["method"], data["params"] laurent@371: if method in self.methods: laurent@371: try: laurent@371: result =self.methods[method](*params) laurent@371: return self.response(id, result) laurent@371: except BaseException: laurent@371: etype, eval, etb = sys.exc_info() laurent@371: return self.error(id, 100, '%s: %s' %(etype.__name__, eval)) laurent@371: except: laurent@371: etype, eval, etb = sys.exc_info() laurent@371: return self.error(id, 100, 'Exception %s: %s' %(etype, eval)) laurent@371: else: laurent@371: return self.error(id, 100, 'method "%s" does not exist' % method) laurent@371: laurent@371: def listmethods(self): laurent@371: return self.methods.keys() laurent@371: