# HG changeset patch # User masca@cpw.pidgin.im # Date 1278442821 0 # Node ID 74c4aa38adfcc3935030484484f3d9728646a80c # Parent e0c374ad8fd3b2b1018afc8a5baf387bc1c16d1b Add support to ref/unref SlpMessageParts. diff -r e0c374ad8fd3 -r 74c4aa38adfc libpurple/protocols/msn/directconn.c --- a/libpurple/protocols/msn/directconn.c Tue Jul 06 18:56:58 2010 +0000 +++ b/libpurple/protocols/msn/directconn.c Tue Jul 06 19:00:21 2010 +0000 @@ -116,7 +116,7 @@ msn_message_unref(p->msg); #endif if (p->part) - msn_slpmsgpart_destroy(p->part); + msn_slpmsgpart_unref(p->part); g_free(p); } diff -r e0c374ad8fd3 -r 74c4aa38adfc libpurple/protocols/msn/msg.c --- a/libpurple/protocols/msn/msg.c Tue Jul 06 18:56:58 2010 +0000 +++ b/libpurple/protocols/msn/msg.c Tue Jul 06 19:00:21 2010 +0000 @@ -72,7 +72,7 @@ g_hash_table_destroy(msg->header_table); g_list_free(msg->header_list); - msn_slpmsgpart_destroy(msg->part); + msn_slpmsgpart_unref(msg->part); g_free(msg); } diff -r e0c374ad8fd3 -r 74c4aa38adfc libpurple/protocols/msn/slpmsg_part.c --- a/libpurple/protocols/msn/slpmsg_part.c Tue Jul 06 18:56:58 2010 +0000 +++ b/libpurple/protocols/msn/slpmsg_part.c Tue Jul 06 19:00:21 2010 +0000 @@ -17,7 +17,7 @@ part->ack_cb = msn_slpmsgpart_ack; part->nak_cb = msn_slpmsgpart_nak; - return part; + return msn_slpmsgpart_ref(part); } MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len) @@ -61,6 +61,12 @@ if (!part) return; + if (part->ref_count > 0) { + msn_slpmsgpart_unref(part); + + return; + } + g_free(part->header); g_free(part->footer); @@ -68,6 +74,30 @@ } +MsnSlpMessagePart *msn_slpmsgpart_ref(MsnSlpMessagePart *part) +{ + g_return_val_if_fail(part != NULL, NULL); + part->ref_count ++; + + return part; +} + +MsnSlpMessagePart *msn_slpmsgpart_unref(MsnSlpMessagePart *part) +{ + g_return_val_if_fail(part != NULL, NULL); + g_return_val_if_fail(part->ref_count > 0, NULL); + + part->ref_count--; + + if (part->ref_count == 0) { + msn_slpmsgpart_destroy(part); + + return NULL; + } + + return part; +} + void msn_slpmsgpart_set_bin_data(MsnSlpMessagePart *part, const void *data, size_t len) { g_return_if_fail(part != NULL); diff -r e0c374ad8fd3 -r 74c4aa38adfc libpurple/protocols/msn/slpmsg_part.h --- a/libpurple/protocols/msn/slpmsg_part.h Tue Jul 06 18:56:58 2010 +0000 +++ b/libpurple/protocols/msn/slpmsg_part.h Tue Jul 06 19:00:21 2010 +0000 @@ -8,6 +8,8 @@ struct _MsnSlpMessagePart { + int ref_count; + MsnP2PHeader *header; MsnP2PFooter *footer; @@ -25,6 +27,10 @@ void msn_slpmsgpart_destroy(MsnSlpMessagePart *part); +MsnSlpMessagePart *msn_slpmsgpart_ref(MsnSlpMessagePart *part); + +MsnSlpMessagePart *msn_slpmsgpart_unref(MsnSlpMessagePart *part); + void msn_slpmsgpart_set_bin_data(MsnSlpMessagePart *part, const void *data, size_t len); char *msn_slpmsgpart_serialize(MsnSlpMessagePart *part, size_t *ret_size);