1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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
|