Mercurial > pidgin
comparison libpurple/protocols/msn/oim.c @ 23670:3c0e7b05714e
Fix a leak when requesting OIM's. Also removed some unnecessary
prototypes from oim.c while I was there.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sun, 03 Aug 2008 23:55:06 +0000 |
parents | 860e5e210fc9 |
children | 1385d79ef68f |
comparison
equal
deleted
inserted
replaced
23640:58bb7fc244e4 | 23670:3c0e7b05714e |
---|---|
40 char *msg_id; | 40 char *msg_id; |
41 } MsnOimRecvData; | 41 } MsnOimRecvData; |
42 | 42 |
43 /*Local Function Prototype*/ | 43 /*Local Function Prototype*/ |
44 static void msn_parse_oim_xml(MsnOim *oim, xmlnode *node); | 44 static void msn_parse_oim_xml(MsnOim *oim, xmlnode *node); |
45 static void msn_oim_post_single_get_msg(MsnOim *oim, char *msgid); | |
46 static MsnOimSendReq *msn_oim_new_send_req(const char *from_member, | |
47 const char *friendname, | |
48 const char* to_member, | |
49 const char *msg); | |
50 static void msn_oim_free_send_req(MsnOimSendReq *req); | 45 static void msn_oim_free_send_req(MsnOimSendReq *req); |
51 static void msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str); | 46 static void msn_oim_recv_data_free(MsnOimRecvData *data); |
52 static char *msn_oim_msg_to_str(MsnOim *oim, const char *body); | 47 static void msn_oim_post_single_get_msg(MsnOim *oim, MsnOimRecvData *data); |
53 | 48 |
54 /*new a OIM object*/ | 49 /*new a OIM object*/ |
55 MsnOim * | 50 MsnOim * |
56 msn_oim_new(MsnSession *session) | 51 msn_oim_new(MsnSession *session) |
57 { | 52 { |
75 | 70 |
76 purple_debug_info("msn", "destroy the OIM %p\n", oim); | 71 purple_debug_info("msn", "destroy the OIM %p\n", oim); |
77 g_free(oim->run_id); | 72 g_free(oim->run_id); |
78 g_free(oim->challenge); | 73 g_free(oim->challenge); |
79 | 74 |
80 while((request = g_queue_pop_head(oim->send_queue)) != NULL){ | 75 while ((request = g_queue_pop_head(oim->send_queue)) != NULL) |
81 msn_oim_free_send_req(request); | 76 msn_oim_free_send_req(request); |
82 } | |
83 | |
84 g_queue_free(oim->send_queue); | 77 g_queue_free(oim->send_queue); |
85 g_list_free(oim->oim_list); | 78 |
79 while (oim->oim_list != NULL) | |
80 msn_oim_recv_data_free((MsnOimRecvData *)oim->oim_list->data); | |
86 | 81 |
87 g_free(oim); | 82 g_free(oim); |
88 } | 83 } |
89 | 84 |
90 static MsnOimSendReq * | 85 static MsnOimSendReq * |
110 g_free(req->friendname); | 105 g_free(req->friendname); |
111 g_free(req->to_member); | 106 g_free(req->to_member); |
112 g_free(req->oim_msg); | 107 g_free(req->oim_msg); |
113 | 108 |
114 g_free(req); | 109 g_free(req); |
110 } | |
111 | |
112 static MsnOimRecvData * | |
113 msn_oim_recv_data_new(MsnOim *oim, char *msg_id) | |
114 { | |
115 MsnOimRecvData *data; | |
116 | |
117 data = g_new0(MsnOimRecvData, 1); | |
118 data->oim = oim; | |
119 data->msg_id = msg_id; | |
120 | |
121 oim->oim_list = g_list_append(oim->oim_list, data); | |
122 | |
123 return data; | |
124 } | |
125 | |
126 /* Probably only good for g_list_find_custom */ | |
127 static gint | |
128 msn_recv_data_equal(MsnOimRecvData *a, const char *msg_id) | |
129 { | |
130 return strcmp(a->msg_id, msg_id); | |
131 } | |
132 | |
133 static void | |
134 msn_oim_recv_data_free(MsnOimRecvData *data) | |
135 { | |
136 data->oim->oim_list = g_list_remove(data->oim->oim_list, data); | |
137 g_free(data->msg_id); | |
138 | |
139 g_free(data); | |
115 } | 140 } |
116 | 141 |
117 /**************************************** | 142 /**************************************** |
118 * Manage OIM Tokens | 143 * Manage OIM Tokens |
119 ****************************************/ | 144 ****************************************/ |
463 msn_oim_delete_read_cb(MsnSoapMessage *request, MsnSoapMessage *response, | 488 msn_oim_delete_read_cb(MsnSoapMessage *request, MsnSoapMessage *response, |
464 gpointer data) | 489 gpointer data) |
465 { | 490 { |
466 MsnOimRecvData *rdata = data; | 491 MsnOimRecvData *rdata = data; |
467 | 492 |
468 if (response && xmlnode_get_child(response->xml, "Body/Fault") == NULL) { | 493 if (response && xmlnode_get_child(response->xml, "Body/Fault") == NULL) |
469 purple_debug_info("msn", "Delete OIM success\n"); | 494 purple_debug_info("msn", "Delete OIM success\n"); |
470 rdata->oim->oim_list = g_list_remove(rdata->oim->oim_list, | 495 else |
471 rdata->msg_id); | |
472 g_free(rdata->msg_id); | |
473 } else { | |
474 purple_debug_info("msn", "Delete OIM failed\n"); | 496 purple_debug_info("msn", "Delete OIM failed\n"); |
475 } | 497 |
476 | 498 msn_oim_recv_data_free(rdata); |
477 g_free(rdata); | |
478 } | 499 } |
479 | 500 |
480 /*Post to get the Offline Instant Message*/ | 501 /*Post to get the Offline Instant Message*/ |
481 static void | 502 static void |
482 msn_oim_post_delete_msg(MsnOimRecvData *rdata) | 503 msn_oim_post_delete_msg(MsnOimRecvData *rdata) |
643 g_free(msg_str); | 664 g_free(msg_str); |
644 } else { | 665 } else { |
645 char *str = xmlnode_to_str(response->xml, NULL); | 666 char *str = xmlnode_to_str(response->xml, NULL); |
646 purple_debug_info("msn", "Unknown OIM response: %s\n", str); | 667 purple_debug_info("msn", "Unknown OIM response: %s\n", str); |
647 g_free(str); | 668 g_free(str); |
669 msn_oim_recv_data_free(rdata); | |
648 } | 670 } |
649 } else { | 671 } else { |
650 purple_debug_info("msn", "Failed to get OIM\n"); | 672 purple_debug_info("msn", "Failed to get OIM\n"); |
651 } | 673 msn_oim_recv_data_free(rdata); |
674 } | |
675 | |
652 } | 676 } |
653 | 677 |
654 /* parse the oim XML data | 678 /* parse the oim XML data |
655 * and post it to the soap server to get the Offline Message | 679 * and post it to the soap server to get the Offline Message |
656 * */ | 680 * */ |
721 if (rt_node != NULL) { | 745 if (rt_node != NULL) { |
722 rtime = xmlnode_get_data(rt_node); | 746 rtime = xmlnode_get_data(rt_node); |
723 } | 747 } |
724 /* purple_debug_info("msn", "E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ | 748 /* purple_debug_info("msn", "E:{%s},I:{%s},rTime:{%s}\n",passport,msgid,rTime); */ |
725 | 749 |
726 if (!g_list_find_custom(oim->oim_list, msgid, (GCompareFunc)strcmp)) { | 750 if (!g_list_find_custom(oim->oim_list, msgid, (GCompareFunc)msn_recv_data_equal)) { |
727 oim->oim_list = g_list_append(oim->oim_list, msgid); | 751 MsnOimRecvData *data = msn_oim_recv_data_new(oim, msgid); |
728 msn_oim_post_single_get_msg(oim, msgid); | 752 msn_oim_post_single_get_msg(oim, data); |
729 msgid = NULL; | 753 msgid = NULL; |
730 } | 754 } |
731 | 755 |
732 g_free(passport); | 756 g_free(passport); |
733 g_free(msgid); | 757 g_free(msgid); |
736 } | 760 } |
737 } | 761 } |
738 | 762 |
739 /*Post to get the Offline Instant Message*/ | 763 /*Post to get the Offline Instant Message*/ |
740 static void | 764 static void |
741 msn_oim_post_single_get_msg(MsnOim *oim, char *msgid) | 765 msn_oim_post_single_get_msg(MsnOim *oim, MsnOimRecvData *data) |
742 { | 766 { |
743 char *soap_body; | 767 char *soap_body; |
744 MsnOimRecvData *data = g_new0(MsnOimRecvData, 1); | |
745 | 768 |
746 purple_debug_info("msn", "Get single OIM Message\n"); | 769 purple_debug_info("msn", "Get single OIM Message\n"); |
747 | 770 |
748 data->oim = oim; | 771 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, data->msg_id); |
749 data->msg_id = msgid; | |
750 | |
751 soap_body = g_strdup_printf(MSN_OIM_GET_TEMPLATE, msgid); | |
752 | 772 |
753 msn_oim_make_request(oim, FALSE, MSN_OIM_GET_SOAP_ACTION, MSN_OIM_RETRIEVE_HOST, | 773 msn_oim_make_request(oim, FALSE, MSN_OIM_GET_SOAP_ACTION, MSN_OIM_RETRIEVE_HOST, |
754 MSN_OIM_RETRIEVE_URL, xmlnode_from_str(soap_body, -1), msn_oim_get_read_cb, | 774 MSN_OIM_RETRIEVE_URL, xmlnode_from_str(soap_body, -1), msn_oim_get_read_cb, |
755 data); | 775 data); |
756 | 776 |
757 g_free(soap_body); | 777 g_free(soap_body); |
758 } | 778 } |
779 |