Mercurial > pidgin.yaz
comparison libpurple/protocols/bonjour/buddy.c @ 18847:2bf2bd713955
Calculate the icon hash instead of using the current phsh value - iChat seems to update the TXT record before updating the NULL record containing image data, this causes the old image to be retrieved - perhaps we should re-fetch when this happens?
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Thu, 09 Aug 2007 02:17:18 +0000 |
parents | 7bf6b9a70b41 |
children | f773aa054dca |
comparison
equal
deleted
inserted
replaced
18846:44ad08a02ead | 18847:2bf2bd713955 |
---|---|
16 | 16 |
17 #include <glib.h> | 17 #include <glib.h> |
18 #include <stdlib.h> | 18 #include <stdlib.h> |
19 | 19 |
20 #include "internal.h" | 20 #include "internal.h" |
21 #include "cipher.h" | |
21 #include "buddy.h" | 22 #include "buddy.h" |
22 #include "account.h" | 23 #include "account.h" |
23 #include "blist.h" | 24 #include "blist.h" |
24 #include "bonjour.h" | 25 #include "bonjour.h" |
25 #include "mdns_interface.h" | 26 #include "mdns_interface.h" |
104 bonjour_buddy_add_to_purple(BonjourBuddy *bonjour_buddy) | 105 bonjour_buddy_add_to_purple(BonjourBuddy *bonjour_buddy) |
105 { | 106 { |
106 PurpleBuddy *buddy; | 107 PurpleBuddy *buddy; |
107 PurpleGroup *group; | 108 PurpleGroup *group; |
108 PurpleAccount *account = bonjour_buddy->account; | 109 PurpleAccount *account = bonjour_buddy->account; |
109 const char *status_id, *first, *last, *old_hash, *new_hash; | 110 const char *status_id, *old_hash, *new_hash; |
110 gchar *alias = NULL; | |
111 | 111 |
112 /* Translate between the Bonjour status and the Purple status */ | 112 /* Translate between the Bonjour status and the Purple status */ |
113 if (g_ascii_strcasecmp("dnd", bonjour_buddy->status) == 0) | 113 if (bonjour_buddy->status != NULL && g_ascii_strcasecmp("dnd", bonjour_buddy->status) == 0) |
114 status_id = BONJOUR_STATUS_ID_AWAY; | 114 status_id = BONJOUR_STATUS_ID_AWAY; |
115 else | 115 else |
116 status_id = BONJOUR_STATUS_ID_AVAILABLE; | 116 status_id = BONJOUR_STATUS_ID_AVAILABLE; |
117 | 117 |
118 /* | 118 /* |
136 purple_blist_node_set_flags((PurpleBlistNode *)buddy, PURPLE_BLIST_NODE_FLAG_NO_SAVE); | 136 purple_blist_node_set_flags((PurpleBlistNode *)buddy, PURPLE_BLIST_NODE_FLAG_NO_SAVE); |
137 purple_blist_add_buddy(buddy, NULL, group, NULL); | 137 purple_blist_add_buddy(buddy, NULL, group, NULL); |
138 } | 138 } |
139 | 139 |
140 /* Create the alias for the buddy using the first and the last name */ | 140 /* Create the alias for the buddy using the first and the last name */ |
141 first = bonjour_buddy->first; | 141 if (bonjour_buddy->nick) |
142 last = bonjour_buddy->last; | 142 serv_got_alias(purple_account_get_connection(account), buddy->name, bonjour_buddy->nick); |
143 if ((first && *first) || (last && *last)) | 143 else { |
144 alias = g_strdup_printf("%s%s%s", | 144 gchar *alias = NULL; |
145 (first && *first ? first : ""), | 145 const char *first, *last; |
146 (first && *first && last && *last ? " " : ""), | 146 first = bonjour_buddy->first; |
147 (last && *last ? last : "")); | 147 last = bonjour_buddy->last; |
148 serv_got_alias(purple_account_get_connection(account), buddy->name, alias); | 148 if ((first && *first) || (last && *last)) |
149 g_free(alias); | 149 alias = g_strdup_printf("%s%s%s", |
150 (first && *first ? first : ""), | |
151 (first && *first && last && *last ? " " : ""), | |
152 (last && *last ? last : "")); | |
153 serv_got_alias(purple_account_get_connection(account), buddy->name, alias); | |
154 g_free(alias); | |
155 } | |
150 | 156 |
151 /* Set the user's status */ | 157 /* Set the user's status */ |
152 if (bonjour_buddy->msg != NULL) | 158 if (bonjour_buddy->msg != NULL) |
153 purple_prpl_got_user_status(account, buddy->name, status_id, | 159 purple_prpl_got_user_status(account, buddy->name, status_id, |
154 "message", bonjour_buddy->msg, NULL); | 160 "message", bonjour_buddy->msg, NULL); |
164 /* Deal with the buddy icon */ | 170 /* Deal with the buddy icon */ |
165 old_hash = purple_buddy_icons_get_checksum_for_user(buddy); | 171 old_hash = purple_buddy_icons_get_checksum_for_user(buddy); |
166 new_hash = (bonjour_buddy->phsh && *(bonjour_buddy->phsh)) ? bonjour_buddy->phsh : NULL; | 172 new_hash = (bonjour_buddy->phsh && *(bonjour_buddy->phsh)) ? bonjour_buddy->phsh : NULL; |
167 if (new_hash && (!old_hash || strcmp(old_hash, new_hash) != 0)) { | 173 if (new_hash && (!old_hash || strcmp(old_hash, new_hash) != 0)) { |
168 /* Look up the new icon data */ | 174 /* Look up the new icon data */ |
175 /* TODO: Make sure the hash assigned to the retrieved buddy icon is the same | |
176 * as what we looked up. */ | |
169 bonjour_dns_sd_retrieve_buddy_icon(bonjour_buddy); | 177 bonjour_dns_sd_retrieve_buddy_icon(bonjour_buddy); |
170 } else | 178 } else if (!new_hash) |
171 purple_buddy_icons_set_for_user(account, buddy->name, NULL, 0, NULL); | 179 purple_buddy_icons_set_for_user(account, buddy->name, NULL, 0, NULL); |
180 } | |
181 | |
182 /** | |
183 * We got the buddy icon data; deal with it | |
184 */ | |
185 void bonjour_buddy_got_buddy_icon(BonjourBuddy *buddy, gconstpointer data, gsize len) { | |
186 /* Recalculate the hash instead of using the current phsh to make sure it is accurate for the icon. */ | |
187 int i; | |
188 gchar *enc; | |
189 char *p, hash[41]; | |
190 unsigned char hashval[20]; | |
191 | |
192 if (data == NULL || len == 0) | |
193 return; | |
194 | |
195 enc = purple_base64_encode(data, len); | |
196 | |
197 purple_cipher_digest_region("sha1", data, | |
198 len, sizeof(hashval), | |
199 hashval, NULL); | |
200 | |
201 p = hash; | |
202 for(i=0; i<20; i++, p+=2) | |
203 snprintf(p, 3, "%02x", hashval[i]); | |
204 | |
205 purple_debug_info("bonjour", "Got buddy icon for %s icon hash='%s' phsh='%s'.\n", buddy->name, | |
206 hash, buddy->phsh ? buddy->phsh : "(null)"); | |
207 | |
208 purple_buddy_icons_set_for_user(buddy->account, buddy->name, | |
209 g_memdup(data, len), len, hash); | |
210 | |
211 g_free(enc); | |
172 } | 212 } |
173 | 213 |
174 /** | 214 /** |
175 * Deletes a buddy from memory. | 215 * Deletes a buddy from memory. |
176 */ | 216 */ |