comparison 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
comparison
equal deleted inserted replaced
20483:115290ce3b92 20484:98613886411a
29 #include "contact.h" 29 #include "contact.h"
30 #include "xmlnode.h" 30 #include "xmlnode.h"
31 #include "group.h" 31 #include "group.h"
32 32
33 33
34 const char *MsnAddressBookActionText[] = 34 const char *MsnSoapPartnerScenarioText[] =
35 { 35 {
36 "Initial", 36 "Initial",
37 "ContactSave" 37 "ContactSave",
38 "MessengerPendingList"
38 }; 39 };
39 40
40 41
41 /* new a contact */ 42 /* new a contact */
42 MsnContact * 43 MsnContact *
173 174
174 session = contact->session; 175 session = contact->session;
175 g_return_if_fail(session != NULL); 176 g_return_if_fail(session != NULL);
176 177
177 /*login ok!We can retrieve the contact list*/ 178 /*login ok!We can retrieve the contact list*/
178 // msn_get_contact_list(contact,NULL); 179 // msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
179 } 180 }
180 181
181 /*get MSN member role utility*/ 182 /*get MSN member role utility*/
182 static int 183 static int
183 msn_get_memberrole(char * role) 184 msn_get_memberrole(char * role)
221 222
222 contact = soapconn->parent; 223 contact = soapconn->parent;
223 g_return_if_fail(contact != NULL); 224 g_return_if_fail(contact != NULL);
224 225
225 purple_debug_info("MSN AddressBook", "Address Book successfully created!\n"); 226 purple_debug_info("MSN AddressBook", "Address Book successfully created!\n");
226 msn_get_address_book(contact, MSN_AB_INITIAL, NULL, NULL); 227 msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
227 228
228 // msn_soap_free_read_buf(soapconn); 229 // msn_soap_free_read_buf(soapconn);
229 return; 230 return;
230 } 231 }
231 232
330 g_free(errorcodestring); 331 g_free(errorcodestring);
331 } 332 }
332 } 333 }
333 } 334 }
334 xmlnode_free(node); 335 xmlnode_free(node);
335 msn_get_contact_list(contact, NULL); 336 msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
336 return; 337 return;
337 } 338 }
338 339
339 response = xmlnode_get_child(body,"FindMembershipResponse"); 340 response = xmlnode_get_child(body,"FindMembershipResponse");
340 341
343 * 344 *
344 * <faultstring>Need to do full sync. Can't sync deltas Client 345 * <faultstring>Need to do full sync. Can't sync deltas Client
345 * has too old a copy for us to do a delta sync</faultstring> 346 * has too old a copy for us to do a delta sync</faultstring>
346 */ 347 */
347 xmlnode_free(node); 348 xmlnode_free(node);
348 msn_get_contact_list(contact, NULL); 349 msn_get_contact_list(contact, MSN_PS_INITIAL, NULL);
349 return; 350 return;
350 } 351 }
351 purple_debug_info("MSNCL","FindMembershipResponse @ %p: Name: '%s'\n",response,response->name); 352 purple_debug_info("MSNCL","FindMembershipResponse @ %p: Name: '%s'\n",response,response->name);
352 353
353 result = xmlnode_get_child(response,"FindMembershipResult"); 354 result = xmlnode_get_child(response,"FindMembershipResult");
494 495
495 #ifdef MSN_PARTIAL_LISTS 496 #ifdef MSN_PARTIAL_LISTS
496 /* XXX: this should be enabled when we can correctly do partial 497 /* XXX: this should be enabled when we can correctly do partial
497 syncs with the server. Currently we need to retrieve the whole 498 syncs with the server. Currently we need to retrieve the whole
498 list to detect sync issues */ 499 list to detect sync issues */
499 msn_get_address_book(contact, MSN_AB_INITIAL, abLastChange, dynamicItemLastChange); 500 msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange);
500 #else 501 #else
501 msn_get_address_book(contact, MSN_AB_INITIAL, NULL, NULL); 502 msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL);
502 #endif 503 #endif
503 msn_soap_free_read_buf(soapconn); 504 msn_soap_free_read_buf(soapconn);
504 } 505 }
505 506
506 static void 507 static void
513 // msn_soap_read_cb(data,source,cond); 514 // msn_soap_read_cb(data,source,cond);
514 } 515 }
515 516
516 /*SOAP get contact list*/ 517 /*SOAP get contact list*/
517 void 518 void
518 msn_get_contact_list(MsnContact * contact, const char *update_time) 519 msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time)
519 { 520 {
520 MsnSoapReq *soap_request; 521 MsnSoapReq *soap_request;
521 char *body = NULL; 522 char *body = NULL;
522 char * update_str; 523 char * update_str;
523 524
526 purple_debug_info("MSNCL","Last update time: %s\n",update_time); 527 purple_debug_info("MSNCL","Last update time: %s\n",update_time);
527 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); 528 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time);
528 } else { 529 } else {
529 update_str = g_strdup(""); 530 update_str = g_strdup("");
530 } 531 }
531 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, update_str); 532 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str);
532 g_free(update_str); 533 g_free(update_str);
533 534
534 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, 535 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
535 MSN_GET_CONTACT_POST_URL,MSN_GET_CONTACT_SOAP_ACTION, 536 MSN_GET_CONTACT_POST_URL,MSN_GET_CONTACT_SOAP_ACTION,
536 body, 537 body,
834 g_return_if_fail(session != NULL); 835 g_return_if_fail(session != NULL);
835 836
836 purple_debug_misc("MSN AddressBook", "Got the Address Book!\n"); 837 purple_debug_misc("MSN AddressBook", "Got the Address Book!\n");
837 838
838 if ( msn_parse_addressbook(contact) ) { 839 if ( msn_parse_addressbook(contact) ) {
839 msn_soap_free_read_buf(soapconn); 840 //msn_soap_free_read_buf(soapconn);
840 841
841 if (!session->logged_in) { 842 if (!session->logged_in) {
842 msn_send_privacy(session->account->gc); 843 msn_send_privacy(session->account->gc);
843 msn_notification_dump_contact(session); 844 msn_notification_dump_contact(session);
844 } 845 }
867 soapconn->read_cb = msn_get_address_cb; 868 soapconn->read_cb = msn_get_address_cb;
868 } 869 }
869 870
870 /*get the address book*/ 871 /*get the address book*/
871 void 872 void
872 msn_get_address_book(MsnContact *contact, const MsnAddressBookAction abaction, const char *LastChanged, const char *dynamicItemLastChange) 873 msn_get_address_book(MsnContact *contact, const MsnSoapPartnerScenario partner_scenario, const char *LastChanged, const char *dynamicItemLastChange)
873 { 874 {
874 MsnSoapReq *soap_request; 875 MsnSoapReq *soap_request;
875 char *body = NULL; 876 char *body = NULL;
876 char *ab_update_str,*update_str, *partner_scenario; 877 char *ab_update_str,*update_str;
877 878
878 purple_debug_misc("MSN AddressBook","Getting Address Book\n"); 879 purple_debug_misc("MSN AddressBook","Getting Address Book\n");
879 880
880 /*build SOAP and POST it*/ 881 /*build SOAP and POST it*/
881 if ( LastChanged != NULL ) { 882 if ( LastChanged != NULL ) {
889 } else { 890 } else {
890 update_str = g_strdup(ab_update_str); 891 update_str = g_strdup(ab_update_str);
891 } 892 }
892 g_free(ab_update_str); 893 g_free(ab_update_str);
893 894
894 partner_scenario = g_strdup(MsnAddressBookActionText[abaction]); 895
895 896 body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str);
896 purple_debug_misc("MSN CL", "Get Address Book PartnerScenario parameter: %s\n", partner_scenario);
897
898 body = g_strdup_printf(MSN_GET_ADDRESS_TEMPLATE, partner_scenario, update_str);
899 g_free(update_str); 897 g_free(update_str);
900 g_free(partner_scenario);
901 898
902 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, 899 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
903 MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION, 900 MSN_ADDRESS_BOOK_POST_URL,MSN_GET_ADDRESS_SOAP_ACTION,
904 body, 901 body,
905 NULL, 902 NULL,
907 msn_address_written_cb); 904 msn_address_written_cb);
908 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); 905 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
909 g_free(body); 906 g_free(body);
910 } 907 }
911 908
912 /* We don't need this as libpurple doesn't support ungroupped buddies, so we
913 * can add buddies directly to a group with msn_add_contact_to_group() */
914 #if 0
915 static void 909 static void
916 msn_add_contact_read_cb(gpointer data, gint source, PurpleInputCondition cond) 910 msn_add_contact_read_cb(gpointer data, gint source, PurpleInputCondition cond)
917 { 911 {
918 MsnSoapConn * soapconn = data; 912 MsnSoapConn * soapconn = data;
919 MsnCallbackState *state = NULL; 913 MsnCallbackState *state = NULL;
920 MsnUserList *userlist; 914 MsnUserList *userlist;
915 MsnUser *user;
921 916
922 g_return_if_fail(soapconn->data_cb != NULL); 917 g_return_if_fail(soapconn->data_cb != NULL);
923 g_return_if_fail(soapconn->session != NULL); 918 g_return_if_fail(soapconn->session != NULL);
924 g_return_if_fail(soapconn->session->userlist != NULL); 919 g_return_if_fail(soapconn->session->userlist != NULL);
925 920
937 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); 932 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL);
938 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); 933 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL);
939 } 934 }
940 msn_notification_send_fqy(soapconn->session, state->who); 935 msn_notification_send_fqy(soapconn->session, state->who);
941 936
942 937 user = msn_userlist_find_add_user(userlist, state->who, state->who);
943 if (state->action & MSN_ADD_BUDDY_TO_GROUP) { 938 msn_user_add_group_id(user, state->guid);
944 msn_add_contact_to_group(soapconn->session->contact, 939
945 state, 940 msn_callback_state_free(state);
946 state->who, 941 msn_soap_free_read_buf(soapconn);
947 state->guid);
948 } else {
949 msn_callback_state_free(state);
950 msn_soap_free_read_buf(soapconn);
951 }
952
953 } 942 }
954 943
955 static void 944 static void
956 msn_add_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) 945 msn_add_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond)
957 { 946 {
959 948
960 purple_debug_info("MSNCL","Add contact request written\n"); 949 purple_debug_info("MSNCL","Add contact request written\n");
961 soapconn->read_cb = msn_add_contact_read_cb; 950 soapconn->read_cb = msn_add_contact_read_cb;
962 } 951 }
963 952
964 /* add a Contact */ 953 /* add a Contact in MSN_INDIVIDUALS_GROUP */
965 void 954 void
966 msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport, const char *displayname) 955 msn_add_contact(MsnContact *contact, MsnCallbackState *state, const char *passport)
967 { 956 {
968 MsnSoapReq *soap_request; 957 MsnSoapReq *soap_request;
969 gchar *body = NULL; 958 gchar *body = NULL;
970 gchar *contact_xml = NULL; 959 gchar *contact_xml = NULL;
971 gchar *soap_action; 960 gchar *soap_action;
972 // gchar *escaped_displayname; 961 /* gchar *escaped_displayname;
973 962
963
964 if (displayname != NULL) {
965 escaped_displayname = g_markup_decode_text(displayname, -1);
966 } else {
967 escaped_displayname = passport;
968 }
969 contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport);
970 */
974 purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport); 971 purple_debug_info("MSNCL","Adding contact %s to contact list\n", passport);
975 972
976 // if (displayname != NULL) { 973 // if ( !strcmp(state->guid, MSN_INDIVIDUALS_GROUP_ID) ) {
977 // escaped_displayname = g_markup_decode_text(displayname, -1); 974 contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
978 // } else { 975 // }
979 // escaped_displayname = passport;
980 // }
981 // contact_xml = g_strdup_printf(MSN_XML_ADD_CONTACT, escaped_displayname, passport);
982
983 contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport);
984 body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml); 976 body = g_strdup_printf(MSN_ADD_CONTACT_TEMPLATE, contact_xml);
985 977
986 g_free(contact_xml); 978 g_free(contact_xml);
987 979
988 /*build SOAP and POST it*/ 980 /*build SOAP and POST it*/
998 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); 990 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init);
999 991
1000 g_free(soap_action); 992 g_free(soap_action);
1001 g_free(body); 993 g_free(body);
1002 } 994 }
1003 #endif
1004 995
1005 static void 996 static void
1006 msn_add_contact_to_group_read_cb(gpointer data, gint source, PurpleInputCondition cond) 997 msn_add_contact_to_group_read_cb(gpointer data, gint source, PurpleInputCondition cond)
1007 { 998 {
1008 MsnSoapConn * soapconn = data; 999 MsnSoapConn * soapconn = data;
1064 g_return_if_fail(contact != NULL); 1055 g_return_if_fail(contact != NULL);
1065 g_return_if_fail(contact->session != NULL); 1056 g_return_if_fail(contact->session != NULL);
1066 g_return_if_fail(contact->session->userlist != NULL); 1057 g_return_if_fail(contact->session->userlist != NULL);
1067 1058
1068 userlist = contact->session->userlist; 1059 userlist = contact->session->userlist;
1069 1060
1061 if (!strcmp(groupId, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(groupId, MSN_NON_IM_GROUP_ID)) {
1062
1063 user = msn_userlist_find_add_user(userlist, passport, passport);
1064
1065 if (state->action & MSN_ADD_BUDDY) {
1066 msn_add_contact(contact, state, passport);
1067 return;
1068 }
1069
1070 if (state->action & MSN_MOVE_BUDDY) {
1071 msn_user_add_group_id(user, groupId);
1072 msn_del_contact_from_group(contact, passport, state->old_group_name);
1073 } else {
1074 msn_callback_state_free(state);
1075 }
1076
1077 return;
1078 }
1079
1080
1070 purple_debug_info("MSNCL", "Adding user %s to group %s\n", passport, 1081 purple_debug_info("MSNCL", "Adding user %s to group %s\n", passport,
1071 msn_userlist_find_group_name(userlist, groupId)); 1082 msn_userlist_find_group_name(userlist, groupId));
1072 1083
1073 user = msn_userlist_find_user(userlist, passport); 1084 user = msn_userlist_find_user(userlist, passport);
1074 if (user == NULL) { 1085 if (user == NULL) {
1207 1218
1208 if (user == NULL) { 1219 if (user == NULL) {
1209 purple_debug_warning("MSN CL", "Unable to retrieve user from passport %s!\n", passport); 1220 purple_debug_warning("MSN CL", "Unable to retrieve user from passport %s!\n", passport);
1210 return; 1221 return;
1211 } 1222 }
1212 1223
1224 if ( !strcmp(groupId, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(groupId, MSN_NON_IM_GROUP_ID)) {
1225 msn_user_remove_group_id(user, groupId);
1226 return;
1227 }
1228
1213 state = msn_callback_state_new(); 1229 state = msn_callback_state_new();
1214 msn_callback_state_set_who(state, passport); 1230 msn_callback_state_set_who(state, passport);
1215 msn_callback_state_set_guid(state, groupId); 1231 msn_callback_state_set_guid(state, groupId);
1216 msn_callback_state_set_old_group_name(state, group_name); 1232 msn_callback_state_set_old_group_name(state, group_name);
1217 1233
1294 soapconn->read_cb = msn_block_read_cb; 1310 soapconn->read_cb = msn_block_read_cb;
1295 } 1311 }
1296 1312
1297 /*block a Contact*/ 1313 /*block a Contact*/
1298 void 1314 void
1299 msn_block_contact(MsnContact *contact,const char* membership_id) 1315 msn_block_contact(MsnContact *contact, const char* membership_id)
1300 { 1316 {
1301 MsnSoapReq *soap_request; 1317 MsnSoapReq *soap_request;
1302 char *body = NULL; 1318 char *body = NULL;
1303 1319
1304 purple_debug_info("MSNP14","msn block a contact...\n"); 1320 purple_debug_info("MSNP14","msn block a contact...\n");
1305 body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE,membership_id); 1321 body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE, membership_id);
1306 /*build SOAP and POST it*/ 1322 /*build SOAP and POST it*/
1307 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, 1323 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER,
1308 MSN_SHARE_POST_URL, 1324 MSN_SHARE_POST_URL,
1309 MSN_CONTACT_BLOCK_SOAP_ACTION, 1325 MSN_CONTACT_BLOCK_SOAP_ACTION,
1310 body, 1326 body,
1532 */ 1548 */
1533 if (guid == NULL) { 1549 if (guid == NULL) {
1534 purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name); 1550 purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name);
1535 return; 1551 return;
1536 } 1552 }
1553
1554 if ( !strcmp(guid, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(guid, MSN_NON_IM_GROUP_ID) ) {
1555 // add back PurpleGroup since it isn't really removed in the server?
1556 return;
1557 }
1558
1537 state = msn_callback_state_new(); 1559 state = msn_callback_state_new();
1538 msn_callback_state_set_action(state, MSN_DEL_GROUP); 1560 msn_callback_state_set_action(state, MSN_DEL_GROUP);
1539 msn_callback_state_set_guid(state, guid); 1561 msn_callback_state_set_guid(state, guid);
1540 1562
1541 body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE, guid); 1563 body = g_strdup_printf(MSN_GROUP_DEL_TEMPLATE, guid);
1571 purple_debug_info("MSN CL", "Renaming group %s to %s.\n", old_group_name, new_group_name); 1593 purple_debug_info("MSN CL", "Renaming group %s to %s.\n", old_group_name, new_group_name);
1572 1594
1573 guid = msn_userlist_find_group_id(session->userlist, old_group_name); 1595 guid = msn_userlist_find_group_id(session->userlist, old_group_name);
1574 if (guid == NULL) 1596 if (guid == NULL)
1575 return; 1597 return;
1576 1598
1577 msn_callback_state_set_action(state, MSN_RENAME_GROUP);
1578 msn_callback_state_set_guid(state, guid); 1599 msn_callback_state_set_guid(state, guid);
1579 msn_callback_state_set_new_group_name(state, new_group_name); 1600 msn_callback_state_set_new_group_name(state, new_group_name);
1601
1602 if ( !strcmp(guid, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(guid, MSN_NON_IM_GROUP_ID) ) {
1603 msn_add_group(session, state, new_group_name);
1604 // XXX move every buddy there (we probably need to fix concurrent SOAP reqs first)
1605 }
1606
1607 msn_callback_state_set_action(state, MSN_RENAME_GROUP);
1580 1608
1581 /* escape group name's html special chars so it can safely be sent 1609 /* escape group name's html special chars so it can safely be sent
1582 * in a XML SOAP request 1610 * in a XML SOAP request
1583 */ 1611 */
1584 escaped_group_name = g_markup_escape_text(new_group_name, -1); 1612 escaped_group_name = g_markup_escape_text(new_group_name, -1);