pidgin: 3d595739: Update to Yahoo Aliases from John Moody ...
datallah at pidgin.im
datallah at pidgin.im
Thu May 22 16:30:40 EDT 2008
-----------------------------------------------------------------
Revision: 3d595739f53a259d5dae408a05f64d2836f02ac9
Ancestor: 7a490c356e10f7fff3432f875897aa0ca0ad1ff0
Author: datallah at pidgin.im
Date: 2008-05-22T20:24:19
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/3d595739f53a259d5dae408a05f64d2836f02ac9
Modified files:
libpurple/protocols/yahoo/yahoo_aliases.c
ChangeLog:
Update to Yahoo Aliases from John Moody to handle new server behavior. If
something is broken, it is probably my fault. Fixes #4671.
-------------- next part --------------
============================================================
--- libpurple/protocols/yahoo/yahoo_aliases.c 674ba71941c3c706cc1143b910080a0252216659
+++ libpurple/protocols/yahoo/yahoo_aliases.c 2aca36e0d75c04f83834d4eda774361e04544cb5
@@ -49,6 +49,7 @@ struct callback_data {
struct callback_data {
PurpleConnection *gc;
gchar *id;
+ gchar *who;
};
@@ -80,6 +81,7 @@ yahoo_fetch_aliases_cb(PurpleUtilFetchUr
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_fetch_aliases_cb(PurpleUtilFetchUr
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 @@ yahoo_fetch_aliases_cb(PurpleUtilFetchUr
xmlnode_free(contacts);
}
+ g_free(cb->who);
g_free(cb->id);
g_free(cb);
}
@@ -205,8 +206,10 @@ yahoo_update_alias_cb(PurpleUtilFetchUrl
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 @@ yahoo_update_alias_cb(PurpleUtilFetchUrl
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,
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 @@ yahoo_update_alias(PurpleConnection *gc,
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("<ab k=\"%s\" cc=\"1\">\n"
- "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\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("<ab k=\"%s\" cc=\"9\">\n"
+ "<ct a=\"1\" yi='%s' nn='%s' />\n</ab>\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("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"9\">\n"
+ "<ct a=\"1\" yi='%s' nn='%s' />\n</ab>\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("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"1\">\n"
- "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\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("<ab k=\"%s\" cc=\"1\">\n"
+ "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\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("<?xml version=\"1.0\" encoding=\"utf-8\"?><ab k=\"%s\" cc=\"1\">\n"
+ "<ct e=\"1\" yi='%s' id='%s' nn='%s' pr='0' />\n</ab>\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"
More information about the Commits
mailing list