diff libpurple/protocols/msn/notification.c @ 20477:9a2a4a0c0003

Add the possibility to create an Address Book, useful for newly registered MSN users. When changing friendly name, send the new one to the SOAP server in the PRP msn command callback, with escaped html entity chars. Fixes #1294 . Handle EBADF error sometimes received in SOAP server read callback (observed in win32). Misc cleanups.
author Carlos Silva <typ0@pidgin.im>
date Tue, 07 Aug 2007 02:37:58 +0000
parents 416ce8a7ac66
children eb93710aec4d
line wrap: on
line diff
--- a/libpurple/protocols/msn/notification.c	Mon Jul 23 18:16:58 2007 +0000
+++ b/libpurple/protocols/msn/notification.c	Tue Aug 07 02:37:58 2007 +0000
@@ -674,7 +674,19 @@
 	adl_node = xmlnode_new("ml");
 	adl_node->child = NULL;
 	xmlnode_set_attrib(adl_node, "l", "1");
-	
+
+
+	if ( session->userlist->users == NULL ) {
+		/* we have no users yet in our contact list */
+		payload = xmlnode_to_str(adl_node,&payload_len);
+
+		msn_notification_post_adl(session->notification->cmdproc,
+			payload, payload_len);
+
+		g_free(payload);
+		xmlnode_free(adl_node);
+	}
+	else {
 	/*get the userlist*/
 	for (l = session->userlist->users; l != NULL; l = l->next){
 		user = l->data;
@@ -703,11 +715,12 @@
 			}
 		}
 	}
-
+	}
 
 	display_name = purple_connection_get_display_name(session->account->gc);
-	if (display_name && strcmp(display_name,
-							   purple_account_get_username(session->account))) {
+	if (display_name 
+	    && strcmp(display_name, 
+		      purple_account_get_username(session->account))) {
 		msn_act_id(session->account->gc, display_name);
 	}
 
@@ -746,15 +759,11 @@
 static void
 adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
-	static int initial;
-
 	purple_debug_info("MSNP14","Process ADL\n");
 
-	if (!initial)
-        {
-                purple_debug_misc("MSNP14","Initial ADL received\n");
-                msn_session_finish_login(cmdproc->session);
-        }
+	msn_session_finish_login(cmdproc->session);
+
+	return;
 }
 
 static void
@@ -1136,7 +1145,11 @@
 prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
 	MsnSession *session = cmdproc->session;
-	const char *type, *value;
+	const char *type, *value, *friendlyname;
+	gchar *soapname, *soapbody;
+	MsnSoapReq *soap_request;
+
+	purple_debug_info("MSN Notification", "prp_cmd()\n");
 
 	g_return_if_fail(cmd->param_count >= 3);
 
@@ -1163,10 +1176,28 @@
 		else {
 			type = cmd->params[1];
 			if (!strcmp(type, "MFN")) {
+				friendlyname = purple_url_decode(cmd->params[2]);
+				soapname = g_markup_escape_text(friendlyname,-1);
+				soapbody = g_strdup_printf(MSN_CONTACT_UPDATE_TEMPLATE, soapname);
 
+				soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
+								    MSN_ADDRESS_BOOK_POST_URL,
+								    MSN_CONTACT_UPDATE_SOAP_ACTION,
+								    soapbody,
+								    NULL,
+								    NULL);
+
+				session->contact->soapconn->read_cb = NULL;
+
+				msn_soap_post(session->contact->soapconn,
+					      soap_request,
+					      msn_contact_connect_init);
+
+				g_free(soapbody);
+				g_free(soapname);
 				purple_connection_set_display_name(
 					purple_account_get_connection(session->account),
-					purple_url_decode(cmd->params[2]));
+					friendlyname);
 			}
 		}
 	}