diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-07-23 09:46:37 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-07-23 09:46:37 (GMT) |
commit | c869ea9e4b0f0d2a35174e727b563bfc9160b81b (patch) | |
tree | 96a910dcdeda4f1b947bcf15abb2eab5c849a74c /plugin/__init__.py | |
parent | c0326e3f93f14425a0005d42f38017c30c8d0feb (diff) |
Switch to DBus SN interface
Diffstat (limited to 'plugin/__init__.py')
-rw-r--r-- | plugin/__init__.py | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/plugin/__init__.py b/plugin/__init__.py index 5fe5cf7..61ede76 100644 --- a/plugin/__init__.py +++ b/plugin/__init__.py @@ -13,14 +13,16 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. -import os +import json +import logging import subprocess from gettext import gettext as _ +import dbus import gobject from sugar.graphics.alert import NotifyAlert, ErrorAlert -from sugar_network import sugar, GlibClient, api_url, server_mode +from sugar_network import sugar, api_url, server_mode from active_toolkit.options import Option @@ -42,6 +44,7 @@ _ALERT_SEVERITIES = { None: (NotifyAlert, _('Sugar Network')), } +_logger = logging.getLogger('plugins.sn') _bundleregistry = None _launcher = None _client = None @@ -62,10 +65,6 @@ def init(): api_url.value = SN_MASER_URL Option.save() - if not os.fork(): - args = ['sugar-network-service', '--webui', '--delayed-start', 'start'] - os.execvp(args[0], args) - import jarabe.model.bundleregistry from .bundleregistry import BundleRegistry @@ -81,15 +80,11 @@ def init(): def enable(): - global _launcher, _client + global _launcher if not sugar_network.value: return - _client = GlibClient() - _client.connect('alert', - lambda sender, severity, message: add_alert(severity, msg=message)) - _bundleregistry.populate() from jarabe.journal import misc @@ -102,7 +97,7 @@ def enable(): shell = get_model() def delayed_start(): - _client.publish('delayed-start') + get_client().Publish({'event': 'delayed-start'}) get_browser() def activity_added_cb(model, activity): @@ -122,6 +117,11 @@ def get_registry(): def get_client(): + global _client + + if _client is None: + _client = _Client() + return _client @@ -171,3 +171,40 @@ def _get_bundle_path(self): for env in f.read().split('\0'): if env.startswith('SUGAR_BUNDLE_PATH='): return env.split('=', 1)[-1] + + +class _Client(object): + + def __init__(self): + self._event_callbacks = [] + self._client = dbus.Interface( + dbus.SessionBus().get_object( + 'org.sugarlabs.Network', + '/org/sugarlabs/Network'), + 'org.sugarlabs.Network') + self._client.connect_to_signal('Event', self.__Event_cb) + + def connect_to_signal(self, signal, callback): + if signal == 'Event': + self._event_callbacks.append(callback) + else: + return self._client.connect_to_signal(signal, callback) + + def __getattr__(self, name): + return getattr(self._client, name) + + def __Event_cb(self, event): + event = json.loads(event) + + for callback in self._event_callbacks: + try: + callback(event) + except Exception: + _logger.exception('%r callback failed on %r SN event', + callback, event) + + event_type = event.get('event') + if event.get('event') == 'alert': + add_alert(event['severity'], msg=event['message']) + elif event_type == 'sync_complete': + add_alert('info', msg=_('Synchronization completed')) |