diff options
Diffstat (limited to 'plugin/__init__.py')
-rw-r--r-- | plugin/__init__.py | 78 |
1 files changed, 41 insertions, 37 deletions
diff --git a/plugin/__init__.py b/plugin/__init__.py index 05e1097..5f48f95 100644 --- a/plugin/__init__.py +++ b/plugin/__init__.py @@ -14,6 +14,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. import json +import time import logging import subprocess from os.path import abspath, dirname @@ -24,7 +25,8 @@ import dbus import gobject from sugar.graphics.alert import NotifyAlert, ErrorAlert -from sugar_network import sugar, api_url, server_mode + +from sugar_network import api_url, server_mode, IPCClient from active_toolkit.options import Option from jarabe import plugins @@ -33,7 +35,8 @@ ORDER = 5 TITLE = _('Sugar Network integration') SN_BROWSER_NAME = 'sugar-network-browser' -SN_MASER_URL = 'http://api-devel.network.sugarlabs.org' +#SN_MASER_URL = 'http://api-testing.network.sugarlabs.org' +SN_MASER_URL = 'http://localhost:8800' _ALERT_SEVERITIES = { # severity: (alert_class, alert_message) @@ -88,7 +91,7 @@ def start(): shell = get_model() def delayed_start(): - get_client().Publish({'event': 'delayed-start'}) + get_client().post([], {'event': 'delayed-start'}, cmd='publish') get_browser() def activity_added_cb(model, activity): @@ -99,11 +102,6 @@ def start(): shell.connect('activity-added', activity_added_cb) -def binding(): - srcroot = dirname(abspath(__file__)) - return ['export XDG_DATA_DIRS=%s:$XDG_DATA_DIRS' % srcroot] - - def control_panel_section(): section = gtk.VBox() @@ -152,6 +150,16 @@ def get_client(): global _client if _client is None: + ts = time.time() + subprocess.check_call([ + 'sugar-network-service', 'start', + '--webui', + '--delayed-start', + '--lazy-open', + '--replace', + ]) + _logger.debug('Starting sugar-network-service took %s seconds', + time.time() - ts) _client = _Client() return _client @@ -198,38 +206,34 @@ def _get_bundle_path(self): return env.split('=', 1)[-1] -class _Client(object): +class _Client(gobject.GObject): + + __gsignals__ = { + 'event': ( + gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + [str, gobject.TYPE_PYOBJECT]), + } 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) + gobject.GObject.__init__(self) + self._client = IPCClient() + self._subscription = self._client.subscribe() + gobject.io_add_watch(self._subscription.fileno(), + gobject.IO_IN | gobject.IO_HUP, self.__subscription_cb) 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')) + def __subscription_cb(self, source, cb_condition, pipe, activity_id): + try: + event = self._subscription.pull() + if event is not None: + event_type = event['event'] + if event_type == 'alert': + add_alert(event['severity'], msg=event['message']) + elif event_type == 'sync_complete': + add_alert('info', msg=_('Synchronization completed')) + self.emit('event', event_type, event) + except Exception: + _logger.exception('Cannot dispatch %r event', event) + return True |