Mon, 04 Dec 2023 00:24:04 -0600
Updated purple_conversation_remove_member to take a PurpleContactInfo
All of the purple_conversation_*_member methods took a PurpleContactInfo except
for remove which this addresses. This makes the API more consistent and easier
to use as the protocols will generally have a PurpleContactInfo but not a
PurpleConversationMember when doing member management. That additional lookup
caused us to have to iterate the list twice where now it's only one.
Testing Done:
Ran the unit tests
Reviewed at https://reviews.imfreedom.org/r/2844/
--- a/libpurple/purpleconversation.c Fri Dec 01 03:46:44 2023 -0600 +++ b/libpurple/purpleconversation.c Mon Dec 04 00:24:04 2023 -0600 @@ -134,10 +134,10 @@ /* Remove the account from the conversation if it's a member. */ if(PURPLE_IS_ACCOUNT(priv->account)) { - member = purple_conversation_find_member(conv, - PURPLE_CONTACT_INFO(priv->account)); if(PURPLE_IS_CONVERSATION_MEMBER(member)) { - purple_conversation_remove_member(conv, member, FALSE, NULL); + purple_conversation_remove_member(conv, + PURPLE_CONTACT_INFO(priv->account), + FALSE, NULL); } } @@ -1916,32 +1916,29 @@ gboolean purple_conversation_remove_member(PurpleConversation *conversation, - PurpleConversationMember *member, - gboolean announce, const char *message) + PurpleContactInfo *info, gboolean announce, + const char *message) { + PurpleConversationMember *member = NULL; PurpleConversationPrivate *priv = NULL; guint position = 0; g_return_val_if_fail(PURPLE_IS_CONVERSATION(conversation), FALSE); - g_return_val_if_fail(PURPLE_IS_CONVERSATION_MEMBER(member), FALSE); + g_return_val_if_fail(PURPLE_IS_CONTACT_INFO(info), FALSE); - priv = purple_conversation_get_instance_private(conversation); - - if(!g_list_store_find(priv->members, member, &position)) { + if(!purple_conversation_has_member(conversation, info, &position)) { return FALSE; } - /* We need to ref member to make sure it stays around long enough for us - * to emit the signal. - */ - g_object_ref(member); + priv = purple_conversation_get_instance_private(conversation); + member = g_list_model_get_item(G_LIST_MODEL(priv->members), position); g_list_store_remove(priv->members, position); g_signal_emit(conversation, signals[SIG_MEMBER_REMOVED], 0, member, announce, message); - g_object_unref(member); + g_clear_object(&member); return TRUE; }
--- a/libpurple/purpleconversation.h Fri Dec 01 03:46:44 2023 -0600 +++ b/libpurple/purpleconversation.h Mon Dec 04 00:24:04 2023 -0600 @@ -870,12 +870,12 @@ /** * purple_conversation_remove_member: * @conversation: The instance. - * @member: The [class@Purple.ConversationMember] to remove. + * @info: The [class@Purple.ContactInfo] of the person leaving. * @announce: Whether or not this removal should be announced. * @message: (nullable): An optional message for the announcement. * - * Attempts to remove @member from the collection of members in @conversation. - * If found, @member is removed and the + * Attempts to remove @info from the collection of members in @conversation. + * If found, @info is removed and the * [signal@Purple.Conversation::member-removed] signal is emitted with * @announce and @message as parameters. * @@ -888,7 +888,7 @@ * Since: 3.0.0 */ PURPLE_AVAILABLE_IN_3_0 -gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleConversationMember *member, gboolean announce, const char *message); +gboolean purple_conversation_remove_member(PurpleConversation *conversation, PurpleContactInfo *info, gboolean announce, const char *message); /** * purple_conversation_get_messages:
--- a/libpurple/tests/test_conversation.c Fri Dec 01 03:46:44 2023 -0600 +++ b/libpurple/tests/test_conversation.c Mon Dec 04 00:24:04 2023 -0600 @@ -237,6 +237,7 @@ test_purple_conversation_members_add_remove(void) { PurpleAccount *account = NULL; PurpleContactInfo *info = NULL; + PurpleContactInfo *member_info = NULL; PurpleConversation *conversation = NULL; PurpleConversationManager *conversation_manager = NULL; PurpleConversationMember *member = NULL; @@ -292,8 +293,9 @@ g_assert_true(member1 == member); /* Now remove the member and verify the signal was called. */ - removed = purple_conversation_remove_member(conversation, member, TRUE, - "announcement message"); + member_info = purple_conversation_member_get_contact_info(member); + removed = purple_conversation_remove_member(conversation, member_info, + TRUE, "announcement message"); g_assert_true(removed); g_assert_cmpint(removed_called, ==, 1); @@ -303,8 +305,9 @@ /* Try to remove the member again and verify that nothing was removed and * that the signal wasn't emitted. */ - removed = purple_conversation_remove_member(conversation, member, TRUE, - "announcement message"); + member_info = purple_conversation_member_get_contact_info(member); + removed = purple_conversation_remove_member(conversation, member_info, + TRUE, "announcement message"); g_assert_false(removed); g_assert_cmpint(removed_called, ==, 1);