Mercurial > pidgin.yaz
annotate src/buddyicon.c @ 11485:16b0da1f376f
[gaim-migrate @ 13727]
Fix the /nick weirdness bug I introduced.
Also, patch 1283539, from Peter Lawler (two changes)
1. When in a chat where Gaim can tell which users are buddies (i.e. non-Jabber chats), only the names of buddies are bolded. I'm not sure if I'll like this, but I'm committing it so we can all try it out.
2. "remove bold, underline, and italics when we're ignoring formatting, as well"
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Fri, 09 Sep 2005 20:14:32 +0000 |
parents | 202a3b3c5a88 |
children | d0662345799b |
rev | line source |
---|---|
6846 | 1 /** |
2 * @file icon.c Buddy Icon API | |
3 * @ingroup core | |
4 * | |
5 * gaim | |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
6846 | 10 * |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 */ | |
25 #include "internal.h" | |
26 #include "buddyicon.h" | |
27 #include "conversation.h" | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
28 #include "debug.h" |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
29 #include "util.h" |
6846 | 30 |
31 static GHashTable *account_cache = NULL; | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
32 static char *cache_dir = NULL; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
33 static gboolean icon_caching = TRUE; |
6846 | 34 |
9396 | 35 static GaimBuddyIcon * |
36 gaim_buddy_icon_create(GaimAccount *account, const char *username) | |
37 { | |
38 GaimBuddyIcon *icon; | |
39 GHashTable *icon_cache; | |
40 | |
41 icon = g_new0(GaimBuddyIcon, 1); | |
42 | |
43 gaim_buddy_icon_set_account(icon, account); | |
44 gaim_buddy_icon_set_username(icon, username); | |
45 | |
46 icon_cache = g_hash_table_lookup(account_cache, account); | |
47 | |
48 if (icon_cache == NULL) | |
49 { | |
50 icon_cache = g_hash_table_new(g_str_hash, g_str_equal); | |
51 | |
52 g_hash_table_insert(account_cache, account, icon_cache); | |
53 } | |
54 | |
55 g_hash_table_insert(icon_cache, | |
56 (char *)gaim_buddy_icon_get_username(icon), icon); | |
57 return icon; | |
58 } | |
59 | |
6846 | 60 GaimBuddyIcon * |
61 gaim_buddy_icon_new(GaimAccount *account, const char *username, | |
62 void *icon_data, size_t icon_len) | |
63 { | |
64 GaimBuddyIcon *icon; | |
65 | |
66 g_return_val_if_fail(account != NULL, NULL); | |
67 g_return_val_if_fail(username != NULL, NULL); | |
68 g_return_val_if_fail(icon_data != NULL, NULL); | |
69 g_return_val_if_fail(icon_len > 0, NULL); | |
70 | |
71 icon = gaim_buddy_icons_find(account, username); | |
72 | |
73 if (icon == NULL) | |
9396 | 74 icon = gaim_buddy_icon_create(account, username); |
6846 | 75 |
9327 | 76 gaim_buddy_icon_ref(icon); |
6846 | 77 gaim_buddy_icon_set_data(icon, icon_data, icon_len); |
78 | |
11423
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
79 /* gaim_buddy_icon_set_data() makes blist.c or |
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
80 * conversation.c, or both, take a reference. |
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
81 * |
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
82 * Plus, we leave one for the caller of this function. |
9323 | 83 */ |
11423
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
84 |
6846 | 85 return icon; |
86 } | |
87 | |
88 void | |
89 gaim_buddy_icon_destroy(GaimBuddyIcon *icon) | |
90 { | |
7311
1c8830db0189
[gaim-migrate @ 7895]
Christian Hammond <chipx86@chipx86.com>
parents:
7125
diff
changeset
|
91 GaimConversation *conv; |
1c8830db0189
[gaim-migrate @ 7895]
Christian Hammond <chipx86@chipx86.com>
parents:
7125
diff
changeset
|
92 GaimAccount *account; |
6846 | 93 GHashTable *icon_cache; |
7311
1c8830db0189
[gaim-migrate @ 7895]
Christian Hammond <chipx86@chipx86.com>
parents:
7125
diff
changeset
|
94 const char *username; |
9305
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
95 GSList *sl, *list; |
6846 | 96 |
97 g_return_if_fail(icon != NULL); | |
98 | |
99 if (icon->ref_count > 0) | |
100 { | |
9323 | 101 /* If the ref count is greater than 0, then we weren't called from |
102 * gaim_buddy_icon_unref(). So we go through and ask everyone to | |
103 * unref us. Then we return, since we know somewhere along the | |
104 * line we got called recursively by one of the unrefs, and the | |
105 * icon is already destroyed. | |
106 */ | |
107 account = gaim_buddy_icon_get_account(icon); | |
108 username = gaim_buddy_icon_get_username(icon); | |
109 | |
11338 | 110 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, username, account); |
10246 | 111 if (conv != NULL) |
9323 | 112 gaim_conv_im_set_icon(GAIM_CONV_IM(conv), NULL); |
113 | |
114 for (list = sl = gaim_find_buddies(account, username); sl != NULL; | |
115 sl = sl->next) | |
116 { | |
117 GaimBuddy *buddy = (GaimBuddy *)sl->data; | |
118 | |
119 gaim_buddy_set_icon(buddy, NULL); | |
120 } | |
121 | |
122 g_slist_free(list); | |
6846 | 123 |
124 return; | |
125 } | |
126 | |
127 icon_cache = g_hash_table_lookup(account_cache, | |
128 gaim_buddy_icon_get_account(icon)); | |
129 | |
130 if (icon_cache != NULL) | |
131 g_hash_table_remove(icon_cache, gaim_buddy_icon_get_username(icon)); | |
132 | |
133 if (icon->username != NULL) | |
134 g_free(icon->username); | |
135 | |
136 if (icon->data != NULL) | |
137 g_free(icon->data); | |
138 | |
139 g_free(icon); | |
140 } | |
141 | |
142 GaimBuddyIcon * | |
143 gaim_buddy_icon_ref(GaimBuddyIcon *icon) | |
144 { | |
145 g_return_val_if_fail(icon != NULL, NULL); | |
146 | |
147 icon->ref_count++; | |
148 | |
149 return icon; | |
150 } | |
151 | |
152 GaimBuddyIcon * | |
153 gaim_buddy_icon_unref(GaimBuddyIcon *icon) | |
154 { | |
155 g_return_val_if_fail(icon != NULL, NULL); | |
156 | |
157 if (icon->ref_count <= 0) | |
158 return NULL; | |
159 | |
160 icon->ref_count--; | |
161 | |
162 if (icon->ref_count == 0) | |
163 { | |
164 gaim_buddy_icon_destroy(icon); | |
165 | |
166 return NULL; | |
167 } | |
168 | |
169 return icon; | |
170 } | |
171 | |
172 void | |
173 gaim_buddy_icon_update(GaimBuddyIcon *icon) | |
174 { | |
175 GaimConversation *conv; | |
176 GaimAccount *account; | |
177 const char *username; | |
8550 | 178 GSList *sl, *list; |
6846 | 179 |
180 g_return_if_fail(icon != NULL); | |
181 | |
182 account = gaim_buddy_icon_get_account(icon); | |
183 username = gaim_buddy_icon_get_username(icon); | |
184 | |
9305
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
185 for (list = sl = gaim_find_buddies(account, username); sl != NULL; |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
186 sl = sl->next) |
6846 | 187 { |
188 GaimBuddy *buddy = (GaimBuddy *)sl->data; | |
189 | |
190 gaim_buddy_set_icon(buddy, icon); | |
191 } | |
192 | |
8550 | 193 g_slist_free(list); |
194 | |
11338 | 195 conv = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, username, account); |
6846 | 196 |
10246 | 197 if (conv != NULL) |
7118
bf630f7dfdcd
[gaim-migrate @ 7685]
Christian Hammond <chipx86@chipx86.com>
parents:
6886
diff
changeset
|
198 gaim_conv_im_set_icon(GAIM_CONV_IM(conv), icon); |
6846 | 199 } |
200 | |
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
201 static void |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
202 delete_icon_cache_file(const char *dirname, const char *old_icon) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
203 { |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
204 struct stat st; |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
205 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
206 g_return_if_fail(dirname != NULL); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
207 g_return_if_fail(old_icon != NULL); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
208 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
209 if (g_stat(old_icon, &st) == 0) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
210 g_unlink(old_icon); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
211 else |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
212 { |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
213 char *filename = g_build_filename(dirname, old_icon, NULL); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
214 if (g_stat(filename, &st) == 0) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
215 g_unlink(filename); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
216 g_free(filename); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
217 } |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
218 } |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
219 |
6846 | 220 void |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
221 gaim_buddy_icon_cache(GaimBuddyIcon *icon, GaimBuddy *buddy) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
222 { |
11137 | 223 const guchar *data; |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
224 const char *dirname; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
225 char *random; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
226 char *filename; |
7125 | 227 const char *old_icon; |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
228 size_t len; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
229 FILE *file = NULL; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
230 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
231 g_return_if_fail(icon != NULL); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
232 g_return_if_fail(buddy != NULL); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
233 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
234 if (!gaim_buddy_icons_is_caching()) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
235 return; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
236 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
237 data = gaim_buddy_icon_get_data(icon, &len); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
238 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
239 random = g_strdup_printf("%x", g_random_int()); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
240 dirname = gaim_buddy_icons_get_cache_dir(); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
241 filename = g_build_filename(dirname, random, NULL); |
7721 | 242 old_icon = gaim_blist_node_get_string((GaimBlistNode*)buddy, "buddy_icon"); |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
243 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
244 if (!g_file_test(dirname, G_FILE_TEST_IS_DIR)) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
245 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
246 gaim_debug_info("buddy icons", "Creating icon cache directory.\n"); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
247 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10523
diff
changeset
|
248 if (g_mkdir(dirname, S_IRUSR | S_IWUSR | S_IXUSR) < 0) |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
249 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
250 gaim_debug_error("buddy icons", |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
251 "Unable to create directory %s: %s\n", |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
252 dirname, strerror(errno)); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
253 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
254 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
255 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10523
diff
changeset
|
256 if ((file = g_fopen(filename, "wb")) != NULL) |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
257 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
258 fwrite(data, 1, len, file); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
259 fclose(file); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
260 } |
11021 | 261 else |
262 { | |
263 gaim_debug_error("buddy icons", "Unable to create file %s: %s\n", | |
264 filename, strerror(errno)); | |
265 } | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
266 |
10934 | 267 gaim_signal_emit(gaim_buddy_icons_get_handle(), "buddy-icon-cached", |
268 icon, buddy, filename, old_icon); | |
269 | |
9747 | 270 g_free(filename); |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
271 |
9747 | 272 if (old_icon != NULL) |
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
273 delete_icon_cache_file(dirname, old_icon); |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
274 |
9747 | 275 gaim_blist_node_set_string((GaimBlistNode *)buddy, "buddy_icon", random); |
276 | |
277 g_free(random); | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
278 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
279 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
280 void |
11040
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
281 gaim_buddy_icon_uncache(GaimBuddy *buddy) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
282 { |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
283 const char *old_icon; |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
284 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
285 g_return_if_fail(buddy != NULL); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
286 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
287 old_icon = gaim_blist_node_get_string((GaimBlistNode *)buddy, "buddy_icon"); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
288 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
289 if (old_icon != NULL) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
290 delete_icon_cache_file(gaim_buddy_icons_get_cache_dir(), old_icon); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
291 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
292 gaim_blist_node_remove_setting((GaimBlistNode *)buddy, "buddy_icon"); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
293 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
294 /* Unset the icon in case this function is called from |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
295 * something other than gaim_buddy_set_icon(). */ |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
296 if (buddy->icon != NULL) |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
297 { |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
298 gaim_buddy_icon_unref(buddy->icon); |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
299 buddy->icon = NULL; |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
300 } |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
301 } |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
302 |
3428ad6f5049
[gaim-migrate @ 12940]
Richard Laager <rlaager@wiktel.com>
parents:
11033
diff
changeset
|
303 void |
6846 | 304 gaim_buddy_icon_set_account(GaimBuddyIcon *icon, GaimAccount *account) |
305 { | |
306 g_return_if_fail(icon != NULL); | |
307 g_return_if_fail(account != NULL); | |
308 | |
309 icon->account = account; | |
310 } | |
311 | |
312 void | |
313 gaim_buddy_icon_set_username(GaimBuddyIcon *icon, const char *username) | |
314 { | |
315 g_return_if_fail(icon != NULL); | |
316 g_return_if_fail(username != NULL); | |
317 | |
318 if (icon->username != NULL) | |
319 g_free(icon->username); | |
320 | |
321 icon->username = g_strdup(username); | |
322 } | |
323 | |
324 void | |
325 gaim_buddy_icon_set_data(GaimBuddyIcon *icon, void *data, size_t len) | |
326 { | |
327 g_return_if_fail(icon != NULL); | |
328 | |
329 if (icon->data != NULL) | |
330 g_free(icon->data); | |
331 | |
332 if (data != NULL && len > 0) | |
333 { | |
334 icon->data = g_memdup(data, len); | |
335 icon->len = len; | |
336 } | |
337 else | |
338 { | |
339 icon->data = NULL; | |
340 icon->len = 0; | |
341 } | |
342 | |
343 gaim_buddy_icon_update(icon); | |
344 } | |
345 | |
346 GaimAccount * | |
347 gaim_buddy_icon_get_account(const GaimBuddyIcon *icon) | |
348 { | |
349 g_return_val_if_fail(icon != NULL, NULL); | |
350 | |
351 return icon->account; | |
352 } | |
353 | |
354 const char * | |
355 gaim_buddy_icon_get_username(const GaimBuddyIcon *icon) | |
356 { | |
357 g_return_val_if_fail(icon != NULL, NULL); | |
358 | |
359 return icon->username; | |
360 } | |
361 | |
11137 | 362 const guchar * |
6846 | 363 gaim_buddy_icon_get_data(const GaimBuddyIcon *icon, size_t *len) |
364 { | |
365 g_return_val_if_fail(icon != NULL, NULL); | |
366 | |
367 if (len != NULL) | |
368 *len = icon->len; | |
369 | |
370 return icon->data; | |
371 } | |
372 | |
10953 | 373 const char * |
374 gaim_buddy_icon_get_type(const GaimBuddyIcon *icon) | |
375 { | |
376 const void *data; | |
377 size_t len; | |
378 | |
379 g_return_val_if_fail(icon != NULL, NULL); | |
380 | |
381 data = gaim_buddy_icon_get_data(icon, &len); | |
382 | |
383 /* TODO: Find a way to do this with GDK */ | |
384 if (len >= 4) | |
385 { | |
386 if (!strncmp(data, "BM", 2)) | |
387 return "bmp"; | |
388 else if (!strncmp(data, "GIF8", 4)) | |
389 return "gif"; | |
390 else if (!strncmp(data, "\xff\xd8\xff\xe0", 4)) | |
391 return "jpg"; | |
392 else if (!strncmp(data, "\x89PNG", 4)) | |
393 return "png"; | |
394 } | |
395 | |
396 return NULL; | |
397 } | |
398 | |
6846 | 399 void |
400 gaim_buddy_icons_set_for_user(GaimAccount *account, const char *username, | |
401 void *icon_data, size_t icon_len) | |
402 { | |
403 g_return_if_fail(account != NULL); | |
404 g_return_if_fail(username != NULL); | |
405 | |
9305
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
406 if (icon_data == NULL || icon_len == 0) |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
407 { |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
408 GaimBuddyIcon *buddy_icon; |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
409 |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
410 buddy_icon = gaim_buddy_icons_find(account, username); |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
411 |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
412 if (buddy_icon != NULL) |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
413 gaim_buddy_icon_destroy(buddy_icon); |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
414 } |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
415 else |
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
416 { |
11423
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
417 GaimBuddyIcon *icon = gaim_buddy_icon_new(account, username, icon_data, icon_len); |
202a3b3c5a88
[gaim-migrate @ 13660]
Richard Laager <rlaager@wiktel.com>
parents:
11338
diff
changeset
|
418 gaim_buddy_icon_unref(icon); |
9305
0c201a2386c7
[gaim-migrate @ 10113]
Christian Hammond <chipx86@chipx86.com>
parents:
9285
diff
changeset
|
419 } |
6846 | 420 } |
421 | |
422 GaimBuddyIcon * | |
9396 | 423 gaim_buddy_icons_find(GaimAccount *account, const char *username) |
6846 | 424 { |
425 GHashTable *icon_cache; | |
9396 | 426 GaimBuddyIcon *ret = NULL; |
9747 | 427 char *filename = NULL; |
6846 | 428 |
429 g_return_val_if_fail(account != NULL, NULL); | |
430 g_return_val_if_fail(username != NULL, NULL); | |
431 | |
432 icon_cache = g_hash_table_lookup(account_cache, account); | |
433 | |
9396 | 434 if ((icon_cache == NULL) || ((ret = g_hash_table_lookup(icon_cache, username)) == NULL)) { |
435 const char *file; | |
436 struct stat st; | |
437 GaimBuddy *b = gaim_find_buddy(account, username); | |
438 | |
439 if (!b) | |
440 return NULL; | |
441 | |
442 if ((file = gaim_blist_node_get_string((GaimBlistNode*)b, "buddy_icon")) == NULL) | |
443 return NULL; | |
6846 | 444 |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10523
diff
changeset
|
445 if (!g_stat(file, &st)) |
9747 | 446 filename = g_strdup(file); |
447 else | |
448 filename = g_build_filename(gaim_buddy_icons_get_cache_dir(), file, NULL); | |
449 | |
10589
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10523
diff
changeset
|
450 if (!g_stat(filename, &st)) { |
0f7452b1f777
[gaim-migrate @ 11994]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10523
diff
changeset
|
451 FILE *f = g_fopen(filename, "rb"); |
9396 | 452 if (f) { |
453 char *data = g_malloc(st.st_size); | |
454 fread(data, 1, st.st_size, f); | |
455 fclose(f); | |
456 ret = gaim_buddy_icon_create(account, username); | |
457 gaim_buddy_icon_ref(ret); | |
458 gaim_buddy_icon_set_data(ret, data, st.st_size); | |
459 gaim_buddy_icon_unref(ret); | |
460 g_free(data); | |
9747 | 461 g_free(filename); |
9396 | 462 return ret; |
463 } | |
464 } | |
9747 | 465 g_free(filename); |
9396 | 466 } |
467 | |
468 return ret; | |
6846 | 469 } |
470 | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
471 void |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
472 gaim_buddy_icons_set_caching(gboolean caching) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
473 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
474 icon_caching = caching; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
475 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
476 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
477 gboolean |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
478 gaim_buddy_icons_is_caching(void) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
479 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
480 return icon_caching; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
481 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
482 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
483 void |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
484 gaim_buddy_icons_set_cache_dir(const char *dir) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
485 { |
10811
dc59482c8d37
[gaim-migrate @ 12464]
Luke Schierer <lschiere@pidgin.im>
parents:
10589
diff
changeset
|
486 g_return_if_fail(dir != NULL); |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
487 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
488 if (cache_dir != NULL) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
489 g_free(cache_dir); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
490 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
491 cache_dir = g_strdup(dir); |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
492 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
493 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
494 const char * |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
495 gaim_buddy_icons_get_cache_dir(void) |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
496 { |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
497 return cache_dir; |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
498 } |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
499 |
11303
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
500 char *gaim_buddy_icons_get_full_path(const char *icon) { |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
501 struct stat st; |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
502 |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
503 if (icon == NULL) |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
504 return NULL; |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
505 |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
506 if (g_stat(icon, &st) == 0) |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
507 return g_strdup(icon); |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
508 else |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
509 return g_build_filename(gaim_buddy_icons_get_cache_dir(), icon, NULL); |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
510 } |
10066662176a
[gaim-migrate @ 13503]
Richard Laager <rlaager@wiktel.com>
parents:
11256
diff
changeset
|
511 |
6846 | 512 void * |
513 gaim_buddy_icons_get_handle() | |
514 { | |
515 static int handle; | |
516 | |
517 return &handle; | |
518 } | |
519 | |
520 void | |
521 gaim_buddy_icons_init() | |
522 { | |
523 account_cache = g_hash_table_new_full( | |
524 g_direct_hash, g_direct_equal, | |
525 NULL, (GFreeFunc)g_hash_table_destroy); | |
6886
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
526 |
b5fb1d5282e5
[gaim-migrate @ 7432]
Christian Hammond <chipx86@chipx86.com>
parents:
6846
diff
changeset
|
527 cache_dir = g_build_filename(gaim_user_dir(), "icons", NULL); |
10934 | 528 |
529 gaim_signal_register(gaim_buddy_icons_get_handle(), "buddy-icon-cached", | |
530 gaim_marshal_VOID__POINTER_POINTER_POINTER_POINTER, NULL, 4, | |
531 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
532 GAIM_SUBTYPE_BUDDY_ICON), | |
533 gaim_value_new(GAIM_TYPE_SUBTYPE, | |
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
11021
diff
changeset
|
534 GAIM_SUBTYPE_BLIST_BUDDY), |
10934 | 535 gaim_value_new(GAIM_TYPE_STRING), |
536 gaim_value_new(GAIM_TYPE_STRING)); | |
6846 | 537 } |
538 | |
539 void | |
540 gaim_buddy_icons_uninit() | |
541 { | |
542 g_hash_table_destroy(account_cache); | |
543 } | |
10483 | 544 |
545 void gaim_buddy_icon_get_scale_size(GaimBuddyIconSpec *spec, int *width, int *height) | |
546 { | |
547 if(spec && spec->scale_rules & GAIM_ICON_SCALE_DISPLAY) { | |
10523 | 548 int new_width, new_height; |
549 | |
550 new_width = *width; | |
551 new_height = *height; | |
552 | |
10483 | 553 if(*width < spec->min_width) |
10523 | 554 new_width = spec->min_width; |
10483 | 555 else if(*width > spec->max_width) |
10523 | 556 new_width = spec->max_width; |
10483 | 557 |
558 if(*height < spec->min_height) | |
10523 | 559 new_height = spec->min_height; |
10483 | 560 else if(*height > spec->max_height) |
10523 | 561 new_height = spec->max_height; |
562 | |
563 /* preserve aspect ratio */ | |
564 if ((double)*height * (double)new_width > | |
565 (double)*width * (double)new_height) { | |
566 new_width = 0.5 + (double)*width * (double)new_height / (double)*height; | |
567 } else { | |
568 new_height = 0.5 + (double)*height * (double)new_width / (double)*width; | |
569 } | |
570 | |
571 *width = new_width; | |
572 *height = new_height; | |
10483 | 573 } |
574 } | |
575 |