libpurple/protocols/msn/oim.c

branch
cpw.khc.msnp14.soap
changeset 21363
343c9a27098a
parent 21362
8fd2932c4d25
child 21365
f38476babd88
child 21368
d270fe91b138
--- a/libpurple/protocols/msn/oim.c	Wed Oct 03 02:43:16 2007 +0000
+++ b/libpurple/protocols/msn/oim.c	Wed Oct 03 04:18:36 2007 +0000
@@ -28,24 +28,26 @@
 #include "oim.h"
 #include "msnutils.h"
 
-typedef struct _MsnOimSendReq MsnOimSendReq;
-
-struct _MsnOimSendReq
-{
+typedef struct _MsnOimSendReq {
 	char *from_member;
 	char *friendname;
 	char *to_member;
 	char *oim_msg;
-};
+} MsnOimSendReq;
+
+typedef struct {
+	MsnOim *oim;
+	char *msg_id;
+} MsnOimRecvData;
 
 /*Local Function Prototype*/
-static void msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid);
+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,
 										   const char* to_member,
 										   const char *msg);
 static void msn_oim_free_send_req(MsnOimSendReq *req);
-static void msn_oim_report_to_user(MsnOim *oim, const char *msg_str);
+static void msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str);
 static char *msn_oim_msg_to_str(MsnOim *oim, const char *body);
 
 /*new a OIM object*/
@@ -248,22 +250,28 @@
 msn_oim_delete_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
 	gpointer data)
 {
-	if (response) {
+	MsnOimRecvData *rdata = data;
+
+	if (response && msn_soap_xml_get(response->xml, "Body/Fault") == NULL) {
 		purple_debug_info("msnoim", "delete OIM success\n");
+		rdata->oim->oim_list = g_list_remove(rdata->oim->oim_list,
+			rdata->msg_id);
+		g_free(rdata->msg_id);
 	} else {
 		purple_debug_info("msnoim", "delete OIM failed\n");
 	}
+
+	g_free(rdata);
 }
 
 /*Post to get the Offline Instant Message*/
 static void
-msn_oim_post_delete_msg(MsnOim *oim,const char *msgid)
+msn_oim_post_delete_msg(MsnOimRecvData *rdata)
 {
+	MsnOim *oim = rdata->oim;
+	char *msgid = rdata->msg_id;
 	char *soap_body;
 
-	g_return_if_fail(oim != NULL);
-	g_return_if_fail(msgid != NULL);
-
 	purple_debug_info("MSNP14","Delete single OIM Message {%s}\n",msgid);
 
 	soap_body = g_strdup_printf(MSN_OIM_DEL_TEMPLATE,
@@ -273,7 +281,7 @@
 		msn_soap_message_new(MSN_OIM_DEL_SOAP_ACTION,
 			xmlnode_from_str(soap_body, -1)),
 		MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL,
-		msn_oim_delete_read_cb, NULL);
+		msn_oim_delete_read_cb, rdata);
 
 	g_free(soap_body);
 }
@@ -353,7 +361,7 @@
 
 /*Post the Offline Instant Message to User Conversation*/
 static void
-msn_oim_report_to_user(MsnOim *oim, const char *msg_str)
+msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str)
 {
 	MsnMessage *message;
 	char *date,*from,*decode_msg;
@@ -362,7 +370,6 @@
 	char *start,*end;
 	int has_nick = 0;
 	char *passport_str, *passport;
-	char *msg_id;
 	time_t stamp;
 
 	message = msn_message_new(MSN_MSG_UNKNOWN);
@@ -396,26 +403,23 @@
 
 	stamp = msn_oim_parse_timestamp(date);
 
-	serv_got_im(oim->session->account->gc, passport, decode_msg, 0, stamp);
+	serv_got_im(rdata->oim->session->account->gc, passport, decode_msg, 0,
+		stamp);
 
 	/*Now get the oim message ID from the oim_list.
 	 * and append to read list to prepare for deleting the Offline Message when sign out
 	 */
-	if(oim->oim_list != NULL){
-		msg_id = oim->oim_list->data;
-		msn_oim_post_delete_msg(oim,msg_id);
-		oim->oim_list = g_list_remove(oim->oim_list, oim->oim_list->data);
-		g_free(msg_id);
-	}
+	msn_oim_post_delete_msg(rdata);
 
 	g_free(passport);
+	g_free(decode_msg);
 }
 
 static void
 msn_oim_get_read_cb(MsnSoapMessage *request, MsnSoapMessage *response,
 	gpointer data)
 {
-	MsnOim *oim = data;
+	MsnOimRecvData *rdata = data;
 
 	if (response != NULL) {
 		xmlnode *msg_node = msn_soap_xml_get(response->xml,
@@ -423,9 +427,8 @@
 
 		if (msg_node) {
 			char *msg_str = xmlnode_get_data(msg_node);
-			msn_oim_report_to_user(oim, msg_str);
+			msn_oim_report_to_user(rdata, msg_str);
 			g_free(msg_str);
-			return;
 		} else {
 			char *str = xmlnode_to_str(response->xml, NULL);
 			purple_debug_info("msnoim", "Unknown response: %s\n", str);
@@ -489,7 +492,7 @@
 		}
 /*		purple_debug_info("msnoim","E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */
 
-		if (!g_list_find_custom(oim->oim_list, msgid, g_str_equal)) {
+		if (!g_list_find_custom(oim->oim_list, msgid, (GCompareFunc)strcmp)) {
 			oim->oim_list = g_list_append(oim->oim_list, msgid);
 			msn_oim_post_single_get_msg(oim, msgid);
 			msgid = NULL;
@@ -506,12 +509,16 @@
 
 /*Post to get the Offline Instant Message*/
 static void
-msn_oim_post_single_get_msg(MsnOim *oim,const char *msgid)
+msn_oim_post_single_get_msg(MsnOim *oim, char *msgid)
 {
 	char *soap_body;
+	MsnOimRecvData *data = g_new0(MsnOimRecvData, 1);
 
 	purple_debug_info("MSNP14","Get single OIM Message\n");
 
+	data->oim = oim;
+	data->msg_id = msgid;
+
 	soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE,
 		oim->session->passport_info.t, oim->session->passport_info.p, msgid);
 
@@ -519,7 +526,7 @@
 		msn_soap_message_new(MSN_OIM_GET_SOAP_ACTION,
 			xmlnode_from_str(soap_body, -1)),
 		MSN_OIM_RETRIEVE_HOST, MSN_OIM_RETRIEVE_URL,
-		msn_oim_get_read_cb, oim);
+		msn_oim_get_read_cb, data);
 
 	g_free(soap_body);
 }

mercurial