im.pidgin.pidgin.khc.msnp15: e7fbd4b111f202b3902971a9ac59e1c9f92e29d0
quantum.analyst at gmail.com
quantum.analyst at gmail.com
Sat Jan 12 19:05:44 EST 2008
-----------------------------------------------------------------
Revision: e7fbd4b111f202b3902971a9ac59e1c9f92e29d0
Ancestor: 493ccf606032f5a0aeccddca1bc2b60e02ec3f9f
Author: quantum.analyst at gmail.com
Date: 2008-01-12T23:32:00
Branch: im.pidgin.pidgin.khc.msnp15
Modified files:
libpurple/protocols/msn/oim.c libpurple/protocols/msn/oim.h
ChangeLog:
References #4382, fixes receiving too many offline messages
-------------- next part --------------
============================================================
--- libpurple/protocols/msn/oim.c 558b29fbed38b90b57e7b964b879f3ca954e6ccd
+++ libpurple/protocols/msn/oim.c 03879da43f46c40f391bae9b8dbd9cd468eddc62
@@ -41,6 +41,7 @@ typedef struct {
} 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 @@ msn_oim_free_send_req(MsnOimSendReq *req
}
/****************************************
+ * 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 @@ msn_parse_oim_msg(MsnOim *oim,const char
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 @@ msn_parse_oim_msg(MsnOim *oim,const char
g_free(rtime);
g_free(nickname);
}
-
- xmlnode_free(node);
}
/*Post to get the Offline Instant Message*/
============================================================
--- libpurple/protocols/msn/oim.h b45a4f987a968b19653f351fba2d376f873ce4dd
+++ libpurple/protocols/msn/oim.h a00cfd7e93e9ff0f28902630b09ec1f656e441fc
@@ -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 "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
+"<soap:Envelope"\
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""\
+ " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\""\
+ " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"\
+ "<soap:Header>"\
+ "<PassportCookie xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\">"\
+ "<t>%s</t>"\
+ "<p>%s</p>"\
+ "</PassportCookie>"\
+ "</soap:Header>"\
+ "<soap:Body>"\
+ "<GetMetadata xmlns=\"http://www.hotmail.msn.com/ws/2004/09/oim/rsi\" />"\
+ "</soap:Body>"\
+"</soap:Envelope>"
+
+/*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 "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
@@ -49,7 +70,7 @@
"</soap:Body>"\
"</soap:Envelope>"
-/*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 "<?xml version=\"1.0\" encoding=\"utf-8\"?>"\
More information about the Commits
mailing list