Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorDan Williams <dcbw@localhost.localdomain>2006-09-22 19:47:12 (GMT)
committer Dan Williams <dcbw@localhost.localdomain>2006-09-22 19:47:12 (GMT)
commitfcef47181b910e10851ae22621c10f7a393e7b29 (patch)
tree8904bc4f545c87cfca8fc6aad5a70b2f9d852477 /services
parent1ab808945742d11732584d8f3180903f7e610686 (diff)
Don't hardcode property key names; protect against spurious _presence_olpc services; watch for changes on the _presence_olpc service, like current activity updates
Diffstat (limited to 'services')
-rw-r--r--services/presence/Buddy.py49
1 files changed, 45 insertions, 4 deletions
diff --git a/services/presence/Buddy.py b/services/presence/Buddy.py
index 5d13c29..bf369f7 100644
--- a/services/presence/Buddy.py
+++ b/services/presence/Buddy.py
@@ -10,6 +10,9 @@ PRESENCE_SERVICE_TYPE = "_presence_olpc._tcp"
BUDDY_DBUS_OBJECT_PATH = "/org/laptop/Presence/Buddies/"
BUDDY_DBUS_INTERFACE = "org.laptop.Presence.Buddy"
+_BUDDY_KEY_COLOR = 'color'
+_BUDDY_KEY_CURACT = 'curact'
+
class NotFoundError(Exception):
pass
@@ -85,7 +88,10 @@ class BuddyDBusHelper(dbus.service.Object):
props['owner'] = self._parent.is_owner()
color = self._parent.get_color()
if color:
- props['color'] = self._parent.get_color()
+ props[_BUDDY_KEY_COLOR] = self._parent.get_color()
+ curact = self._parent.get_current_activity()
+ if curact:
+ props[_BUDDY_KEY_CURACT] = self._parent.get_current_activity()
return props
@@ -113,6 +119,7 @@ class Buddy(object):
self._nick_name = service.get_name()
self._address = service.get_source_address()
self._color = None
+ self._current_activity = None
self._valid = False
self._icon = None
self._icon_tries = 0
@@ -121,6 +128,7 @@ class Buddy(object):
self._object_path = BUDDY_DBUS_OBJECT_PATH + str(self._object_id)
self._dbus_helper = BuddyDBusHelper(self, bus_name, self._object_path)
+ self._buddy_presence_service = None
if service is not None:
self.add_service(service)
@@ -181,25 +189,48 @@ class Buddy(object):
service_key[1]))
return False
+ if service.get_type() == PRESENCE_SERVICE_TYPE and self._buddy_presence_service:
+ # already have a presence service for this buddy
+ logging.debug("!!! Tried to add a buddy presence service when " \
+ "one already existed.")
+ return False
+
logging.debug("Buddy %s added service type %s id %s" % (self._nick_name,
service.get_type(), service.get_activity_id()))
self._services[service_key] = service
service.set_owner(self)
if service.get_type() == PRESENCE_SERVICE_TYPE:
+ self._buddy_presence_service = service
# A buddy isn't valid until its official presence
# service has been found and resolved
self._valid = True
- print 'Requesting buddy icon %s' % self._nick_name
+ logging.debug('Requesting buddy icon %s' % self._nick_name)
self._request_buddy_icon(service)
- self._color = service.get_one_property('color')
+ self._color = service.get_one_property(_BUDDY_KEY_COLOR)
if self._color:
- self._dbus_helper.PropertyChanged(['color'])
+ self._dbus_helper.PropertyChanged([_BUDDY_KEY_COLOR])
+ # Monitor further buddy property changes, like current activity
+ # and color
+ service.connect('property-changed',
+ self.__buddy_presence_service_property_changed_cb)
if self._valid:
self._dbus_helper.ServiceAppeared(service.object_path())
return True
+ def __buddy_presence_service_property_changed_cb(self, service, keys):
+ if _BUDDY_KEY_COLOR in keys:
+ new_color = service.get_one_property(_BUDDY_KEY_COLOR)
+ if new_color and self._color != new_color:
+ self._color = new_color
+ self._dbus_helper.PropertyChanged([_BUDDY_KEY_COLOR])
+ if _BUDDY_KEY_CURACT in keys:
+ new_curact = service.get_one_property(_BUDDY_KEY_CURACT)
+ if new_curact and self._current_activity != new_curact:
+ self._current_activity = new_curact
+ self._dbus_helper.PropertyChanged([_BUDDY_KEY_CURACT])
+
def add_activity(self, activity):
actid = activity.get_id()
if activity in self._activities.values():
@@ -222,6 +253,13 @@ class Buddy(object):
return
if service.get_name() != self._nick_name:
return
+
+ if service.get_type() == PRESENCE_SERVICE_TYPE \
+ and self._buddy_presence_service \
+ and service != self._buddy_presence_service:
+ logging.debug("!!! Tried to remove a spurious buddy presence service.")
+ return
+
service_key = self._get_service_key(service)
if self._services.has_key(service_key):
if self._valid:
@@ -282,6 +320,9 @@ class Buddy(object):
def get_color(self):
return self._color
+ def get_current_activity(self):
+ return self._current_activity
+
def _set_icon(self, icon):
"""Can only set icon for other buddies. The Owner
takes care of setting it's own icon."""