Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/services/presence/Buddy.py
diff options
context:
space:
mode:
Diffstat (limited to 'services/presence/Buddy.py')
-rw-r--r--services/presence/Buddy.py31
1 files changed, 22 insertions, 9 deletions
diff --git a/services/presence/Buddy.py b/services/presence/Buddy.py
index 618902e..6ce3151 100644
--- a/services/presence/Buddy.py
+++ b/services/presence/Buddy.py
@@ -104,7 +104,7 @@ class Buddy(object):
"""Represents another person on the network and keeps track of the
activities and resources they make available for sharing."""
- def __init__(self, bus_name, object_id, service):
+ def __init__(self, bus_name, object_id, service, icon_cache):
if not bus_name:
raise ValueError("DBus bus name must be valid")
if not object_id or type(object_id) != type(1):
@@ -137,6 +137,8 @@ class Buddy(object):
if service is not None:
self.add_service(service)
+ self._icon_cache = icon_cache
+
def object_path(self):
return dbus.ObjectPath(self._object_path)
@@ -148,8 +150,8 @@ class Buddy(object):
if result_status == network.RESULT_SUCCESS:
if icon and len(icon):
icon = base64.b64decode(icon)
- logging.debug("Buddy icon for '%s' is size %d" % (self._nick_name, len(icon)))
self._set_icon(icon)
+ self._icon_cache.add_icon(icon)
if (result_status == network.RESULT_FAILED or not icon) and self._icon_tries < 3:
self._icon_tries = self._icon_tries + 1
@@ -158,15 +160,27 @@ class Buddy(object):
gobject.timeout_add(1000, self._request_buddy_icon, service)
return False
- def _request_buddy_icon(self, service):
- """Contact the buddy to retrieve the buddy icon."""
+ def _get_buddy_icon(self, service, retry=False):
+ """Get the buddy's icon. Check the cache first, if its
+ not there get the icon from the buddy over the network."""
+ if retry != True:
+ # Only hit the cache once
+ icon_hash = service.get_one_property('icon-hash')
+ if icon_hash is not None:
+ icon = self._icon_cache.get_icon(icon_hash)
+ if icon:
+ logging.debug("%s: icon cache hit for %s." % (self._nick_name, icon_hash))
+ self._set_icon(icon)
+ return False
+
+ logging.debug("%s: icon cache miss, adding icon to cache." % self._nick_name)
from sugar.p2p import Stream
buddy_stream = Stream.Stream.new_from_service(service, start_reader=False)
writer = buddy_stream.new_writer(service)
success = writer.custom_request("get_buddy_icon", self._request_buddy_icon_cb, service)
if not success:
del writer, buddy_stream
- gobject.timeout_add(1000, self._request_buddy_icon, service)
+ gobject.timeout_add(1000, self._get_buddy_icon, service, True)
return False
def _get_service_key(self, service):
@@ -210,8 +224,7 @@ class Buddy(object):
# A buddy isn't valid until its official presence
# service has been found and resolved
self._valid = True
- logging.debug('Requesting buddy icon %s' % self._nick_name)
- self._request_buddy_icon(service)
+ self._get_buddy_icon(service)
self._color = service.get_one_property(_BUDDY_KEY_COLOR)
if self._color:
self._dbus_helper.PropertyChanged([_BUDDY_KEY_COLOR])
@@ -343,8 +356,8 @@ class Buddy(object):
class Owner(Buddy):
"""Class representing the owner of the machine. This is the client
portion of the Owner, paired with the server portion in Owner.py."""
- def __init__(self, ps, bus_name, object_id):
- Buddy.__init__(self, bus_name, object_id, None)
+ def __init__(self, ps, bus_name, object_id, icon_cache):
+ Buddy.__init__(self, bus_name, object_id, None, icon_cache)
self._nick_name = env.get_nick_name()
self._color = env.get_color()
self._ps = ps