1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# Copyright (C) 2007, Red Hat, Inc.
# Copyright (C) 2007, Collabora Ltd.
#
# 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
from sugar import env
import os.path
import cPickle
class BuddyIconCache(object):
"""Caches icons on disk and finds them based on the account they were
seen on, and the unique-ID of the owner on that protocol.
"""
# FIXME: once we've seen a buddy, we never delete their buddy icon!
def __init__(self):
ppath = env.get_profile_path()
self._cachepath = os.path.join(ppath, "cache", "buddy-icons", "cache")
# Ensure cache directory exists
if not os.path.exists(os.path.dirname(self._cachepath)):
os.makedirs(os.path.dirname(self._cachepath))
if not os.path.exists(self._cachepath):
self._cache = {}
# account object-path, md5 and server token of the last avatar
# uploaded
self._acct = '/'
self._md5 = ''
self._token = ''
else:
self._load_cache()
def _load_cache(self):
try:
self._cache, self._acct, self._md5, self._token = \
cPickle.load(open(self._cachepath, "r"))
except:
self._cache, self._acct, self._md5, self._token = {}, '', '', ''
def _save_cache(self):
out = open(self._cachepath, "w")
cPickle.dump((self._cache, self._acct, self._md5, self._token),
out, protocol=2)
def get_icon(self, acct, uid, token):
hit = self._cache.get((acct, uid))
if hit:
t, icon = hit[0], hit[1]
if t == token:
return icon
return None
def store_icon(self, acct, uid, token, data):
self._cache[(acct, uid)] = (token, data)
self._save_cache()
def check_avatar(self, acct, md5sum, token):
return (self._acct == acct and self._md5 == md5sum and
self._token == token)
def set_avatar(self, acct, md5sum, token):
self._acct = acct
self._md5 = md5sum
self._token = token
self._save_cache()
buddy_icon_cache = BuddyIconCache()
if __name__ == "__main__":
my_cache = BuddyIconCache()
TEST_ACCT = ('/org/freedesktop/Telepathy/ConnectionManager/gabble' +
'/jabber/myself_40olpc_2ecollabora_2eco_2euk')
TEST_JID = 'test@olpc.collabora.co.uk'
# look for the icon in the cache
icon = my_cache.get_icon(TEST_ACCT, TEST_JID, "aaaa")
print icon
my_cache.store_icon(TEST_ACCT, TEST_JID, "aaaa", "icon1")
# now we're sure that the icon is in the cache
icon = my_cache.get_icon(TEST_ACCT, TEST_JID, "aaaa")
print icon
# new icon
my_cache.store_icon(TEST_ACCT, TEST_JID, "bbbb", "icon2")
# the icon in the cache is not valid now
icon = my_cache.get_icon(TEST_ACCT, TEST_JID, "aaaa")
print icon
my_avatar_md5 = "111"
my_avatar_token = "222"
if not my_cache.check_avatar(my_avatar_md5, my_avatar_token):
# upload of the new avatar
print "upload of the new avatar"
my_cache.set_avatar(my_avatar_md5, my_avatar_token)
else:
print "No need to upload the new avatar"
if my_cache.check_avatar(my_avatar_md5, my_avatar_token):
print "No need to upload the new avatar"
|