diff libpurple/protocols/msn/notification.c @ 24128:f5923e2e6513

Apply khc's patch for 241 error. Tested it out myself. Cleaned up the message a little bit to be more user friendly. I'm not sure if it's a good idea to be putting up a dialog without a way for the user to fix the problem, so I'm not going to say it fixes the ticket, but you should be able to login at least. References #6702.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Wed, 17 Sep 2008 04:10:43 +0000
parents ce51405b7a7e
children 384217df4ee7
line wrap: on
line diff
--- a/libpurple/protocols/msn/notification.c	Wed Sep 17 00:30:18 2008 +0000
+++ b/libpurple/protocols/msn/notification.c	Wed Sep 17 04:10:43 2008 +0000
@@ -771,6 +771,53 @@
 }
 
 static void
+adl_241_error_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
+	size_t len)
+{
+	/* khc: some googling suggests that error 241 means the buddy is somehow
+	   in the local list, but not the server list, and that we should add
+	   those buddies to the addressbook. For now I will just notify the user
+	   about the raw payload, because I am lazy */
+	MsnSession *session;
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	xmlnode *adl;
+	xmlnode *domain;
+	GString *emails;
+
+	session = cmdproc->session;
+	account = session->account;
+	gc = purple_account_get_connection(account);
+
+	adl = xmlnode_from_str(payload, len);
+	emails = g_string_new(NULL);
+
+	domain = xmlnode_get_child(adl, "d");
+	while (domain) {
+		const char *domain_str = xmlnode_get_attrib(domain, "n");
+		xmlnode *contact = xmlnode_get_child(domain, "c");
+		while (contact) {
+			g_string_append_printf(emails, "%s@%s\n",
+				xmlnode_get_attrib(contact, "n"), domain_str);
+			contact = xmlnode_get_next_twin(contact);
+		}
+		domain = xmlnode_get_next_twin(domain);
+	}
+
+	purple_notify_error(gc, NULL,
+		_("The following users are missing from your addressbook"), emails->str);
+	g_string_free(emails, TRUE);
+	xmlnode_free(adl);
+}
+
+static void
+adl_241_error_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
+{
+	cmdproc->last_cmd->payload_cb = adl_241_error_cmd_post;
+	cmd->payload_len = atoi(cmd->params[1]);
+}
+
+static void
 fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
 			 size_t len)
 {
@@ -1958,6 +2005,8 @@
 
 	msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd);
 
+	msn_table_add_cmd(cbs_table, NULL, "241", adl_241_error_cmd);
+
 	msn_table_add_error(cbs_table, "ADD", add_error);
 	msn_table_add_error(cbs_table, "ADL", adl_error);
 	msn_table_add_error(cbs_table, "REG", reg_error);