svgui/pyjs/jsonrpc/jsonrpc.py
changeset 728 e0424e96e3fd
parent 721 ecf4d203c4d4
child 1730 64d8f52bc8c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgui/pyjs/jsonrpc/jsonrpc.py	Sat May 12 11:21:10 2012 +0200
@@ -0,0 +1,43 @@
+import gluon.contrib.simplejson as simplejson
+import types
+import sys
+
+class JSONRPCServiceBase:
+
+    def __init__(self):
+        self.methods={}
+
+    def response(self, id, result):
+        return simplejson.dumps({'version': '1.1', 'id':id,
+                                 'result':result, 'error':None})
+    def error(self, id, code, message):
+        return simplejson.dumps({'id': id,
+                                 'version': '1.1',
+                                 'error': {'name': 'JSONRPCError',
+                                           'code': code,
+                                           'message': message
+                                           }
+                                     })
+
+    def add_method(self, name, method):
+        self.methods[name] = method
+
+    def process(self, data):
+        data = simplejson.loads(data)
+        id, method, params = data["id"], data["method"], data["params"]
+        if method in self.methods:
+            try:
+                result =self.methods[method](*params)
+                return self.response(id, result)
+            except BaseException:
+                etype, eval, etb = sys.exc_info()
+                return self.error(id, 100, '%s: %s' %(etype.__name__, eval))
+            except:
+                etype, eval, etb = sys.exc_info()
+                return self.error(id, 100, 'Exception %s: %s' %(etype, eval))
+        else:
+            return self.error(id, 100, 'method "%s" does not exist' % method)
+
+    def listmethods(self):
+        return self.methods.keys() 
+