Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/enyo.py
diff options
context:
space:
mode:
authorLionel LASKE <llaske@c2s.fr>2012-09-18 19:16:20 (GMT)
committer Lionel LASKE <llaske@c2s.fr>2012-09-18 19:16:20 (GMT)
commit816de0918c28461cc2d1e3457348fd5b6e11950f (patch)
tree667959b6e32d998a5bf4ae927ea59d88b71bfd44 /enyo.py
Initial version
Diffstat (limited to 'enyo.py')
-rw-r--r--enyo.py85
1 files changed, 85 insertions, 0 deletions
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