Mercurial > pidgin
comparison libpurple/protocols/msn/contact.c @ 20486:ff4ae9dde291
Make block/unblock work right, as well as being add by a buddy. Finally fixes #723
author | Carlos Silva <typ0@pidgin.im> |
---|---|
date | Mon, 03 Sep 2007 05:47:52 +0000 |
parents | 98613886411a |
children | 321d25932f5e |
comparison
equal
deleted
inserted
replaced
20485:87eea1c5be97 | 20486:ff4ae9dde291 |
---|---|
23 * along with this program; if not, write to the Free Software | 23 * along with this program; if not, write to the Free Software |
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
25 */ | 25 */ |
26 | 26 |
27 #include "msn.h" | 27 #include "msn.h" |
28 #include "soap.h" | |
29 #include "contact.h" | 28 #include "contact.h" |
30 #include "xmlnode.h" | 29 #include "xmlnode.h" |
31 #include "group.h" | 30 #include "group.h" |
32 | 31 |
33 | |
34 const char *MsnSoapPartnerScenarioText[] = | 32 const char *MsnSoapPartnerScenarioText[] = |
35 { | 33 { |
36 "Initial", | 34 "Initial", |
37 "ContactSave", | 35 "ContactSave", |
38 "MessengerPendingList" | 36 "MessengerPendingList", |
37 "ContactMsgrAPI", | |
38 "BlockUnblock" | |
39 }; | 39 }; |
40 | 40 |
41 const char *MsnMemberRole[] = | |
42 { | |
43 "Forward", | |
44 "Allow", | |
45 "Block", | |
46 "Reverse", | |
47 "Pending" | |
48 }; | |
41 | 49 |
42 /* new a contact */ | 50 /* new a contact */ |
43 MsnContact * | 51 MsnContact * |
44 msn_contact_new(MsnSession *session) | 52 msn_contact_new(MsnSession *session) |
45 { | 53 { |
178 /*login ok!We can retrieve the contact list*/ | 186 /*login ok!We can retrieve the contact list*/ |
179 // msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); | 187 // msn_get_contact_list(contact, MSN_PS_INITIAL, NULL); |
180 } | 188 } |
181 | 189 |
182 /*get MSN member role utility*/ | 190 /*get MSN member role utility*/ |
183 static int | 191 static MsnListId |
184 msn_get_memberrole(char * role) | 192 msn_get_memberrole(char * role) |
185 { | 193 { |
186 | 194 |
187 if (!strcmp(role,"Allow")) { | 195 if (!strcmp(role,"Allow")) { |
188 return MSN_LIST_AL_OP; | 196 return MSN_LIST_AL; |
189 } else if (!strcmp(role,"Block")) { | 197 } else if (!strcmp(role,"Block")) { |
190 return MSN_LIST_BL_OP; | 198 return MSN_LIST_BL; |
191 } else if (!strcmp(role,"Reverse")) { | 199 } else if (!strcmp(role,"Reverse")) { |
192 return MSN_LIST_RL_OP; | 200 return MSN_LIST_RL; |
193 } else if (!strcmp(role,"Pending")) { | 201 } else if (!strcmp(role,"Pending")) { |
194 return MSN_LIST_PL_OP; | 202 return MSN_LIST_PL; |
195 } | 203 } |
196 return 0; | 204 return 0; |
197 } | 205 } |
198 | 206 |
199 /*get User Type*/ | 207 /*get User Type*/ |
272 /*parse contact list*/ | 280 /*parse contact list*/ |
273 static void | 281 static void |
274 msn_parse_contact_list(MsnContact * contact) | 282 msn_parse_contact_list(MsnContact * contact) |
275 { | 283 { |
276 MsnSession * session; | 284 MsnSession * session; |
277 int list_op = 0; | 285 MsnListOp list_op = 0; |
286 MsnListId list; | |
278 char * passport, *typedata; | 287 char * passport, *typedata; |
279 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; | 288 xmlnode *fault, *faultstringnode, *faultdetail, *errorcode; |
280 xmlnode *node, *body, *response, *result, *services; | 289 xmlnode *node, *body, *response, *result, *services; |
281 xmlnode *service, *memberships, *info, *handle, *handletype; | 290 xmlnode *service, *memberships, *info, *handle, *handletype; |
282 xmlnode *LastChangeNode; | 291 xmlnode *LastChangeNode; |
419 xmlnode *roleNode; | 428 xmlnode *roleNode; |
420 char *role; | 429 char *role; |
421 | 430 |
422 roleNode = xmlnode_get_child(membershipnode,"MemberRole"); | 431 roleNode = xmlnode_get_child(membershipnode,"MemberRole"); |
423 role = xmlnode_get_data(roleNode); | 432 role = xmlnode_get_data(roleNode); |
424 list_op = msn_get_memberrole(role); | 433 list = msn_get_memberrole(role); |
434 list_op = 1 << list; | |
435 | |
425 purple_debug_info("MSNCL","MemberRole role: %s, list_op: %d\n",role,list_op); | 436 purple_debug_info("MSNCL","MemberRole role: %s, list_op: %d\n",role,list_op); |
426 | 437 |
427 g_free(role); | 438 g_free(role); |
428 | 439 |
429 members = xmlnode_get_child(membershipnode,"Members"); | 440 members = xmlnode_get_child(membershipnode,"Members"); |
430 for (member = xmlnode_get_child(members, "Member"); member; | 441 for (member = xmlnode_get_child(members, "Member"); member; |
431 member = xmlnode_get_next_twin(member)){ | 442 member = xmlnode_get_next_twin(member)){ |
432 MsnUser *user; | 443 MsnUser *user = NULL; |
433 xmlnode * typeNode; | 444 xmlnode *typeNode, *membershipIdNode=NULL; |
434 char * type; | 445 gchar *type, *membershipId = NULL; |
435 | 446 |
436 purple_debug_info("MSNCL","Member type: %s\n", xmlnode_get_attrib(member,"type")); | 447 purple_debug_info("MSNCL","Member type: %s\n", xmlnode_get_attrib(member,"type")); |
437 | 448 |
438 if( !g_strcasecmp(xmlnode_get_attrib(member,"type"), "PassportMember") ) { | 449 if( !g_strcasecmp(xmlnode_get_attrib(member,"type"), "PassportMember") ) { |
439 passportNode = xmlnode_get_child(member,"PassportName"); | 450 passportNode = xmlnode_get_child(member,"PassportName"); |
442 type = xmlnode_get_data(typeNode); | 453 type = xmlnode_get_data(typeNode); |
443 purple_debug_info("MSNCL","Passport name: '%s', Type: %s\n",passport,type); | 454 purple_debug_info("MSNCL","Passport name: '%s', Type: %s\n",passport,type); |
444 g_free(type); | 455 g_free(type); |
445 | 456 |
446 user = msn_userlist_find_add_user(session->userlist,passport,NULL); | 457 user = msn_userlist_find_add_user(session->userlist,passport,NULL); |
458 | |
459 membershipIdNode = xmlnode_get_child(member,"MembershipId"); | |
460 if (membershipIdNode != NULL) { | |
461 membershipId = xmlnode_get_data(membershipIdNode); | |
462 if (membershipId != NULL) { | |
463 user->membership_id[list] = atoi(membershipId); | |
464 g_free(membershipId); | |
465 } | |
466 } | |
467 | |
447 msn_got_lst_user(session, user, list_op, NULL); | 468 msn_got_lst_user(session, user, list_op, NULL); |
469 | |
448 g_free(passport); | 470 g_free(passport); |
449 } | 471 } |
450 | 472 |
451 if (!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")) { | 473 if (!g_strcasecmp(xmlnode_get_attrib(member,"type"),"PhoneMember")) { |
452 } | 474 } |
456 | 478 |
457 emailNode = xmlnode_get_child(member,"Email"); | 479 emailNode = xmlnode_get_child(member,"Email"); |
458 passport = xmlnode_get_data(emailNode); | 480 passport = xmlnode_get_data(emailNode); |
459 purple_debug_info("MSNCL","Email Member: Name: '%s', list_op: %d\n", passport, list_op); | 481 purple_debug_info("MSNCL","Email Member: Name: '%s', list_op: %d\n", passport, list_op); |
460 user = msn_userlist_find_add_user(session->userlist, passport, NULL); | 482 user = msn_userlist_find_add_user(session->userlist, passport, NULL); |
483 | |
484 membershipIdNode = xmlnode_get_child(member,"MembershipId"); | |
485 if (membershipIdNode != NULL) { | |
486 membershipId = xmlnode_get_data(membershipIdNode); | |
487 if (membershipId != NULL) { | |
488 user->membership_id[list] = atoi(membershipId); | |
489 g_free(membershipId); | |
490 } | |
491 } | |
492 | |
461 msn_got_lst_user(session, user, list_op, NULL); | 493 msn_got_lst_user(session, user, list_op, NULL); |
462 g_free(passport); | 494 g_free(passport); |
463 } | 495 } |
464 } | 496 } |
465 } | 497 } |
471 } | 503 } |
472 | 504 |
473 static void | 505 static void |
474 msn_get_contact_list_cb(gpointer data, gint source, PurpleInputCondition cond) | 506 msn_get_contact_list_cb(gpointer data, gint source, PurpleInputCondition cond) |
475 { | 507 { |
476 MsnSoapConn *soapconn = data; | 508 MsnSoapConn *soapconn = data; |
477 MsnContact *contact; | 509 MsnContact *contact; |
478 MsnSession *session; | 510 MsnSession *session; |
479 const char *abLastChange; | 511 const char *abLastChange; |
480 const char *dynamicItemLastChange; | 512 const char *dynamicItemLastChange; |
513 gchar *partner_scenario; | |
481 | 514 |
482 purple_debug_misc("MSNCL","Got the contact list!\n"); | 515 purple_debug_misc("MSNCL","Got the contact list!\n"); |
483 | 516 |
484 contact = soapconn->parent; | 517 contact = soapconn->parent; |
485 g_return_if_fail(contact != NULL); | 518 g_return_if_fail(contact != NULL); |
486 session = soapconn->session; | 519 session = soapconn->session; |
487 g_return_if_fail(session != NULL); | 520 g_return_if_fail(session != NULL); |
521 g_return_if_fail(soapconn->data_cb != NULL); | |
522 | |
523 partner_scenario = soapconn->data_cb; | |
488 | 524 |
489 msn_parse_contact_list(contact); | 525 msn_parse_contact_list(contact); |
490 /*free the read buffer*/ | 526 /*free the read buffer*/ |
491 msn_soap_free_read_buf(soapconn); | 527 msn_soap_free_read_buf(soapconn); |
492 | 528 |
493 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); | 529 abLastChange = purple_account_get_string(session->account, "ablastChange", NULL); |
494 dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL); | 530 dynamicItemLastChange = purple_account_get_string(session->account, "dynamicItemLastChange", NULL); |
495 | 531 |
532 if (!strcmp(partner_scenario, MsnSoapPartnerScenarioText[MSN_PS_INITIAL])) { | |
533 | |
496 #ifdef MSN_PARTIAL_LISTS | 534 #ifdef MSN_PARTIAL_LISTS |
497 /* XXX: this should be enabled when we can correctly do partial | 535 /* XXX: this should be enabled when we can correctly do partial |
498 syncs with the server. Currently we need to retrieve the whole | 536 syncs with the server. Currently we need to retrieve the whole |
499 list to detect sync issues */ | 537 list to detect sync issues */ |
500 msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange); | 538 msn_get_address_book(contact, MSN_PS_INITIAL, abLastChange, dynamicItemLastChange); |
501 #else | 539 #else |
502 msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL); | 540 msn_get_address_book(contact, MSN_PS_INITIAL, NULL, NULL); |
503 #endif | 541 #endif |
504 msn_soap_free_read_buf(soapconn); | 542 } else { |
543 msn_soap_free_read_buf(soapconn); | |
544 } | |
505 } | 545 } |
506 | 546 |
507 static void | 547 static void |
508 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 548 msn_get_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) |
509 { | 549 { |
517 /*SOAP get contact list*/ | 557 /*SOAP get contact list*/ |
518 void | 558 void |
519 msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time) | 559 msn_get_contact_list(MsnContact * contact, const MsnSoapPartnerScenario partner_scenario, const char *update_time) |
520 { | 560 { |
521 MsnSoapReq *soap_request; | 561 MsnSoapReq *soap_request; |
522 char *body = NULL; | 562 gchar *body = NULL; |
523 char * update_str; | 563 gchar * update_str; |
564 const gchar *partner_scenario_str = MsnSoapPartnerScenarioText[partner_scenario]; | |
524 | 565 |
525 purple_debug_misc("MSNCL","Getting Contact List.\n"); | 566 purple_debug_misc("MSNCL","Getting Contact List.\n"); |
567 | |
526 if ( update_time != NULL ) { | 568 if ( update_time != NULL ) { |
527 purple_debug_info("MSNCL","Last update time: %s\n",update_time); | 569 purple_debug_info("MSNCL","Last update time: %s\n",update_time); |
528 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); | 570 update_str = g_strdup_printf(MSN_GET_CONTACT_UPDATE_XML,update_time); |
529 } else { | 571 } else { |
530 update_str = g_strdup(""); | 572 update_str = g_strdup(""); |
531 } | 573 } |
532 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, MsnSoapPartnerScenarioText[partner_scenario], update_str); | 574 |
575 body = g_strdup_printf(MSN_GET_CONTACT_TEMPLATE, partner_scenario_str, update_str); | |
533 g_free(update_str); | 576 g_free(update_str); |
534 | 577 |
535 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, | 578 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, |
536 MSN_GET_CONTACT_POST_URL,MSN_GET_CONTACT_SOAP_ACTION, | 579 MSN_GET_CONTACT_POST_URL, |
580 MSN_GET_CONTACT_SOAP_ACTION, | |
537 body, | 581 body, |
538 NULL, | 582 (gpointer) partner_scenario_str, |
539 msn_get_contact_list_cb, | 583 msn_get_contact_list_cb, |
540 msn_get_contact_written_cb); | 584 msn_get_contact_written_cb); |
541 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); | 585 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); |
542 g_free(body); | 586 g_free(body); |
543 } | 587 } |
931 | 975 |
932 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); | 976 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); |
933 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); | 977 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); |
934 } | 978 } |
935 msn_notification_send_fqy(soapconn->session, state->who); | 979 msn_notification_send_fqy(soapconn->session, state->who); |
936 | 980 |
937 user = msn_userlist_find_add_user(userlist, state->who, state->who); | 981 user = msn_userlist_find_add_user(userlist, state->who, state->who); |
938 msn_user_add_group_id(user, state->guid); | 982 msn_user_add_group_id(user, state->guid); |
939 | 983 |
984 if (msn_userlist_user_is_in_list(user, MSN_LIST_PL)) { | |
985 msn_del_contact_from_list(soapconn->session->contact, NULL, state->who, MSN_LIST_PL); | |
986 } else { | |
987 msn_soap_free_read_buf(soapconn); | |
988 } | |
989 | |
940 msn_callback_state_free(state); | 990 msn_callback_state_free(state); |
941 msn_soap_free_read_buf(soapconn); | |
942 } | 991 } |
943 | 992 |
944 static void | 993 static void |
945 msn_add_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 994 msn_add_contact_written_cb(gpointer data, gint source, PurpleInputCondition cond) |
946 { | 995 { |
1013 } else { | 1062 } else { |
1014 purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name); | 1063 purple_debug_info("MSNCL","Contact %s added to group %s successfully on server, but failed in the local list\n", state->who, state->new_group_name); |
1015 } | 1064 } |
1016 | 1065 |
1017 if (state->action & MSN_ADD_BUDDY) { | 1066 if (state->action & MSN_ADD_BUDDY) { |
1067 MsnUser *user = msn_userlist_find_user(userlist, state->who); | |
1068 | |
1018 if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) { | 1069 if ( !msn_user_is_yahoo(soapconn->session->account, state->who) ) { |
1019 | 1070 |
1020 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); | 1071 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_AL); |
1021 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); | 1072 msn_userlist_add_buddy_to_list(userlist, state->who, MSN_LIST_FL); |
1022 } | 1073 } |
1023 msn_notification_send_fqy(soapconn->session, state->who); | 1074 msn_notification_send_fqy(soapconn->session, state->who); |
1075 | |
1076 if (msn_userlist_user_is_in_list(user, MSN_LIST_PL)) { | |
1077 msn_del_contact_from_list(soapconn->session->contact, NULL, state->who, MSN_LIST_PL); | |
1078 msn_callback_state_free(state); | |
1079 return; | |
1080 } | |
1024 } | 1081 } |
1025 | 1082 |
1026 if (state->action & MSN_MOVE_BUDDY) { | 1083 if (state->action & MSN_MOVE_BUDDY) { |
1027 msn_del_contact_from_group(soapconn->session->contact, state->who, state->old_group_name); | 1084 msn_del_contact_from_group(soapconn->session->contact, state->who, state->old_group_name); |
1028 } else { | 1085 } else { |
1293 msn_soap_post(contact->soapconn, soap_request, msn_contact_connect_init); | 1350 msn_soap_post(contact->soapconn, soap_request, msn_contact_connect_init); |
1294 | 1351 |
1295 g_free(body); | 1352 g_free(body); |
1296 } | 1353 } |
1297 | 1354 |
1298 static void | 1355 |
1299 msn_block_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 1356 static void |
1300 { | 1357 msn_del_contact_from_list_read_cb(gpointer data, gint source, PurpleInputCondition cond) |
1301 purple_debug_info("MSNP14","block read done\n"); | 1358 { |
1302 } | 1359 MsnSoapConn * soapconn = data; |
1303 | 1360 MsnCallbackState *state = NULL; |
1304 static void | 1361 |
1305 msn_block_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 1362 g_return_if_fail(soapconn->data_cb != NULL); |
1306 { | 1363 g_return_if_fail(soapconn->session != NULL); |
1307 MsnSoapConn * soapconn = data; | 1364 g_return_if_fail(soapconn->session->contact != NULL); |
1308 | 1365 |
1309 purple_debug_info("MSNP14","finish block written\n"); | 1366 state = (MsnCallbackState *) soapconn->data_cb; |
1310 soapconn->read_cb = msn_block_read_cb; | 1367 |
1311 } | 1368 purple_debug_info("MSN CL", "Contact %s deleted successfully from %s list on server!\n", state->who, MsnMemberRole[state->list_id]); |
1312 | 1369 |
1313 /*block a Contact*/ | 1370 if (state->list_id == MSN_LIST_PL) { |
1314 void | 1371 msn_add_contact_to_list(soapconn->session->contact, state, state->who, MSN_LIST_RL); |
1315 msn_block_contact(MsnContact *contact, const char* membership_id) | 1372 return; |
1373 } | |
1374 | |
1375 if (state->list_id == MSN_LIST_AL) { | |
1376 purple_privacy_permit_remove(soapconn->session->account, state->who, TRUE); | |
1377 msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL); | |
1378 msn_callback_state_free(state); | |
1379 return; | |
1380 } | |
1381 | |
1382 if (state->list_id == MSN_LIST_BL) { | |
1383 purple_privacy_deny_remove(soapconn->session->account, state->who, TRUE); | |
1384 msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_AL); | |
1385 msn_callback_state_free(state); | |
1386 return; | |
1387 } | |
1388 | |
1389 msn_callback_state_free(state); | |
1390 msn_soap_free_read_buf(soapconn); | |
1391 } | |
1392 | |
1393 static void | |
1394 msn_del_contact_from_list_written_cb(gpointer data, gint source, PurpleInputCondition cond) | |
1395 { | |
1396 MsnSoapConn * soapconn = data; | |
1397 | |
1398 purple_debug_info("MSN CL","Delete contact from list SOAP request sent!\n"); | |
1399 soapconn->read_cb = msn_del_contact_from_list_read_cb; | |
1400 } | |
1401 | |
1402 void | |
1403 msn_del_contact_from_list(MsnContact *contact, MsnCallbackState *state, | |
1404 const gchar *passport, const MsnListId list) | |
1316 { | 1405 { |
1317 MsnSoapReq *soap_request; | 1406 MsnSoapReq *soap_request; |
1318 char *body = NULL; | 1407 gchar *body = NULL, *member = NULL; |
1319 | 1408 MsnSoapPartnerScenario partner_scenario; |
1320 purple_debug_info("MSNP14","msn block a contact...\n"); | 1409 MsnUser *user; |
1321 body = g_strdup_printf(MSN_CONTACT_DELECT_FROM_ALLOW_TEMPLATE, membership_id); | 1410 |
1322 /*build SOAP and POST it*/ | 1411 g_return_if_fail(contact != NULL); |
1323 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, | 1412 g_return_if_fail(passport != NULL); |
1324 MSN_SHARE_POST_URL, | 1413 g_return_if_fail(list < 5); |
1325 MSN_CONTACT_BLOCK_SOAP_ACTION, | 1414 |
1326 body, | 1415 purple_debug_info("MSN CL", "Deleting contact %s from %s list\n", passport, MsnMemberRole[list]); |
1327 NULL, | 1416 |
1328 msn_block_read_cb, | 1417 if (state == NULL) { |
1329 msn_block_written_cb); | 1418 state = msn_callback_state_new(); |
1419 } | |
1420 msn_callback_state_set_list_id(state, list); | |
1421 msn_callback_state_set_who(state, passport); | |
1422 | |
1423 if (list == MSN_LIST_PL) { | |
1424 g_return_if_fail(contact->session != NULL); | |
1425 g_return_if_fail(contact->session->userlist != NULL); | |
1426 | |
1427 user = msn_userlist_find_user(contact->session->userlist, passport); | |
1428 | |
1429 partner_scenario = MSN_PS_CONTACT_API; | |
1430 member = g_strdup_printf(MSN_MEMBER_MEMBERSHIPID_XML, user->membership_id[MSN_LIST_PL]); | |
1431 } else { | |
1432 /* list == MSN_LIST_AL || list == MSN_LIST_BL */ | |
1433 partner_scenario = MSN_PS_BLOCK_UNBLOCK; | |
1434 | |
1435 member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, passport); | |
1436 } | |
1437 | |
1438 body = g_strdup_printf( MSN_CONTACT_DELECT_FROM_LIST_TEMPLATE, | |
1439 MsnSoapPartnerScenarioText[partner_scenario], | |
1440 MsnMemberRole[list], | |
1441 member); | |
1442 g_free(member); | |
1443 | |
1444 soap_request = msn_soap_request_new( MSN_CONTACT_SERVER, | |
1445 MSN_SHARE_POST_URL, | |
1446 MSN_DELETE_MEMBER_FROM_LIST_SOAP_ACTION, | |
1447 body, | |
1448 state, | |
1449 msn_del_contact_from_list_read_cb, | |
1450 msn_del_contact_from_list_written_cb); | |
1451 | |
1330 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); | 1452 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); |
1331 | 1453 |
1332 g_free(body); | 1454 g_free(body); |
1333 } | 1455 } |
1334 | 1456 |
1335 static void | 1457 static void |
1336 msn_unblock_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 1458 msn_add_contact_to_list_read_cb(gpointer data, gint source, PurpleInputCondition cond) |
1337 { | 1459 { |
1338 purple_debug_info("MSNP14","unblock read done\n"); | 1460 MsnSoapConn * soapconn = data; |
1339 } | 1461 MsnCallbackState *state = NULL; |
1340 | 1462 |
1341 static void | 1463 g_return_if_fail(soapconn->data_cb != NULL); |
1342 msn_unblock_written_cb(gpointer data, gint source, PurpleInputCondition cond) | 1464 |
1343 { | 1465 state = (MsnCallbackState *) soapconn->data_cb; |
1344 MsnSoapConn * soapconn = data; | 1466 |
1345 | 1467 purple_debug_info("MSN CL", "Contact %s added successfully to %s list on server!\n", state->who, MsnMemberRole[state->list_id]); |
1346 purple_debug_info("MSNP14","finish unblock written\n"); | 1468 |
1347 soapconn->read_cb = msn_unblock_read_cb; | 1469 if (state->list_id == MSN_LIST_RL && (state->action & MSN_DENIED_BUDDY) ) { |
1348 } | 1470 g_return_if_fail(soapconn->session != NULL); |
1349 | 1471 g_return_if_fail(soapconn->session->contact != NULL); |
1350 /*unblock a contact*/ | 1472 |
1351 void | 1473 msn_add_contact_to_list(soapconn->session->contact, NULL, state->who, MSN_LIST_BL); |
1352 msn_unblock_contact(MsnContact *contact,const char* passport) | 1474 return; |
1475 } | |
1476 | |
1477 if (state->list_id == MSN_LIST_AL) { | |
1478 purple_privacy_permit_add(soapconn->session->account, state->who, TRUE); | |
1479 } else if (state->list_id == MSN_LIST_BL) { | |
1480 purple_privacy_deny_add(soapconn->session->account, state->who, TRUE); | |
1481 } | |
1482 | |
1483 msn_callback_state_free(state); | |
1484 msn_soap_free_read_buf(soapconn); | |
1485 } | |
1486 | |
1487 | |
1488 static void | |
1489 msn_add_contact_to_list_written_cb(gpointer data, gint source, PurpleInputCondition cond) | |
1490 { | |
1491 MsnSoapConn * soapconn = data; | |
1492 | |
1493 purple_debug_info("MSN CL","Add contact to list SOAP request sent!\n"); | |
1494 soapconn->read_cb = msn_add_contact_to_list_read_cb; | |
1495 } | |
1496 | |
1497 void | |
1498 msn_add_contact_to_list(MsnContact *contact, MsnCallbackState *state, | |
1499 const gchar *passport, const MsnListId list) | |
1353 { | 1500 { |
1354 MsnSoapReq *soap_request; | 1501 MsnSoapReq *soap_request; |
1355 char *body = NULL; | 1502 gchar *body = NULL, *member = NULL; |
1356 | 1503 MsnSoapPartnerScenario partner_scenario; |
1357 purple_debug_info("MSNP14","msn unblock a contact...\n"); | 1504 |
1358 | 1505 g_return_if_fail(contact != NULL); |
1359 body = g_strdup_printf(MSN_UNBLOCK_CONTACT_TEMPLATE,passport); | 1506 g_return_if_fail(passport != NULL); |
1360 /*build SOAP and POST it*/ | 1507 g_return_if_fail(list < 5); |
1361 soap_request = msn_soap_request_new(MSN_CONTACT_SERVER, | 1508 |
1362 MSN_SHARE_POST_URL,MSN_CONTACT_UNBLOCK_SOAP_ACTION, | 1509 purple_debug_info("MSN CL", "Adding contact %s to %s list\n", passport, MsnMemberRole[list]); |
1363 body, | 1510 |
1364 NULL, | 1511 if (state == NULL) { |
1365 msn_unblock_read_cb, | 1512 state = msn_callback_state_new(); |
1366 msn_unblock_written_cb); | 1513 } |
1367 msn_soap_post(contact->soapconn,soap_request,msn_contact_connect_init); | 1514 msn_callback_state_set_list_id(state, list); |
1515 msn_callback_state_set_who(state, passport); | |
1516 | |
1517 partner_scenario = (list == MSN_LIST_RL) ? MSN_PS_CONTACT_API : MSN_PS_BLOCK_UNBLOCK; | |
1518 | |
1519 member = g_strdup_printf(MSN_MEMBER_PASSPORT_XML, passport); | |
1520 | |
1521 body = g_strdup_printf(MSN_CONTACT_ADD_TO_LIST_TEMPLATE, | |
1522 MsnSoapPartnerScenarioText[partner_scenario], | |
1523 MsnMemberRole[list], | |
1524 member); | |
1525 | |
1526 g_free(member); | |
1527 | |
1528 soap_request = msn_soap_request_new( MSN_CONTACT_SERVER, | |
1529 MSN_SHARE_POST_URL, | |
1530 MSN_ADD_MEMBER_TO_LIST_SOAP_ACTION, | |
1531 body, | |
1532 state, | |
1533 msn_add_contact_to_list_read_cb, | |
1534 msn_add_contact_to_list_written_cb); | |
1535 | |
1536 msn_soap_post(contact->soapconn, soap_request, msn_contact_connect_init); | |
1368 | 1537 |
1369 g_free(body); | 1538 g_free(body); |
1370 } | 1539 } |
1540 | |
1371 | 1541 |
1372 #if 0 | 1542 #if 0 |
1373 static void | 1543 static void |
1374 msn_gleams_read_cb(gpointer data, gint source, PurpleInputCondition cond) | 1544 msn_gleams_read_cb(gpointer data, gint source, PurpleInputCondition cond) |
1375 { | 1545 { |
1550 purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name); | 1720 purple_debug_info("MSN CL", "Group %s guid not found, returning.\n", group_name); |
1551 return; | 1721 return; |
1552 } | 1722 } |
1553 | 1723 |
1554 if ( !strcmp(guid, MSN_INDIVIDUALS_GROUP_ID) || !strcmp(guid, MSN_NON_IM_GROUP_ID) ) { | 1724 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? | 1725 // XXX add back PurpleGroup since it isn't really removed in the server? |
1556 return; | 1726 return; |
1557 } | 1727 } |
1558 | 1728 |
1559 state = msn_callback_state_new(); | 1729 state = msn_callback_state_new(); |
1560 msn_callback_state_set_action(state, MSN_DEL_GROUP); | 1730 msn_callback_state_set_action(state, MSN_DEL_GROUP); |