Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sugar/activity/activity.py21
-rw-r--r--sugar/presence/activity.py7
-rw-r--r--sugar/presence/presenceservice.py34
3 files changed, 45 insertions, 17 deletions
diff --git a/sugar/activity/activity.py b/sugar/activity/activity.py
index ccc8b90..3f782b5 100644
--- a/sugar/activity/activity.py
+++ b/sugar/activity/activity.py
@@ -469,13 +469,22 @@ class Activity(Window, gtk.Container):
self._shared_activity = activity
self.emit('shared')
- def share(self):
- """Request that the activity be shared on the network."""
+ def share(self, private=False):
+ """Request that the activity be shared on the network.
+
+ private -- bool: True to share by invitation only,
+ False to advertise as shared to everyone.
+ """
+ # FIXME: Make private=True to turn on the by-invitation-only scope
if self._shared_activity and self._shared_activity.props.joined:
- raise RuntimeError("Activity %s already shared." % self._activity_id)
- logging.debug('Requesting share of activity %s.' % self._activity_id)
- self._share_id = self._pservice.connect("activity-shared", self._internal_share_cb)
- self._pservice.share_activity(self)
+ raise RuntimeError("Activity %s already shared." %
+ self._activity_id)
+ verb = private and 'private' or 'public'
+ logging.debug('Requesting %s share of activity %s.' %
+ (verb, self._activity_id))
+ self._share_id = self._pservice.connect("activity-shared",
+ self._internal_share_cb)
+ self._pservice.share_activity(self, private=private)
def _realize_cb(self, window):
wm.set_bundle_id(window.window, self.get_service_name())
diff --git a/sugar/presence/activity.py b/sugar/presence/activity.py
index 2df8793..bdfc74f 100644
--- a/sugar/presence/activity.py
+++ b/sugar/presence/activity.py
@@ -167,16 +167,17 @@ class Activity(gobject.GObject):
return bus_name, connection, channels
def _leave_cb(self):
- # XXX Is this the right thing to do?
+ """Callback for async action of leaving shared activity."""
self.emit("joined", False, "left activity")
def _leave_error_cb(self, err):
- # XXX We are closing down anyway
+ """Callback for error in async leaving of shared activity.
+
+ XXX Add logging!"""
pass
def leave(self):
"""Leave this shared activity"""
- # FIXME
self._joined = False
self._activity.Leave(reply_handler=self._leave_cb,
error_handler=self._leave_error_cb)
diff --git a/sugar/presence/presenceservice.py b/sugar/presence/presenceservice.py
index 9e39a35..a271282 100644
--- a/sugar/presence/presenceservice.py
+++ b/sugar/presence/presenceservice.py
@@ -364,7 +364,11 @@ class PresenceService(gobject.GObject):
return self._new_object(owner_op)
def _share_activity_cb(self, activity, op):
- """Notify with GObject event of successful sharing of activity"""
+ """Notify with GObject event of successful sharing of activity
+
+ op -- full dbus path of the new object, must be
+ prefixed with either of _PS_BUDDY_OP or _PS_ACTIVITY_OP
+ """
psact = self._new_object(op)
psact._joined = True
self.emit("activity-shared", True, psact, None)
@@ -374,10 +378,10 @@ class PresenceService(gobject.GObject):
_logger.debug("Error sharing activity %s: %s" % (activity.get_id(), err))
self.emit("activity-shared", False, None, err)
- def share_activity(self, activity, properties={}):
- """Ask presence service to ask the activity to share itself
+ def share_activity(self, activity, properties={}, private=True):
+ """Ask presence service to ask the activity to share itself publicly.
- Uses the ShareActivity method on the service to ask for the
+ Uses the AdvertiseActivity method on the service to ask for the
sharing of the given activity. Arranges to emit activity-shared
event with:
@@ -388,19 +392,33 @@ class PresenceService(gobject.GObject):
returns None
"""
actid = activity.get_id()
+ _logger.debug('XXXX in share_activity')
# Ensure the activity is not already shared/joined
for obj in self._objcache.values():
if not isinstance(object, Activity):
continue
if obj.props.id == actid or obj.props.joined:
- raise RuntimeError("Activity %s is already shared." % actid)
+ raise RuntimeError("Activity %s is already shared." %
+ actid)
atype = activity.get_service_name()
name = activity.props.title
- self._ps.ShareActivity(actid, atype, name, properties,
- reply_handler=lambda *args: self._share_activity_cb(activity, *args),
- error_handler=lambda *args: self._share_activity_error_cb(activity, *args))
+ if private:
+ _logger.debug('XXXX private, so calling InviteActivity')
+ self._ps.InviteActivity(actid, atype, name, properties,
+ reply_handler=lambda *args: \
+ self._share_activity_cb(activity, *args),
+ error_handler=lambda *args: \
+ self._share_activity_error_cb(activity, *args))
+ else:
+ # FIXME: Test, then make this AdvertiseActivity:
+ _logger.debug('XXXX not private, so calling ShareActivity')
+ self._ps.ShareActivity(actid, atype, name, properties,
+ reply_handler=lambda *args: \
+ self._share_activity_cb(activity, *args),
+ error_handler=lambda *args: \
+ self._share_activity_error_cb(activity, *args))
def get_preferred_connection(self):
"""Gets the preferred telepathy connection object that an activity