Mercurial > pidgin
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); |