diff --git a/sugar/browser/BrowserShell.py b/sugar/browser/BrowserShell.py index d49a7cc5..c801e5ce 100644 --- a/sugar/browser/BrowserShell.py +++ b/sugar/browser/BrowserShell.py @@ -3,6 +3,7 @@ import geckoembed import pygtk pygtk.require('2.0') import gtk +import gobject import sugar.env @@ -29,11 +30,14 @@ class BrowserShell(dbus.service.Object): links.append(link) return links + def _start_browser_cb(self, browser): + browser.connect_to_shell() + @dbus.service.method('com.redhat.Sugar.BrowserShell') def open_browser(self, uri): browser = BrowserActivity(uri) self.__browsers.append(browser) - browser.connect_to_shell() + gobject.idle_add(self._start_browser_cb, browser) @dbus.service.method('com.redhat.Sugar.BrowserShell') def open_browser_with_id(self, uri, activity_id): diff --git a/sugar/presence/PresenceService.py b/sugar/presence/PresenceService.py index ec30db4f..bb6f7557 100644 --- a/sugar/presence/PresenceService.py +++ b/sugar/presence/PresenceService.py @@ -395,6 +395,25 @@ class PresenceService(gobject.GObject): def _new_domain_cb_glue(self, interface, protocol, domain, flags=0): gobject.idle_add(self._new_domain_cb, interface, protocol, domain, flags) + def track_activity(self, activity_uid): + """INTERNAL ONLY; register an activity's UID to recognize service + events for that specific activity.""" + if not activity_uid or not util.validate_activity_uid(uid): + raise ValueError("activity uid must be a valid activity uid string.") + if activity_uid in self._allowed_activities: + return + self._allowed_activities.append(activity_uid) + self._check_and_resolve_service_advs(dec_stype) + + def untrack_activity(self, activity_uid): + """INTERNAL ONLY; unregister an activity's UID to stop service + events for that specific activity.""" + if not activity_uid or not util.validate_activity_uid(uid): + raise ValueError("activity uid must be a valid activity uid string.") + if activity_uid not in self._allowed_activities: + return + self._allowed_activities.remove(activity_uid) + def track_service_type(self, short_stype): """Requests that the Presence service look for and recognize a certain mDNS service types.""" @@ -414,17 +433,24 @@ class PresenceService(gobject.GObject): if uid: raise RuntimeError("Can only track plain service types!") self._allowed_service_types.append(dec_stype) + self._check_and_resolve_service_advs(dec_stype) + def _check_and_resolve_service_advs(self, specific_stype=None): # Find unresolved services that match the service type # we're now interested in, and resolve them resolv_list = [] # Find all services first by their activity + search_types = self._allowed_service_types + if specific_stype: + search_types = [specific_stype] for uid in self._allowed_activities: - full_stype = Service.compose_service_type(dec_stype, uid) - adv_list = self._find_service_adv(stype=full_stype) - resolv_list = resolv_list + adv_list + for short_stype in search_stypes: + full_stype = Service.compose_service_type(short_stype, uid) + adv_list = self._find_service_adv(stype=full_stype) + resolv_list = resolv_list + adv_list # Then, find services by just the plain service type - resolv_list = resolv_list + self._find_service_adv(stype=dec_stype) + if specific_stype is not None: + resolv_list = resolv_list + self._find_service_adv(stype=specific_stype) # Request resolution for them for adv in resolv_list: diff --git a/sugar/shell/StartPage.py b/sugar/shell/StartPage.py index 6d548b43..18fc2b4d 100644 --- a/sugar/shell/StartPage.py +++ b/sugar/shell/StartPage.py @@ -65,9 +65,9 @@ class ActivitiesView(gtk.TreeView): print 'Activated row %s %s' % (address, activity_id) if activity_id is None: - browser_shell.open_browser(address, ignore_reply=True) + browser_shell.open_browser(address) else: - browser_shell.open_browser_with_id(address, activity_id, ignore_reply=True) + browser_shell.open_browser_with_id(address, activity_id) class StartPage(gtk.HBox): def __init__(self):