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: