diff --git a/services/presence2/Makefile.am b/services/presence2/Makefile.am index fa22b191..3ec8c68c 100644 --- a/services/presence2/Makefile.am +++ b/services/presence2/Makefile.am @@ -1,6 +1,8 @@ sugardir = $(pkgdatadir)/services/presence2 sugar_PYTHON = \ - __init__.py + __init__.py \ + buddyiconcache.py \ + presenceservice.py bin_SCRIPTS = sugar-presence-service2 diff --git a/services/presence2/buddyiconcache.py b/services/presence2/buddyiconcache.py new file mode 100644 index 00000000..7eb12eb8 --- /dev/null +++ b/services/presence2/buddyiconcache.py @@ -0,0 +1,77 @@ +# Copyright (C) 2007, Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +import os, time, md5 +from sugar import env +from sugar import util + +class BuddyIconCache(object): + """Caches icons on disk and finds them based on md5 hash.""" + def __init__(self): + ppath = env.get_profile_path() + self._cachepath = os.path.join(ppath, "cache", "buddy-icons") + if not os.path.exists(self._cachepath): + os.makedirs(self._cachepath) + + self._cache = {} + + # Read all cached icons and their sums + for fname in os.listdir(self._cachepath): + m = md5.new() + data = self._get_icon_data(fname) + if len(data) == 0: + continue + m.update(data) + printable_hash = util.printable_hash(m.digest()) + self._cache[printable_hash] = fname + del m + + def _get_icon_data(self, fname): + fd = open(os.path.join(self._cachepath, fname), "r") + data = fd.read() + fd.close() + del fd + return data + + def get_icon(self, printable_hash): + if not isinstance(printable_hash, unicode): + raise RuntimeError("printable_hash must be a unicode string.") + try: + fname = self._cache[printable_hash] + return self._get_icon_data(fname) + except KeyError: + pass + return None + + def add_icon(self, icon_data): + if len(icon_data) == 0: + return + + m = md5.new() + m.update(icon_data) + printable_hash = util.printable_hash(m.digest()) + if self._cache.has_key(printable_hash): + del m + return + + # Write the icon to disk and add an entry to our cache for it + m.update(time.asctime()) + fname = util.printable_hash(m.digest()) + fd = open(os.path.join(self._cachepath, fname), "w") + fd.write(icon_data) + fd.close() + self._cache[printable_hash] = fname + del m diff --git a/services/presence2/presenceservice.py b/services/presence2/presenceservice.py index 923a6d44..7a28fe1b 100644 --- a/services/presence2/presenceservice.py +++ b/services/presence2/presenceservice.py @@ -16,6 +16,7 @@ import gobject import dbus, dbus.service, dbus.glib +import buddyiconcache _PRESENCE_SERVICE = "org.laptop.Sugar.Presence" @@ -31,6 +32,11 @@ class NotFoundError(dbus.DBusException): class PresenceService(dbus.service.Object): def __init__(self): + self._buddies = {} # key -> Buddy + self._activities = {} # activity id -> Activity + + self._icon_cache = buddyiconcache.BuddyIconCache() + bus = dbus.SessionBus() self._bus_name = dbus.service.BusName(_PRESENCE_SERVICE, bus=bus) dbus.service.Object.__init__(self, self._bus_name, _PRESENCE_PATH)