# HG changeset patch # User Daniel Atallah # Date 1211487859 0 # Node ID 69fbad87f8ae348ff00beef8037a249d773d16d1 # Parent 49982266aa0fd0946f6810e3c84912c9e213432c Update to Yahoo Aliases from John Moody to handle new server behavior. If something is broken, it is probably my fault. Fixes #4671. diff -r 49982266aa0f -r 69fbad87f8ae libpurple/protocols/yahoo/yahoo_aliases.c --- a/libpurple/protocols/yahoo/yahoo_aliases.c Thu May 22 18:01:58 2008 +0000 +++ b/libpurple/protocols/yahoo/yahoo_aliases.c Thu May 22 20:24:19 2008 +0000 @@ -49,6 +49,7 @@ struct callback_data { PurpleConnection *gc; gchar *id; + gchar *who; }; @@ -80,6 +81,7 @@ if (contacts == NULL) { purple_debug_error("yahoo", "Badly formed Alias XML\n"); + g_free(cb->who); g_free(cb->id); g_free(cb); return; @@ -130,8 +132,6 @@ yahoo_update_alias(cb->gc, yid, buddy_alias); purple_debug_info("yahoo", "Sent updated alias '%s'\n", buddy_alias); } - } else { - purple_debug_info("yahoo", "Bizarre, received alias for %s, but they are not on your list...\n", yid); } g_free(full_name); @@ -141,6 +141,7 @@ xmlnode_free(contacts); } + g_free(cb->who); g_free(cb->id); g_free(cb); } @@ -205,8 +206,10 @@ yd->url_datas = g_slist_remove(yd->url_datas, url_data); if (len == 0 || error_message != NULL) { - purple_debug_info("yahoo", "Error updating alias: %s\n", - error_message ? error_message : ""); + purple_debug_info("yahoo", "Error updating alias for %s: %s\n", + cb->who, + error_message ? error_message : ""); + g_free(cb->who); g_free(cb->id); g_free(cb); return; @@ -214,25 +217,42 @@ result = xmlnode_from_str(url_text, -1); - purple_debug_info("yahoo", "ID: %s, Return data: %s\n", cb->id, url_text); - if (result == NULL) { - purple_debug_error("yahoo", "Alias update failed: Badly formed response\n"); + purple_debug_error("yahoo", "Alias update for %s failed: Badly formed response\n", + cb->who); + g_free(cb->who); g_free(cb->id); g_free(cb); return; } if ((node = xmlnode_get_child(result, "ct"))) { - const char *update_id = xmlnode_get_attrib(node, "id"); - if (g_ascii_strncasecmp(update_id, cb->id, strlen(cb->id)) == 0) - purple_debug_info("yahoo", "Alias update succeeded\n"); - else - purple_debug_error("yahoo", "Alias update failed (Contact record return mismatch)\n"); - } else { - purple_debug_info("yahoo", "Alias update failed (No contact record returned)\n"); - } + if (cb->id == NULL) { + const char *new_id = xmlnode_get_attrib(node, "id"); + if (new_id != NULL) { + /* We now have an addressbook id for the friend; we should save it */ + YahooFriend *f = yahoo_friend_find(cb->gc, cb->who); + + purple_debug_info("yahoo", "Alias creation for %s succeeded\n", cb->who); + if (f) + yahoo_friend_set_alias_id(f, new_id); + else + purple_debug_error("yahoo", "Missing YahooFriend. Unable to store new addressbook id.\n"); + } else + purple_debug_error("yahoo", "Missing new addressbook id in add response for %s (weird).\n", + cb->who); + } else { + if (g_ascii_strncasecmp(xmlnode_get_attrib(node, "id"), cb->id, strlen(cb->id))==0) + purple_debug_info("yahoo", "Alias update for %s succeeded\n", cb->who); + else + purple_debug_error("yahoo", "Alias update for %s failed (Contact record return mismatch)\n", + cb->who); + } + } else + purple_debug_info("yahoo", "Alias update for %s failed (No contact record returned)\n", cb->who); + + g_free(cb->who); g_free(cb->id); g_free(cb); xmlnode_free(result); @@ -242,7 +262,7 @@ yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias) { struct yahoo_data *yd; - const char *url, *alias_id; + const char *url; gchar *content, *request, *webpage, *webaddress; struct callback_data *cb; PurpleUtilFetchUrlData *url_data; @@ -260,47 +280,65 @@ if (alias == NULL) alias = ""; - purple_debug_info("yahoo", "Sending '%s' as new alias for user '%s'.\n", alias, who); - f = yahoo_friend_find(gc, who); if (f == NULL) { purple_debug_error("yahoo", "Missing YahooFriend. Unable to set server alias.\n"); return; } - alias_id = yahoo_friend_get_alias_id(f); - if (alias_id == NULL) { - purple_debug_error("yahoo", "Missing Yahoo Alias ID (get_yahoo_aliases must have failed), bailing out\n"); - return; - } - yd = gc->proto_data; /* Using callback_data so I have access to gc in the callback function */ cb = g_new0(struct callback_data, 1); - cb->id = g_strdup(alias_id); + cb->who = g_strdup(who); + cb->id = g_strdup(yahoo_friend_get_alias_id(f)); cb->gc = gc; /* Build all the info to make the web request */ url = yd->jp ? YAHOOJP_ALIAS_UPDATE_URL: YAHOO_ALIAS_UPDATE_URL; purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL); - if (yd->jp) { - gchar *alias_jp = g_convert(alias, -1, "EUC-JP", "UTF-8", NULL, NULL, NULL); - gchar *converted_alias_jp = yahoo_convert_to_numeric(alias_jp); - content = g_strdup_printf("\n" - "\n\r\n", - purple_account_get_username(gc->account), - who, alias_id, converted_alias_jp); - free(converted_alias_jp); - g_free(alias_jp); + if (cb->id == NULL) { + /* No id for this buddy, so create an address book entry */ + purple_debug_info("yahoo", "Creating '%s' as new alias for user '%s'\n", alias, who); + + if (yd->jp) { + gchar *alias_jp = g_convert(alias, -1, "EUC-JP", "UTF-8", NULL, NULL, NULL); + gchar *converted_alias_jp = yahoo_convert_to_numeric(alias_jp); + content = g_strdup_printf("\n" + "\n\r\n", + purple_account_get_username(gc->account), + who, converted_alias_jp); + free(converted_alias_jp); + g_free(alias_jp); + } else { + gchar *escaped_alias = g_markup_escape_text(alias, -1); + content = g_strdup_printf("\n" + "\n\r\n", + purple_account_get_username(gc->account), + who, escaped_alias); + g_free(escaped_alias); + } } else { - gchar *escaped_alias = g_markup_escape_text(alias, -1); - content = g_strdup_printf("\n" - "\n\r\n", - purple_account_get_username(gc->account), - who, alias_id, escaped_alias); - g_free(escaped_alias); + purple_debug_info("yahoo", "Updating '%s' as new alias for user '%s'\n", alias, who); + + if (yd->jp) { + gchar *alias_jp = g_convert(alias, -1, "EUC-JP", "UTF-8", NULL, NULL, NULL); + gchar *converted_alias_jp = yahoo_convert_to_numeric(alias_jp); + content = g_strdup_printf("\n" + "\n\r\n", + purple_account_get_username(gc->account), + who, cb->id, converted_alias_jp); + free(converted_alias_jp); + g_free(alias_jp); + } else { + gchar *escaped_alias = g_markup_escape_text(alias, -1); + content = g_strdup_printf("\n" + "\n\r\n", + purple_account_get_username(gc->account), + who, cb->id, escaped_alias); + g_free(escaped_alias); + } } request = g_strdup_printf("POST %s%s/%s HTTP/1.1\r\n"