comparison libpurple/protocols/msn/msn.c @ 27967:e1cd44c7c7af

explicit merge of 'd957c051e839d63bfc0ef71320934890e7ae63c4' and '7fbd51e5a790f5cf3275a0bb8a8198acd078b4ec'
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sat, 25 Jul 2009 04:54:36 +0000
parents 85fa979b08c2 8cfc45425ac7
children 4a2adf413aaa
comparison
equal deleted inserted replaced
27966:b4daae0798e3 27967:e1cd44c7c7af
90 { 90 {
91 char *smile; 91 char *smile;
92 MsnObject *obj; 92 MsnObject *obj;
93 } MsnEmoticon; 93 } MsnEmoticon;
94 94
95 typedef struct
96 {
97 PurpleConnection *pc;
98 PurpleBuddy *buddy;
99 PurpleGroup *group;
100 } MsnAddReqData;
101
95 static const char * 102 static const char *
96 msn_normalize(const PurpleAccount *account, const char *str) 103 msn_normalize(const PurpleAccount *account, const char *str)
97 { 104 {
98 static char buf[BUF_LEN]; 105 static char buf[BUF_LEN];
99 char *tmp; 106 char *tmp;
178 185
179 session = gc->proto_data; 186 session = gc->proto_data;
180 cmdproc = session->notification->cmdproc; 187 cmdproc = session->notification->cmdproc;
181 account = purple_connection_get_account(gc); 188 account = purple_connection_get_account(gc);
182 189
183 if(entry && strlen(entry)) { 190 if(entry && *entry) {
184 tmp = botch_utf(entry, strlen(entry), &dummy); 191 tmp = botch_utf(entry, strlen(entry), &dummy);
185 alias = purple_url_encode(tmp); 192 alias = purple_url_encode(g_strstrip(tmp));
186 g_free(tmp); 193 g_free(tmp);
187 } 194 }
188 else 195 else
189 alias = ""; 196 alias = "";
190 197
694 office = purple_status_get_attr_string(status, "office"); 701 office = purple_status_get_attr_string(status, "office");
695 702
696 if (title && *title) { 703 if (title && *title) {
697 const char *artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST); 704 const char *artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST);
698 const char *album = purple_status_get_attr_string(status, PURPLE_TUNE_ALBUM); 705 const char *album = purple_status_get_attr_string(status, PURPLE_TUNE_ALBUM);
699 media = g_strdup_printf("%s%s%s%s%s%s", title, 706 media = purple_util_format_song_info(title, artist, album, NULL);
700 (artist && *artist) ? " - " : "", 707 return media;
701 (artist && *artist) ? artist : "",
702 (album && *album) ? " (" : "",
703 (album && *album) ? album : "",
704 (album && *album) ? ")" : "");
705 } 708 }
706 else if (game && *game) 709 else if (game && *game)
707 media = g_strdup_printf("Playing %s", game); 710 media = g_strdup_printf("Playing %s", game);
708 else if (office && *office) 711 else if (office && *office)
709 media = g_strdup_printf("Editing %s", office); 712 media = g_strdup_printf("Editing %s", office);
1416 add_pending_buddy(MsnSession *session, 1419 add_pending_buddy(MsnSession *session,
1417 const char *who, 1420 const char *who,
1418 MsnNetwork network, 1421 MsnNetwork network,
1419 MsnUser *user) 1422 MsnUser *user)
1420 { 1423 {
1421 MsnUserList *userlist = session->userlist;
1422 MsnUser *user2;
1423 char *group; 1424 char *group;
1424 1425
1425 g_return_if_fail(user != NULL); 1426 g_return_if_fail(user != NULL);
1426 1427
1427 group = msn_user_remove_pending_group(user); 1428 group = msn_user_remove_pending_group(user);
1428 1429
1429 user2 = msn_userlist_find_user(userlist, who); 1430 if (network != MSN_NETWORK_UNKNOWN) {
1430 if (user2 != NULL) { 1431 MsnUserList *userlist = session->userlist;
1431 /* User already in userlist, so just update it. */ 1432 MsnUser *user2 = msn_userlist_find_user(userlist, who);
1433 if (user2 != NULL) {
1434 /* User already in userlist, so just update it. */
1435 msn_user_destroy(user);
1436 user = user2;
1437 } else {
1438 msn_userlist_add_user(userlist, user);
1439 }
1440
1441 msn_user_set_network(user, network);
1442 msn_userlist_add_buddy(userlist, who, group);
1443 }
1444 else
1445 {
1446 PurpleBuddy * buddy = purple_find_buddy(session->account, who);
1447 gchar *buf;
1448 buf = g_strdup_printf(_("Unable to add the buddy %s because the username is invalid. Usernames must be a valid email address."), who);
1449 if (!purple_conv_present_error(who, session->account, buf))
1450 purple_notify_error(purple_account_get_connection(session->account), NULL, _("Unable to Add"), buf);
1451 g_free(buf);
1452
1453 /* Remove from local list */
1454 purple_blist_remove_buddy(buddy);
1432 msn_user_destroy(user); 1455 msn_user_destroy(user);
1433 user = user2; 1456 }
1434 } else {
1435 msn_userlist_add_user(userlist, user);
1436 }
1437
1438 msn_user_set_network(user, network);
1439 msn_userlist_add_buddy(userlist, who, group);
1440 g_free(group); 1457 g_free(group);
1441 } 1458 }
1442 1459
1443 static void 1460 static void
1444 msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 1461 finish_auth_request(MsnAddReqData *data, char *msg)
1445 { 1462 {
1463 PurpleConnection *pc;
1464 PurpleBuddy *buddy;
1465 PurpleGroup *group;
1466 PurpleAccount *account;
1446 MsnSession *session; 1467 MsnSession *session;
1447 MsnUserList *userlist; 1468 MsnUserList *userlist;
1448 const char *who, *gname; 1469 const char *who, *gname;
1449 MsnUser *user; 1470 MsnUser *user;
1450 1471
1451 session = gc->proto_data; 1472 pc = data->pc;
1473 buddy = data->buddy;
1474 group = data->group;
1475 g_free(data);
1476
1477 account = purple_connection_get_account(pc);
1478 session = pc->proto_data;
1452 userlist = session->userlist; 1479 userlist = session->userlist;
1453 who = msn_normalize(purple_connection_get_account(gc), purple_buddy_get_name(buddy)); 1480
1454 1481 who = msn_normalize(account, purple_buddy_get_name(buddy));
1455 gname = group ? purple_group_get_name(group) : NULL; 1482 gname = group ? purple_group_get_name(group) : NULL;
1456 purple_debug_info("msn", "Add user:%s to group:%s\n", who, gname ? gname : "(null)"); 1483 purple_debug_info("msn", "Add user:%s to group:%s\n", who, gname ? gname : "(null)");
1457 if (!session->logged_in) 1484 if (!session->logged_in)
1458 { 1485 {
1459 purple_debug_error("msn", "msn_add_buddy called before connected\n"); 1486 purple_debug_error("msn", "msn_add_buddy called before connected\n");
1466 * internal. */ 1493 * internal. */
1467 user = msn_userlist_find_user(userlist, who); 1494 user = msn_userlist_find_user(userlist, who);
1468 if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) { 1495 if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) {
1469 /* We already know this buddy and their network. This function knows 1496 /* We already know this buddy and their network. This function knows
1470 what to do with users already in the list and stuff... */ 1497 what to do with users already in the list and stuff... */
1498 msn_user_set_invite_message(user, msg);
1471 msn_userlist_add_buddy(userlist, who, gname); 1499 msn_userlist_add_buddy(userlist, who, gname);
1472 } else { 1500 } else {
1473 char **tokens; 1501 char **tokens;
1474 char *fqy; 1502 char *fqy;
1475 /* We need to check the network for this buddy first */ 1503 /* We need to check the network for this buddy first */
1476 user = msn_user_new(userlist, who, NULL); 1504 user = msn_user_new(userlist, who, NULL);
1505 msn_user_set_invite_message(user, msg);
1477 msn_user_set_pending_group(user, gname); 1506 msn_user_set_pending_group(user, gname);
1478 msn_user_set_network(user, MSN_NETWORK_UNKNOWN); 1507 msn_user_set_network(user, MSN_NETWORK_UNKNOWN);
1479 tokens = g_strsplit(who, "@", 2); 1508 tokens = g_strsplit(who, "@", 2);
1480 fqy = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>", 1509 fqy = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",
1481 tokens[1], 1510 tokens[1],
1483 msn_notification_send_fqy(session, fqy, strlen(fqy), 1512 msn_notification_send_fqy(session, fqy, strlen(fqy),
1484 (MsnFqyCb)add_pending_buddy, user); 1513 (MsnFqyCb)add_pending_buddy, user);
1485 g_free(fqy); 1514 g_free(fqy);
1486 g_strfreev(tokens); 1515 g_strfreev(tokens);
1487 } 1516 }
1517 }
1518
1519 static void
1520 cancel_auth_request(MsnAddReqData *data, char *msg)
1521 {
1522 /* Remove from local list */
1523 purple_blist_remove_buddy(data->buddy);
1524
1525 g_free(data);
1526 }
1527
1528 static void
1529 msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
1530 {
1531 const char *bname;
1532 MsnAddReqData *data;
1533
1534 bname = purple_buddy_get_name(buddy);
1535
1536 if (!purple_email_is_valid(bname)) {
1537 gchar *buf;
1538 buf = g_strdup_printf(_("Unable to add the buddy %s because the username is invalid. Usernames must be a valid email address."), bname);
1539 if (!purple_conv_present_error(bname, purple_connection_get_account(gc), buf))
1540 purple_notify_error(gc, NULL, _("Unable to Add"), buf);
1541 g_free(buf);
1542
1543 /* Remove from local list */
1544 purple_blist_remove_buddy(buddy);
1545
1546 return;
1547 }
1548
1549 data = g_new0(MsnAddReqData, 1);
1550 data->pc = gc;
1551 data->buddy = buddy;
1552 data->group = group;
1553
1554 purple_request_input(gc, NULL, _("Authorization Request Message:"),
1555 NULL, _("Please authorize me!"), TRUE, FALSE, NULL,
1556 _("_OK"), G_CALLBACK(finish_auth_request),
1557 _("_Cancel"), G_CALLBACK(cancel_auth_request),
1558 purple_connection_get_account(gc), bname, NULL,
1559 data);
1488 } 1560 }
1489 1561
1490 static void 1562 static void
1491 msn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) 1563 msn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
1492 { 1564 {