# HG changeset patch # User masca@cpw.pidgin.im # Date 1274916339 0 # Node ID 0c090a41522c21443387cd3ec80969c322aec632 # Parent 1ba9f3167de088f2626c6255e41a532a2c81800e Add ref/unref support to MsnUser. diff -r 1ba9f3167de0 -r 0c090a41522c libpurple/protocols/msn/user.c --- a/libpurple/protocols/msn/user.c Wed May 26 20:01:05 2010 +0000 +++ b/libpurple/protocols/msn/user.c Wed May 26 23:25:39 2010 +0000 @@ -46,7 +46,7 @@ msn_user_set_passport(user, passport); msn_user_set_friendly_name(user, friendly_name); - return user; + return msn_user_ref(user); } /*destroy a user object*/ @@ -55,6 +55,11 @@ { g_return_if_fail(user != NULL); + if (user->refcount > 1) { + msn_user_unref(user); + return; + } + while (user->endpoints != NULL) { free_user_endpoint(user->endpoints->data); user->endpoints = g_slist_delete_link(user->endpoints, user->endpoints); @@ -94,6 +99,27 @@ g_free(user); } +MsnUser * +msn_user_ref(MsnUser *user) +{ + g_return_val_if_fail(user != NULL, NULL); + + user->refcount++; + + return user; +} + +void +msn_user_unref(MsnUser *user) +{ + g_return_if_fail(user != NULL); + + user->refcount--; + + if(user->refcount == 0) + msn_user_destroy(user); +} + void msn_user_update(MsnUser *user) { diff -r 1ba9f3167de0 -r 0c090a41522c libpurple/protocols/msn/user.h --- a/libpurple/protocols/msn/user.h Wed May 26 20:01:05 2010 +0000 +++ b/libpurple/protocols/msn/user.h Wed May 26 23:25:39 2010 +0000 @@ -79,6 +79,8 @@ { MsnUserList *userlist; + guint8 refcount; /**< The reference count of this object */ + char *passport; /**< The passport account. */ char *friendly_name; /**< The friendly name. */ @@ -154,6 +156,23 @@ */ void msn_user_destroy(MsnUser *user); +/** + * Increment the reference count. + * + * @param user The user. + * + * @return user. + */ +MsnUser * +msn_user_ref(MsnUser *user); + +/** + * Decrement the reference count. + * + * @param user The user + */ +void +msn_user_unref(MsnUser *user); /** * Updates the user.