svgui/pyjs/jsonrpc/jsonrpc.py
changeset 3359 2c924cf26161
parent 3358 7478d0c0dc1c
child 3360 746e3e3f6537
equal deleted inserted replaced
3358:7478d0c0dc1c 3359:2c924cf26161
     1 from __future__ import absolute_import
       
     2 import sys
       
     3 import gluon.contrib.simplejson as simplejson
       
     4 
       
     5 
       
     6 class JSONRPCServiceBase(object):
       
     7 
       
     8     def __init__(self):
       
     9         self.methods = {}
       
    10 
       
    11     def response(self, id, result):
       
    12         return simplejson.dumps({'version': '1.1', 'id': id,
       
    13                                  'result': result, 'error': None})
       
    14 
       
    15     def error(self, id, code, message):
       
    16         return simplejson.dumps({
       
    17             'id': id,
       
    18             'version': '1.1',
       
    19             'error': {'name': 'JSONRPCError',
       
    20                       'code': code,
       
    21                       'message': message}
       
    22         })
       
    23 
       
    24     def add_method(self, name, method):
       
    25         self.methods[name] = method
       
    26 
       
    27     def process(self, data):
       
    28         data = simplejson.loads(data)
       
    29         id, method, params = data["id"], data["method"], data["params"]
       
    30         if method in self.methods:
       
    31             try:
       
    32                 result = self.methods[method](*params)
       
    33                 return self.response(id, result)
       
    34             except Exception:
       
    35                 etype, eval, _etb = sys.exc_info()
       
    36                 return self.error(id, 100, 'Exception %s: %s' % (etype, eval))
       
    37             except BaseException:
       
    38                 etype, eval, _etb = sys.exc_info()
       
    39                 return self.error(id, 100, '%s: %s' % (etype.__name__, eval))
       
    40         else:
       
    41             return self.error(id, 100, 'method "%s" does not exist' % method)
       
    42 
       
    43     def listmethods(self):
       
    44         return self.methods.keys()