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-25 14:57:21 (GMT)
committer Dan Williams <dcbw@localhost.localdomain>2006-09-25 14:57:21 (GMT)
commit85d70f2383b4df61d95d62f8de4ce037d0dd69c8 (patch)
treef5b2693d3d522ff36bddea7176bce52df70f83c4 /services
parentf6c043b2043371837e885bdb3233aaea33565e17 (diff)
Use the buddy icon cache
Diffstat (limited to 'services')
-rw-r--r--services/presence/Buddy.py31
-rw-r--r--services/presence/PresenceService.py7
2 files changed, 27 insertions, 11 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
diff --git a/services/presence/PresenceService.py b/services/presence/PresenceService.py
index 73c2efa..77c67ee 100644
--- a/services/presence/PresenceService.py
+++ b/services/presence/PresenceService.py
@@ -5,6 +5,7 @@ import Activity
import random
import logging
from sugar import util
+import BuddyIconCache
_SA_UNRESOLVED = 0
@@ -302,9 +303,11 @@ class PresenceService(object):
self._bus_name = dbus.service.BusName(_PRESENCE_SERVICE, bus=self._session_bus)
self._dbus_helper = PresenceServiceDBusHelper(self, self._bus_name)
+ self._icon_cache = BuddyIconCache.BuddyIconCache()
+
# Our owner object
objid = self._get_next_object_id()
- self._owner = Buddy.Owner(self, self._bus_name, objid)
+ self._owner = Buddy.Owner(self, self._bus_name, objid, self._icon_cache)
self._buddies[self._owner.get_name()] = self._owner
self._started = False
@@ -423,7 +426,7 @@ class PresenceService(object):
except KeyError:
source_addr = service.get_source_address()
objid = self._get_next_object_id()
- buddy = Buddy.Buddy(self._bus_name, objid, service)
+ buddy = Buddy.Buddy(self._bus_name, objid, service, self._icon_cache)
self._buddies[name] = buddy
self._dbus_helper.ServiceAppeared(service.object_path())
if not buddy_was_valid and buddy.is_valid():