Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/enyo.py
blob: f1a342bbbab47d00d415e9b2ee923e2d435db315 (plain)
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