comparison libpurple/protocols/msn/contact.c @ 26991:2a95e8bd9b80

Parse the invite message out of the pending membership list so that it can be presented to the user when someone adds us to their buddy list.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Tue, 19 May 2009 03:16:45 +0000
parents 6db0d455813b
children 01f1929d0936
comparison
equal deleted inserted replaced
26990:16255111b180 26991:2a95e8bd9b80
355 char *type = xmlnode_get_data(xmlnode_get_child(member, "Type")); 355 char *type = xmlnode_get_data(xmlnode_get_child(member, "Type"));
356 char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId")); 356 char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId"));
357 MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL); 357 MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL);
358 xmlnode *annotation; 358 xmlnode *annotation;
359 guint nid = MSN_NETWORK_UNKNOWN; 359 guint nid = MSN_NETWORK_UNKNOWN;
360 360 char *invite = NULL;
361 /* For EmailMembers, the network must be found in the annotations. */ 361
362 if (!strcmp(node, "PassportName")) { 362 for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
363 annotation;
364 annotation = xmlnode_get_next_twin(annotation)) {
365 char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
366 char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
367 if (name && value) {
368 if (!strcmp(name, "MSN.IM.BuddyType")) {
369 nid = strtoul(value, NULL, 10);
370 }
371 else if (!strcmp(name, "MSN.IM.InviteMessage")) {
372 invite = value;
373 value = NULL;
374 }
375 }
376 g_free(name);
377 g_free(value);
378 }
379
380 /* For EmailMembers, the network must be found in the annotations, above.
381 Otherwise, PassportMembers are on the Passport network. */
382 if (!strcmp(node, "PassportName"))
363 nid = MSN_NETWORK_PASSPORT; 383 nid = MSN_NETWORK_PASSPORT;
364 } else {
365 for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
366 annotation;
367 annotation = xmlnode_get_next_twin(annotation)) {
368 char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
369 if (name && !strcmp(name, "MSN.IM.BuddyType")) {
370 char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
371 if (value != NULL)
372 nid = strtoul(value, NULL, 10);
373 g_free(value);
374 }
375 g_free(name);
376 }
377 }
378 384
379 purple_debug_info("msn", "CL: %s name: %s, Type: %s, MembershipID: %s, NetworkID: %u\n", 385 purple_debug_info("msn", "CL: %s name: %s, Type: %s, MembershipID: %s, NetworkID: %u\n",
380 node, passport, type, member_id == NULL ? "(null)" : member_id, nid); 386 node, passport, type, member_id == NULL ? "(null)" : member_id, nid);
381 387
382 msn_user_set_network(user, nid); 388 msn_user_set_network(user, nid);
389 msn_user_set_invite_message(user, invite);
383 390
384 if (member_id) { 391 if (member_id) {
385 user->membership_id[list] = atoi(member_id); 392 user->membership_id[list] = atoi(member_id);
386 } 393 }
387 394
388 msn_got_lst_user(session, user, 1 << list, NULL); 395 msn_got_lst_user(session, user, 1 << list, NULL);
389 396
390 g_free(passport); 397 g_free(passport);
391 g_free(type); 398 g_free(type);
392 g_free(member_id); 399 g_free(member_id);
400 g_free(invite);
393 } 401 }
394 402
395 static void 403 static void
396 msn_parse_each_service(MsnSession *session, xmlnode *service) 404 msn_parse_each_service(MsnSession *session, xmlnode *service)
397 { 405 {