svgui/pyjs/jsonrpc/jsonrpc.py
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Mon, 30 Jul 2018 19:02:36 +0300
changeset 2255 f6a0508fa473
parent 1881 091005ec69c4
permissions -rw-r--r--
Fix problem with decreasing size of StatusToolBar when tools are removed from toolbar.

StatusToolBar - toolbar with tool to build, clear, connect, ...
This problem appears only in python-wxgtk3.0. In python-wxgtk2.8 there
was not such problem.

If call StatusToolBar.SetMinSize(wx.DefaultSize), all is working, but
following warning message appears:

(Beremiz.py:15155): Gtk-WARNING **: 18:42:24.115: Negative content
width -6 (allocation 1, extents 4x3) while allocating gadget (node
toolbar, owner GtkToolbar)

To avoid that StatusToolBar.GetToolBitmapSize() is used instead of wx.DefaultSize
from __future__ import absolute_import
import sys
import gluon.contrib.simplejson as simplejson


class JSONRPCServiceBase(object):

    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 Exception:
                etype, eval, _etb = sys.exc_info()
                return self.error(id, 100, 'Exception %s: %s' % (etype, eval))
            except BaseException:
                etype, eval, _etb = sys.exc_info()
                return self.error(id, 100, '%s: %s' % (etype.__name__, eval))
        else:
            return self.error(id, 100, 'method "%s" does not exist' % method)

    def listmethods(self):
        return self.methods.keys()