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 */