Mercurial > pidgin
changeset 27431:9c413bda20be
Add support for receiving winks and audio clips on MSN. The resulting file
is linked from the conversation window with msn-wink:// and audio:// links
for further processing by the UI. It's up to the UI to interpret this in
whichever way it pleases.
References #393.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Thu, 09 Jul 2009 05:37:37 +0000 |
parents | 1c61906755fe |
children | 35b6fd563056 |
files | libpurple/protocols/msn/msg.c libpurple/protocols/msn/msn.h |
diffstat | 2 files changed, 119 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/msn/msg.c Wed Jul 08 20:47:08 2009 +0000 +++ b/libpurple/protocols/msn/msg.c Thu Jul 09 05:37:37 2009 +0000 @@ -937,6 +937,91 @@ } } +static void +datacast_inform_user(MsnSwitchBoard *swboard, const char *who, + const char *msg, const char *filename) +{ + char *username, *str; + PurpleAccount *account; + PurpleBuddy *b; + + account = swboard->session->account; + + if ((b = purple_find_buddy(account, who)) != NULL) + username = g_markup_escape_text(purple_buddy_get_alias(b), -1); + else + username = g_markup_escape_text(who, -1); + str = g_strdup_printf(msg, username, filename); + g_free(username); + + if (swboard->conv == NULL) { + if (swboard->current_users > 1) + swboard->conv = purple_find_chat(account->gc, swboard->chat_id); + else { + swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, + who, account); + if (swboard->conv == NULL) + swboard->conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, who); + } + } + swboard->flag |= MSN_SB_FLAG_IM; + + purple_conversation_write(swboard->conv, NULL, str, PURPLE_MESSAGE_SYSTEM, time(NULL)); + g_free(str); + +} + +/* TODO: Make these not be such duplicates of each other */ +static void +got_wink_cb(MsnSlpCall *slpcall, const guchar *data, gsize size) +{ + FILE *f; + char *path = NULL; + const char *who = slpcall->slplink->remote_user; + purple_debug_info("msn", "Received wink from %s\n", who); + + if ((f = purple_mkstemp(&path, TRUE))) { + fwrite(data, size, 1, f); + fclose(f); + datacast_inform_user(slpcall->slplink->swboard, + who, + _("%s sent a wink. <a href='msn-wink://%s'>Click here to play it</a>"), + path); + } else { + purple_debug_error("msn", "Couldn\'t create temp file to store wink\n"); + datacast_inform_user(slpcall->slplink->swboard, + who, + _("%s sent a wink, but it could not be saved"), + NULL); + } + g_free(path); +} + +static void +got_voiceclip_cb(MsnSlpCall *slpcall, const guchar *data, gsize size) +{ + FILE *f; + char *path = NULL; + const char *who = slpcall->slplink->remote_user; + purple_debug_info("msn", "Received voice clip from %s\n", who); + + if ((f = purple_mkstemp(&path, TRUE))) { + fwrite(data, size, 1, f); + fclose(f); + datacast_inform_user(slpcall->slplink->swboard, + who, + _("%s sent a voice clip. <a href='audio://%s'>Click here to play it</a>"), + path); + } else { + purple_debug_error("msn", "Couldn\'t create temp file to store sound\n"); + datacast_inform_user(slpcall->slplink->swboard, + who, + _("%s sent a voice clip, but it could not be saved"), + NULL); + } + g_free(path); +} + void msn_datacast_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { @@ -970,9 +1055,42 @@ } else if (!strcmp(id, "2")) { /* Wink */ + MsnSession *session; + MsnSlpLink *slplink; + MsnObject *obj; + const char *who; + const char *data; + + session = cmdproc->session; + + data = g_hash_table_lookup(body, "Data"); + obj = msn_object_new_from_string(data); + who = msn_object_get_creator(obj); + + slplink = msn_session_get_slplink(session, who); + msn_slplink_request_object(slplink, data, got_wink_cb, NULL, obj); + + msn_object_destroy(obj); + } else if (!strcmp(id, "3")) { /* Voiceclip */ + MsnSession *session; + MsnSlpLink *slplink; + MsnObject *obj; + const char *who; + const char *data; + + session = cmdproc->session; + + data = g_hash_table_lookup(body, "Data"); + obj = msn_object_new_from_string(data); + who = msn_object_get_creator(obj); + + slplink = msn_session_get_slplink(session, who); + msn_slplink_request_object(slplink, data, got_voiceclip_cb, NULL, obj); + + msn_object_destroy(obj); } else if (!strcmp(id, "4")) { /* Action */
--- a/libpurple/protocols/msn/msn.h Wed Jul 08 20:47:08 2009 +0000 +++ b/libpurple/protocols/msn/msn.h Thu Jul 09 05:37:37 2009 +0000 @@ -138,7 +138,7 @@ } MsnClientVerId; #define MSN_CLIENT_ID_VERSION MSN_CLIENT_VER_7_0 -#define MSN_CLIENT_ID_CAPABILITIES (MSN_CLIENT_CAP_PACKET|MSN_CLIENT_CAP_INK_GIF) +#define MSN_CLIENT_ID_CAPABILITIES (MSN_CLIENT_CAP_PACKET|MSN_CLIENT_CAP_INK_GIF|MSN_CLIENT_CAP_VOICEIM|MSN_CLIENT_CAP_WINKS) #define MSN_CLIENT_ID \ ((MSN_CLIENT_ID_VERSION << 24) | \