diff libpurple/protocols/msn/contact.c @ 20484:98613886411a

Handle special cases in buddy/group management (wrt MSN_INDIVIDUALS_GROUP and MSN_NON_IM_GROUP). Deprecate now unused MSNP protocol commands.
author Carlos Silva <typ0@pidgin.im>
date Fri, 31 Aug 2007 18:12:35 +0000
parents eb93710aec4d
children ff4ae9dde291
line wrap: on
line diff
--- a/libpurple/protocols/msn/contact.c	Tue Aug 28 05:21:17 2007 +0000
+++ b/libpurple/protocols/msn/contact.c	Fri Aug 31 18:12:35 2007 +0000
@@ -31,10 +31,11 @@
 #include "group.h"
 
 
-const char *MsnAddressBookActionText[] =
+const char *MsnSoapPartnerScenarioText[] =
 {
         "Initial",
-        "ContactSave"
+        "ContactSave",
+	"MessengerPendingList"
 };
 
 
@@ -175,7 +176,7 @@
 	g_return_if_fail(session != NULL);
 
 	/*login ok!We can retrieve the contact list*/
-//	msn_get_contact_list(contact,NULL);
+//	msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
 }
 
 /*get MSN member role utility*/
@@ -223,7 +224,7 @@
 	g_return_if_fail(contact != NULL);
 
 	purple_debug_info("MSN AddressBook", "Address Book successfully created!\n");
-	msn_get_address_book(contact, MSN_AB_INITIAL, NULL, NULL);
+	msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
 
 //	msn_soap_free_read_buf(soapconn);
 	return;
@@ -332,7 +333,7 @@
 			}
 		}
 		xmlnode_free(node);
-		msn_get_contact_list(contact, NULL);
+		msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
 		return;
 	}
 
@@ -345,7 +346,7 @@
 		 * has too old a copy for us to do a delta sync</faultstring>
 		 */
 		xmlnode_free(node);
-		msn_get_contact_list(contact, NULL);
+		msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
 		return;
 	}
 	purple_debug_info("MSNCL","FindMembershipResponse @ %p: Name: '%s'\n",response,response->name);
@@ -496,9 +497,9 @@
 	/* XXX: this should be enabled when we can correctly do partial
 	   syncs with the server. Currently we need to retrieve the whole
 	   list to detect sync issues */
-	msn_get_address_book(contact, MSN_AB_INITIAL, abLastChange, dynamicItemLastChange);
+	msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange);
 #else
-	msn_get_address_book(contact, MSN_AB_INITIAL, NULL, NULL);
+	msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
 #endif
 	msn_soap_free_read_buf(soapconn);
 }
@@ -515,7 +516,7 @@
 
 /*SOAP  get contact list*/
 void
-msn_get_contact_list(MsnContact * contact, const char *update_time)
+msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time)
 {
 	MsnSoapReq *soap_request;
 	char *body = NULL;
@@ -528,7 +529,7 @@
 	} else {
 		update_str = g_strdup("");
 	}
-	body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, update_str);
+	body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str);
 	g_free(update_str);
 
 	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
@@ -836,7 +837,7 @@
 	purple_debug_misc("MSN AddressBook", "Got the Address Book!\n");
 
 	if ( msn_parse_addressbook(contact) ) {
-		msn_soap_free_read_buf(soapconn);
+		//msn_soap_free_read_buf(soapconn);
 
 		if (!session->logged_in) {
 			msn_send_privacy(session->account->gc);
@@ -869,11 +870,11 @@
 
 /*get the address book*/
 void
-msn_get_address_book(MsnContact *contact, const MsnAddressBookAction abaction, const char *LastChanged, const char *dynamicItemLastChange)
+msn_get_address_book(MsnContact *contact, const MsnSoapPartnerScenario partner_scenario, const char *LastChanged, const char *dynamicItemLastChange)
 {
 	MsnSoapReq *soap_request;
 	char *body = NULL;
-	char *ab_update_str,*update_str, *partner_scenario;
+	char *ab_update_str,*update_str;
 
 	purple_debug_misc("MSN AddressBook","Getting Address Book\n");
 
@@ -891,13 +892,9 @@
 	}
 	g_free(ab_update_str);
 	
-	partner_scenario = g_strdup(MsnAddressBookActionText[abaction]);
 
-	purple_debug_misc("MSN CL", "Get Address Book PartnerScenario parameter: %s\n", partner_scenario);
-
-	body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, partner_scenario, update_str);
+	body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str);
 	g_free(update_str);
-	g_free(partner_scenario);
 
 	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
 					MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION,
@@ -909,15 +906,13 @@
 	g_free(body);
 }
 
-/* We don't need this as libpurple doesn't support ungroupped buddies, so we
- * can add buddies directly to a group with msn_add_contact_to_group() */
-#if 0	
 static void
 msn_add_contact_read_cb(gpointer data, gint source, PurpleInputCondition cond)
 {
 	MsnSoapConn * soapconn = data;
 	MsnCallbackState *state = NULL;
 	MsnUserList *userlist;
+	MsnUser *user;
 	
 	g_return_if_fail(soapconn->data_cb != NULL);
 	g_return_if_fail(soapconn->session != NULL);
@@ -939,17 +934,11 @@
 	}
 	msn_notification_send_fqy(soapconn->session, state->who);
 	
+	user = msn_userlist_find_add_user(userlist, state->who, state->who);
+	msn_user_add_group_id(user, state->guid);
 
-	if (state->action & MSN_ADD_BUDDY_TO_GROUP) {
-		msn_add_contact_to_group(soapconn->session->contact,
-					 state,
-			       		 state->who,
-					 state->guid);
-	} else {
-		msn_callback_state_free(state);
-		msn_soap_free_read_buf(soapconn);
-	}
-	
+	msn_callback_state_free(state);
+	msn_soap_free_read_buf(soapconn);
 }
 
 static void
@@ -961,26 +950,29 @@
 	soapconn->read_cb = msn_add_contact_read_cb;
 }
 
-/* add a Contact */
+/* add a Contact in MSN_INDIVIDUALS_GROUP */
 void
-msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport, const char *displayname)
+msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport)
 {
 	MsnSoapReq *soap_request;
 	gchar *body = NULL;
 	gchar *contact_xml = NULL;
 	gchar *soap_action;
-//	gchar *escaped_displayname;
+/*	gchar *escaped_displayname;
+
 
+	 if (displayname != NULL) {
+		escaped_displayname = g_markup_decode_text(displayname, -1);
+	 } else {
+		escaped_displayname = passport;
+	 }
+	contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport);
+*/
 	purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport);
 
-	// if (displayname != NULL) {
-	//	escaped_displayname = g_markup_decode_text(displayname, -1);
-	// } else {
-	//	escaped_displayname = passport;
-	// }
-	// contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport);
-	
-	contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
+//	if ( !strcmp(state->guid, MSN_INDIVIDUALS_GROUP_ID) ) {
+		contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
+//	}
 	body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml);
 
 	g_free(contact_xml);
@@ -1000,7 +992,6 @@
 	g_free(soap_action);
 	g_free(body);
 }
-#endif
 
 static void
 msn_add_contact_to_group_read_cb(gpointer data, gint source, PurpleInputCondition cond)
@@ -1066,7 +1057,27 @@
 	g_return_if_fail(contact->session->userlist != NULL);
 	
 	userlist = contact->session->userlist;
-	
+
+	if (!strcmp(groupId, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(groupId, MSN_NON_IM_GROUP_ID)) {
+		
+		user = msn_userlist_find_add_user(userlist, passport, passport);
+
+		if (state->action & MSN_ADD_BUDDY) {
+			msn_add_contact(contact, state, passport);
+			return;
+		}
+
+		if (state->action & MSN_MOVE_BUDDY) {
+			msn_user_add_group_id(user, groupId);
+			msn_del_contact_from_group(contact, passport, state->old_group_name);
+		} else {
+			msn_callback_state_free(state);
+		}
+
+		return;
+	}
+
+
 	purple_debug_info("MSNCL", "Adding user %s to group %s\n", passport, 
 			  msn_userlist_find_group_name(userlist, groupId));
 
@@ -1209,7 +1220,12 @@
 		purple_debug_warning("MSN CL", "Unable to retrieve user from passport %s!\n", passport);
 		return;
 	}
-	
+
+	if ( !strcmp(groupId, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(groupId, MSN_NON_IM_GROUP_ID)) {
+		msn_user_remove_group_id(user, groupId);
+		return;
+	}
+
 	state = msn_callback_state_new();
 	msn_callback_state_set_who(state, passport);
 	msn_callback_state_set_guid(state, groupId);
@@ -1296,13 +1312,13 @@
 
 /*block a Contact*/
 void
-msn_block_contact(MsnContact *contact,const char* membership_id)
+msn_block_contact(MsnContact *contact, const char* membership_id)
 {
 	MsnSoapReq *soap_request;
 	char *body = NULL;
 
 	purple_debug_info("MSNP14","msn block a contact...\n");
-	body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE,membership_id);
+	body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE, membership_id);
 	/*build SOAP and POST it*/
 	soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
 					MSN_SHARE_POST_URL,
@@ -1534,6 +1550,12 @@
 		purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name);
 		return;
 	}
+
+	if ( !strcmp(guid, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(guid, MSN_NON_IM_GROUP_ID) ) {
+		// add back PurpleGroup since it isn't really removed in the server?
+		return;
+	}
+
 	state = msn_callback_state_new();
 	msn_callback_state_set_action(state, MSN_DEL_GROUP);
 	msn_callback_state_set_guid(state, guid);
@@ -1573,10 +1595,16 @@
 	guid = msn_userlist_find_group_id(session->userlist, old_group_name);
 	if (guid == NULL)
 		return;
-	
-	msn_callback_state_set_action(state, MSN_RENAME_GROUP);
+
 	msn_callback_state_set_guid(state, guid);
 	msn_callback_state_set_new_group_name(state, new_group_name);
+
+	if ( !strcmp(guid, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(guid, MSN_NON_IM_GROUP_ID) ) {
+		msn_add_group(session, state, new_group_name);
+		// XXX move every buddy there (we probably need to fix concurrent SOAP reqs first)
+	}
+
+	msn_callback_state_set_action(state, MSN_RENAME_GROUP);
 	
 	/* escape group name's html special chars so it can safely be sent
 	 * in a XML SOAP request