# HG changeset patch # User Elliott Sales de Andrade # Date 1247461302 0 # Node ID 3698c7f4d803e08b43c943edf50bb59d946e5476 # Parent 7a2891487a00c31c6abc45892073ff7ac1612e04 On MSN, pop up an "invite message" request similar to oscar, and send that in the add request. We really should try and move this into the add buddy dialog instead of an extra prompt. Fixes #8503. diff -r 7a2891487a00 -r 3698c7f4d803 libpurple/protocols/msn/contact.c --- a/libpurple/protocols/msn/contact.c Sun Jul 12 22:40:54 2009 +0000 +++ b/libpurple/protocols/msn/contact.c Mon Jul 13 05:01:42 2009 +0000 @@ -1159,7 +1159,7 @@ { MsnUserList *userlist; MsnUser *user; - gchar *body = NULL, *contact_xml; + gchar *body = NULL, *contact_xml, *invite; g_return_if_fail(passport != NULL); g_return_if_fail(groupId != NULL); @@ -1207,7 +1207,23 @@ contact_xml = g_strdup_printf(MSN_CONTACT_XML, passport); } - body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE, groupId, contact_xml); + if (user->invite_message) { + char *tmp; + body = g_markup_escape_text(user->invite_message, -1); + tmp = g_markup_escape_text(purple_connection_get_display_name(session->account->gc), -1); + invite = g_strdup_printf(MSN_CONTACT_INVITE_MESSAGE_XML, body, tmp); + g_free(body); + g_free(tmp); + + /* We can free this now */ + g_free(user->invite_message); + user->invite_message = NULL; + + } else { + invite = g_strdup(""); + } + + body = g_strdup_printf(MSN_ADD_CONTACT_GROUP_TEMPLATE, groupId, contact_xml, invite); state->body = xmlnode_from_str(body, -1); state->post_action = MSN_ADD_CONTACT_GROUP_SOAP_ACTION; @@ -1215,6 +1231,7 @@ state->cb = msn_add_contact_to_group_read_cb; msn_contact_request(state); + g_free(invite); g_free(contact_xml); g_free(body); } diff -r 7a2891487a00 -r 3698c7f4d803 libpurple/protocols/msn/contact.h --- a/libpurple/protocols/msn/contact.h Sun Jul 12 22:40:54 2009 +0000 +++ b/libpurple/protocols/msn/contact.h Mon Jul 13 05:01:42 2009 +0000 @@ -232,6 +232,17 @@ ""\ "" +#define MSN_CONTACT_INVITE_MESSAGE_XML \ + ""\ + ""\ + ""\ + "MSN.IM.InviteMessage"\ + "%s"\ + ""\ + ""\ + "%s"\ + "" + #define MSN_ADD_CONTACT_TEMPLATE ""\ "true"\ "true"\ ""\ + "%s"\ ""\ ""\ "" diff -r 7a2891487a00 -r 3698c7f4d803 libpurple/protocols/msn/msn.c --- a/libpurple/protocols/msn/msn.c Sun Jul 12 22:40:54 2009 +0000 +++ b/libpurple/protocols/msn/msn.c Mon Jul 13 05:01:42 2009 +0000 @@ -92,6 +92,13 @@ MsnObject *obj; } MsnEmoticon; +typedef struct +{ + PurpleConnection *pc; + PurpleBuddy *buddy; + PurpleGroup *group; +} MsnAddReqData; + static const char * msn_normalize(const PurpleAccount *account, const char *str) { @@ -1429,33 +1436,27 @@ } static void -msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +finish_auth_request(MsnAddReqData *data, char *msg) { + PurpleConnection *pc; + PurpleBuddy *buddy; + PurpleGroup *group; PurpleAccount *account; MsnSession *session; MsnUserList *userlist; - const char *bname, *who, *gname; + const char *who, *gname; MsnUser *user; - account = purple_connection_get_account(gc); - session = gc->proto_data; + pc = data->pc; + buddy = data->buddy; + group = data->group; + g_free(data); + + account = purple_connection_get_account(pc); + session = pc->proto_data; userlist = session->userlist; - bname = purple_buddy_get_name(buddy); - - if (!purple_email_is_valid(bname)) { - gchar *buf; - buf = g_strdup_printf(_("Unable to add the buddy %s because the username is invalid. Usernames must be a valid email address."), bname); - if (!purple_conv_present_error(bname, account, buf)) - purple_notify_error(gc, NULL, _("Unable to Add"), buf); - g_free(buf); - - /* Remove from local list */ - purple_blist_remove_buddy(buddy); - - return; - } - - who = msn_normalize(account, bname); + + who = msn_normalize(account, purple_buddy_get_name(buddy)); gname = group ? purple_group_get_name(group) : NULL; purple_debug_info("msn", "Add user:%s to group:%s\n", who, gname ? gname : "(null)"); if (!session->logged_in) @@ -1472,12 +1473,14 @@ if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) { /* We already know this buddy and their network. This function knows what to do with users already in the list and stuff... */ + msn_user_set_invite_message(user, msg); msn_userlist_add_buddy(userlist, who, gname); } else { char **tokens; char *fqy; /* We need to check the network for this buddy first */ user = msn_user_new(userlist, who, NULL); + msn_user_set_invite_message(user, msg); msn_user_set_pending_group(user, gname); msn_user_set_network(user, MSN_NETWORK_UNKNOWN); tokens = g_strsplit(who, "@", 2); @@ -1492,6 +1495,49 @@ } static void +cancel_auth_request(MsnAddReqData *data, char *msg) +{ + /* Remove from local list */ + purple_blist_remove_buddy(data->buddy); + + g_free(data); +} + +static void +msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) +{ + const char *bname; + MsnAddReqData *data; + + bname = purple_buddy_get_name(buddy); + + if (!purple_email_is_valid(bname)) { + gchar *buf; + buf = g_strdup_printf(_("Unable to add the buddy %s because the username is invalid. Usernames must be a valid email address."), bname); + if (!purple_conv_present_error(bname, purple_connection_get_account(gc), buf)) + purple_notify_error(gc, NULL, _("Unable to Add"), buf); + g_free(buf); + + /* Remove from local list */ + purple_blist_remove_buddy(buddy); + + return; + } + + data = g_new0(MsnAddReqData, 1); + data->pc = gc; + data->buddy = buddy; + data->group = group; + + purple_request_input(gc, NULL, _("Authorization Request Message:"), + NULL, _("Please authorize me!"), TRUE, FALSE, NULL, + _("_OK"), G_CALLBACK(finish_auth_request), + _("_Cancel"), G_CALLBACK(cancel_auth_request), + purple_connection_get_account(gc), bname, NULL, + data); +} + +static void msn_rem_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { MsnSession *session;