# HG changeset patch # User Elliott Sales de Andrade # Date 1200180720 0 # Node ID 7b03d95902d4a1f774192c1b987e7217ed5028d2 # Parent bca58b00afabba2e4e62f025bba09ac8ac19f8de References #4382, fixes receiving too many offline messages committer: Ka-Hing Cheung diff -r bca58b00afab -r 7b03d95902d4 libpurple/protocols/msn/oim.c --- a/libpurple/protocols/msn/oim.c Sat Jan 12 23:26:29 2008 +0000 +++ b/libpurple/protocols/msn/oim.c Sat Jan 12 23:32:00 2008 +0000 @@ -41,6 +41,7 @@ } MsnOimRecvData; /*Local Function Prototype*/ +static void msn_parse_oim_xml(MsnOim *oim, xmlnode *node); static void msn_oim_post_single_get_msg(MsnOim *oim, char *msgid); static MsnOimSendReq *msn_oim_new_send_req(const char *from_member, const char *friendname, @@ -112,6 +113,50 @@ } /**************************************** + * OIM GetMetadata request + * **************************************/ +static void +msn_oim_get_metadata_cb(MsnSoapMessage *request, MsnSoapMessage *response, + gpointer data) +{ + MsnOim *oim = data; + + if (response) { + msn_parse_oim_xml(oim, + xmlnode_get_child(response->xml, "Body/GetMetadataResponse/MD")); + } +} + +/* Post to get the OIM Metadata */ +static void +msn_oim_get_metadata(MsnOim *oim) +{ + char *soap_body; + GHashTable *token; + const char *msn_t; + const char *msn_p; + + token = msn_nexus_get_token(oim->session->nexus, MSN_AUTH_MESSENGER_WEB); + g_return_if_fail(token != NULL); + + msn_t = g_hash_table_lookup(token, "t"); + msn_p = g_hash_table_lookup(token, "p"); + + g_return_if_fail(msn_t != NULL); + g_return_if_fail(msn_p != NULL); + + soap_body = g_strdup_printf(MSN_OIM_GET_METADATA_TEMPLATE, msn_t, msn_p); + + msn_soap_message_send(oim->session, + msn_soap_message_new(MSN_OIM_GET_METADATA_ACTION, + xmlnode_from_str(soap_body, -1)), + MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL, + msn_oim_get_metadata_cb, oim); + + g_free(soap_body); +} + +/**************************************** * OIM send SOAP request * **************************************/ /*encode the message to OIM Message Format*/ @@ -476,16 +521,33 @@ void msn_parse_oim_msg(MsnOim *oim,const char *xmlmsg) { - xmlnode *node, *mNode; + xmlnode *node; + + purple_debug_info("MSNP14:OIM", "%s\n", xmlmsg); + + if (!strcmp(xmlmsg, "too-large")) { + /* Too many OIM's to send via NS, so we need to request them via SOAP. */ + msn_oim_get_metadata(oim); + } else { + node = xmlnode_from_str(xmlmsg, -1); + msn_parse_oim_xml(oim, node); + xmlnode_free(node); + } +} + +static void +msn_parse_oim_xml(MsnOim *oim, xmlnode *node) +{ + xmlnode *mNode; xmlnode *iu_node; MsnSession *session = oim->session; - purple_debug_info("MSNP14:OIM", "%s\n", xmlmsg); + g_return_if_fail(node != NULL); - node = xmlnode_from_str(xmlmsg, -1); if (strcmp(node->name, "MD") != 0) { + char *xmlmsg = xmlnode_to_str(node, NULL); purple_debug_info("msnoim", "WTF is this? %s\n", xmlmsg); - xmlnode_free(node); + g_free(xmlmsg); return; } @@ -536,8 +598,6 @@ g_free(rtime); g_free(nickname); } - - xmlnode_free(node); } /*Post to get the Offline Instant Message*/ diff -r bca58b00afab -r 7b03d95902d4 libpurple/protocols/msn/oim.h --- a/libpurple/protocols/msn/oim.h Sat Jan 12 23:26:29 2008 +0000 +++ b/libpurple/protocols/msn/oim.h Sat Jan 12 23:32:00 2008 +0000 @@ -25,9 +25,30 @@ #ifndef _MSN_OIM_H_ #define _MSN_OIM_H_ -/*OIM Retrieve SOAP Template*/ +/* OIM Retrieval Info */ #define MSN_OIM_RETRIEVE_HOST "rsi.hotmail.com" #define MSN_OIM_RETRIEVE_URL "/rsi/rsi.asmx" + +/* OIM GetMetadata SOAP Template */ +#define MSN_OIM_GET_METADATA_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMetadata" + +#define MSN_OIM_GET_METADATA_TEMPLATE ""\ +""\ + ""\ + ""\ + "%s"\ + "

%s

"\ + "
"\ + "
"\ + ""\ + ""\ + ""\ +"" + +/*OIM GetMessage SOAP Template*/ #define MSN_OIM_GET_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/GetMessage" #define MSN_OIM_GET_TEMPLATE ""\ @@ -49,7 +70,7 @@ ""\ "" -/*OIM Delete SOAP Template*/ +/*OIM DeleteMessages SOAP Template*/ #define MSN_OIM_DEL_SOAP_ACTION "http://www.hotmail.msn.com/ws/2004/09/oim/rsi/DeleteMessages" #define MSN_OIM_DEL_TEMPLATE ""\