Mercurial > pidgin.yaz
diff libpurple/protocols/msn/slpmsg_part.c @ 31285:74c4aa38adfc
Add support to ref/unref SlpMessageParts.
author | masca@cpw.pidgin.im |
---|---|
date | Tue, 06 Jul 2010 19:00:21 +0000 |
parents | 98cd0ea847ec |
children | e358e16e527f |
line wrap: on
line diff
--- 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);