From 816de0918c28461cc2d1e3457348fd5b6e11950f Mon Sep 17 00:00:00 2001 From: Lionel LASKE Date: Tue, 18 Sep 2012 19:16:20 +0000 Subject: Initial version --- (limited to 'enyo.py') diff --git a/enyo.py b/enyo.py new file mode 100644 index 0000000..f1a342b --- /dev/null +++ b/enyo.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Sugar interface for Enyo JavaScript framework + +import logging +import json +import inspect + + +class Enyo: + """Class to handle communication with Enyo""" + + def __init__(self, webview): + """Constructor: link to the WebKit widget""" + self.webview = webview + self.handlers = {} + self.webview.connect("console-message", self._message_emitted) + + def connect(self, name, callback): + """Add a new handler for an event""" + self.handlers[name] = callback + + def send_message(self, name, args=None): + """Send a message to Enyo""" + script = "enyo.Sugar.sendMessage('"+name+"', " + if not args is None: + value = "'"+self.json_encode(args)+"'" + else: + value = "null" + script = script+value+")" + logging.warning("sugar://"+name+"/"+value) + return self.webview.execute_script(script) + + def _message_emitted(self, widget, value, line, source): + """Raised when a message from Enyo has been received""" + # Only consider prefixed message + prefix = "enyo://" + if not value.startswith(prefix): + return False + + # Get name + prefixlen = len(prefix) + size = value[prefixlen:prefixlen+value[prefixlen:].index("/")] + start = prefixlen+1+len(size) + name = value[start:start+int(size)] + + # Get param + start = start + len(name)+1 + size = value[start:start+value[start:].index("/")] + if int(size) == 0: + args = None + else: + start = start+1+len(size) + args = value[start:start+int(size)] + + # Call handler if exist + logging.warning(value); + if name in self.handlers: + callback = self.handlers[name] + if args: + callback(json.loads(args)) + else: + callback(None) + + return True + + def json_encode(self, obj): + """Encode object as a JSON string""" + try: + result = json.dumps(obj) + except TypeError: + result = "{" + first = True + for name in dir(obj): + value = getattr(obj, name) + if not name.startswith('__') and not inspect.ismethod(value) and not inspect.isroutine(value) and not inspect.isbuiltin(value) and not isinstance(value, obj.__class__): + if not first: + result = result + ', ' + else: + first = False + result = result + '"'+name+'": ' + result = result + self.json_encode(value) + result = result + "}" + return result -- cgit v0.9.1