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