Use the buddy icon cache
This commit is contained in:
parent
f6c043b204
commit
85d70f2383
@ -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
|
||||
|
@ -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():
|
||||
|
Loading…
Reference in New Issue
Block a user